Search code examples
javaemailgmailjakarta-mail

Java mail API is not sending emails


I have a mail service class which sends email using Gmail SMTP, it has been working successfully till the recent past, the same class is not able to send e-mails and I don't even see any error messages when I debug or run this code. Any idea, what is happening?

public class MailService {

public static void sendEmail(String subject, String msgBody, String[] toEmails, 
        String[] ccEmails, String[] bccEmails,
        String fromEmail, String toName){

     Properties props = System.getProperties();
        props.put("mail.smtp.starttls.enable", true); // added this line
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.user", "mygmail-id");
        props.put("mail.smtp.password", "mypassword");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", true);



        Session session = Session.getInstance(props,null);
    List<InternetAddress> toAdresses = null;
    List<InternetAddress> ccAdresses = null;
    List<InternetAddress> bccAdresses = null;
    try {
        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(fromEmail));
        toAdresses = new ArrayList<InternetAddress>();
        ccAdresses = new ArrayList<InternetAddress>();
        bccAdresses = new ArrayList<InternetAddress>();
        for(String toEmail: toEmails){
            toAdresses.add(new InternetAddress(toEmail));
        }
        if(ccEmails != null && ccEmails.length > 0)
        for(String ccEmail: ccEmails){
            ccAdresses.add(new InternetAddress(ccEmail));
        }
        if(bccEmails != null && bccEmails.length > 0)
        for(String bccEmail: bccEmails){
            bccAdresses.add(new InternetAddress(bccEmail));
        }
        msg.addRecipients(Message.RecipientType.TO,
                toAdresses.toArray(new InternetAddress[toAdresses.size()]));
        msg.addRecipients(Message.RecipientType.CC,
                ccAdresses.toArray(new InternetAddress[ccAdresses.size()]));
        msg.addRecipients(Message.RecipientType.BCC,
                bccAdresses.toArray(new InternetAddress[bccAdresses.size()]));
        msg.setSubject(subject);
        msg.setContent(msgBody, "text/html");
        Transport.send(msg);

    } catch (AddressException e) {
        e.printStackTrace();
    } catch (MessagingException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
        // ...
    }
}

Solution

  • Two things:

    As @Bill Shannon suggested, you should go with an Authenticator instead of relying on Properties alone:

    Session session = Session.getInstance(props, new Authenticator() {
    
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("my-gmail-id", "mypassword");
                }
    
            });
    

    But even then - Gmail will block your email from being sent due to security issues and gives this link for further information.