Sending email through Java with SSL / TLS authentication

The JavaMail API defines classes which represent the components of a mail system. JavaMail does not implement an email server, instead it allows you to access an email server using a Java API. In order to test the code presented, you must have access to an email server. While the JavaMail API specification does not mandate support for specific protocols, JavaMail typically includes support for POP3, IMAP, and SMTP.

How does Email Work?

Prerequisite:

  • Have access to an SMTP server. You must know the host name, port number, and security settings for your SMTP server. Web mail providers may offer SMTP access, view your email account settings or help to find further information. Be aware that your username is often your full email address and not just the name that comes before the @ symbol.
  • A Java EE IDE and Application Server such as GlassFish or Oracle WebLogic Server. JavaMail can be downloaded as a library in a Java SE application but this tutorial assumes the use of a Java EE application server which would already include JavaMail.

There are following three steps to send email using JavaMail. They are as follows:



  • Get the session object
    javax.mail.Session class provides object of session, Session.getDefaultInstance() method and Session.getInstance() method.

        // Setup mail server
        properties.setProperty("mail.smtp.host", host); 
    
        // mail username and password   
        properties.setProperty("mail.user", "user");                   
        properties.setProperty("mail.password", "password$$");           
    
  • Compose the message
    javax.mail.Transport class provides method to send the message.

    // javax.mail.internet.MimeMessage class is
    // mostly used for abstraction. 
    MimeMessage message = new MimeMessage(session);
    
    // header field of the header.  
    message.setFrom(new InternetAddress(from)); 
    message.addRecipient(Message.RecipientType.TO, 
                         new InternetAddress(to));  
    message.setSubject("subject");  
    message.setText("Hello, aas is sending email ");  
      
    
  • Send the message
    Transport.send(message);
    

Following is the Send Mail in Java using SMTP without authentication full implementation in java-

filter_none

edit
close

play_arrow

link
brightness_4
code

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
  
public class SendEmail {
      
    public static void main(String[] args)
    {
        // change below lines accordingly
        String to = "got@gmail.com"
        String from = "akash@gmail.com"
        String host = "localhost"; // or IP address
  
        // Get the session object
        // Get system properties
        Properties properties = System.getProperties(); 
  
        // Setup mail server
        properties.setProperty("mail.smtp.host", host); 
  
        // Get the default Session object
        Session session = Session.getDefaultInstance(properties); 
  
        // compose the message
        try {
  
            // javax.mail.internet.MimeMessage class 
            // is mostly used for abstraction.
            MimeMessage message = new MimeMessage(session); 
  
            // header field of the header.
            message.setFrom(new InternetAddress(from)); 
            message.addRecipient(Message.RecipientType.TO, 
                                new InternetAddress(to));
            message.setSubject("subject");
            message.setText("Hello, aas is sending email ");
  
            // Send message
            Transport.send(message);
            System.out.println("Yo it has been sent..");
        }
        catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }
}

chevron_right


Output

Yo it has been sent...

The program is simple to understand and works well, but in real life most of the SMTP servers use some sort of authentication such as TLS or SSL authentication. So, we will now see how to create Session object for these authentication protocols.

For TLS & SSL you can to know port in which the mail server running those service. I will provide you code taking gmail into consideration.

Following is the Send Mail in Java using SMTP with TLS authentication full implementation in java-

filter_none

edit
close

play_arrow

link
brightness_4
code

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
  
public class SendMail {
  
    public static void main(String[] args) {
          
        // change accordingly
        final String username = "username@gmail.com";   
          
        // change accordingly
        final String password = "password";
          
        // or IP address
        final String host = "localhost"
  
        // Get system properties
        Properties props = new Properties();             
          
        // enable authentication
        props.put("mail.smtp.auth", host);               
          
        // enable STARTTLS
        props.put("mail.smtp.starttls.enable", "true");    
          
        // Setup mail server
        props.put("mail.smtp.host", "smtp.gmail.com");     
          
        // TLS Port
        props.put("mail.smtp.port", "587");                
  
        // creating Session instance referenced to 
        // Authenticator object to pass in 
        // Session.getInstance argument
        Session session = Session.getInstance(props,
          new javax.mail.Authenticator() {
             
            //override the getPasswordAuthentication method
            protected PasswordAuthentication 
                           getPasswordAuthentication() {
                                         
                return new PasswordAuthentication(username, 
                                                 password);
            }
          });
  
        try {
              
            // compose the message
            // javax.mail.internet.MimeMessage class is 
            // mostly used for abstraction.
            Message message = new MimeMessage(session);    
              
            // header field of the header.
            message.setFrom(new InternetAddress("from-email@gmail.com")); 
              
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to-email@gmail.com"));
            message.setSubject("hello");
            message.setText("Yo it has been sent");
  
            Transport.send(message);         //send Message
  
            System.out.println("Done");
  
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

chevron_right


Following is the Send Mail in Java using SMTP with SSL authentication full implementation in java-

filter_none

edit
close

play_arrow

link
brightness_4
code

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
  
public class SendEmail {
public static void main(String[] args)
    {   
        // change accordingly
        String to = "got@gmail.com"
          
        // change accordingly
        String from = "akash@gmail.com"
          
        // or IP address
        String host = "localhost"
          
        // mail id
        final String username = "username@gmail.com"
          
        // correct password for gmail id
        final String password = "mypassword"
  
        System.out.println("TLSEmail Start");
        // Get the session object
          
        // Get system properties
        Properties properties = System.getProperties(); 
          
        // Setup mail server
        properties.setProperty("mail.smtp.host", host);
          
        // SSL Port
        properties.put("mail.smtp.port", "465"); 
          
        // enable authentication
        properties.put("mail.smtp.auth", "true"); 
          
        // SSL Factory
        properties.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");  
  
        // creating Session instance referenced to 
        // Authenticator object to pass in 
        // Session.getInstance argument
        Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                  
                // override the getPasswordAuthentication 
                // method
                protected PasswordAuthentication 
                        getPasswordAuthentication() {
                    return new PasswordAuthentication("username",
                                                    "password");
                }
            });
}
  
 //compose the message
try {
    // javax.mail.internet.MimeMessage class is mostly 
    // used for abstraction.
    MimeMessage message = new MimeMessage(session); 
      
    // header field of the header.
    message.setFrom(new InternetAddress(from));
      
    message.addRecipient(Message.RecipientType.TO, 
                          new InternetAddress(to));
    message.setSubject("subject");
    message.setText("Hello, aas is sending email ");
  
    // Send message
    Transport.send(message);
    System.out.println("Yo it has been sent..");
}
catch (MessagingException mex) {
    mex.printStackTrace();
}
}
}

chevron_right


For multiple client
We can have following changes in above code

filter_none

edit
close

play_arrow

link
brightness_4
code

// This is an array of e-mail ID. You would
// need to use InternetAddress() method 
// while specifying email IDs
void addRecipients(Message.RecipientType type, 
                        Address[] addresses) 

chevron_right


References: