Tuesday, May 17, 2016

How to send Email using GMail with Java Mail API

I just finished with sending Email using Java Mail by connecting the Gmail SMTP.

package org.core.mail;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.AddressException;

public class SendEmailUsingGMailSMTP {
 public static void main(String[] args) throws AddressException, MessagingException {
  Properties mailServerProperties;
  Session getMailSession;
  MimeMessage generateMailMessage;
  mailServerProperties = System.getProperties();
  mailServerProperties.put("mail.smtp.port", "465");
  mailServerProperties.put("mail.smtp.socketFactory.port", "465");
  mailServerProperties.put("mail.smtp.socketFactory.class",
    "javax.net.ssl.SSLSocketFactory");
  mailServerProperties.put("mail.smtp.auth", "true");
  mailServerProperties.put("mail.smtp.starttls.enable", "true");
  System.out.println("Mail Server Properties have been setup successfully..");
 
  getMailSession = Session.getDefaultInstance(mailServerProperties, null);
  generateMailMessage = new MimeMessage(getMailSession);
  generateMailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress("to@gmail.com"));
  generateMailMessage.addRecipient(Message.RecipientType.CC, new InternetAddress("cc@gmail.com"));
  generateMailMessage.setSubject("Test Mail from Java Mail");
  String emailBody = "Test email by Java Mail JavaMail API example. " + "\n Regards, \nAdmin";
  generateMailMessage.setContent(emailBody, "text/html");
  System.out.println("Mail Session has been created successfully..");
 

  Transport transport = getMailSession.getTransport("smtp");
 
  transport.connect("smtp.gmail.com", "mail@gmail.com", "password");
  transport.sendMessage(generateMailMessage, generateMailMessage.getAllRecipients());
  transport.close();
 }
}

Please ensure the Gmail account is NOT using Gmail 2 Step Verification, and allow less secure apps to have access,

Because Java Mail works here as a Less secure App.
You can do it using following Link

https://www.google.com/settings/security/lesssecureapps


If we want to sent the HTML content Email with an attachment, try the following
package org.core.mail;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

public class SendEmailUsingGMailSMTP {
 public static void main(String[] args) throws AddressException, MessagingException, IOException {
  String emailAddress = "fromemail@gmail.com";
  String emailBody = "Test email by Java Mail using JavaMail API example. "
    + "\n Regards, \n Asker";
  //call readFile to read the HTML template file and send it through email, and attach the the image from the resourse we have. 
  //emailBody = readFile()
  sendEmail(emailAddress, emailBody);
 }

 public static void sendEmail(String emailAddress, String emailBody) throws AddressException, MessagingException, IOException {

  // Step1
  System.out.println("\n 1st ===> setup Mail Server Properties..");
  Properties mailServerProperties;
  Session mailSession;
  MimeMessage mailMessage;
  mailServerProperties = System.getProperties();
  mailServerProperties.put("mail.smtp.port", "465");
  mailServerProperties.put("mail.smtp.socketFactory.port", "465");
  mailServerProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  mailServerProperties.put("mail.smtp.auth", "true");
  mailServerProperties.put("mail.smtp.starttls.enable", "true");
  System.out.println("Mail Server Properties have been setup successfully..");

  // Step2
  System.out.println("\n\n 2nd ===> get Mail Session..");
  mailSession = Session.getDefaultInstance(mailServerProperties, null);
  mailMessage = new MimeMessage(mailSession);
  mailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(emailAddress));
  mailMessage.setSubject("Greetings from Asker..");
  System.out.println("Mail Session has been created successfully..");
  
  MimeBodyPart messageBodyPart1 = new MimeBodyPart();
  messageBodyPart1.setHeader("Content-Type", "text/html");
  DataSource dataSourceHtml= new ByteArrayDataSource(emailBody, "text/html");
  messageBodyPart1.setDataHandler(new DataHandler(dataSourceHtml));

  // 4) create new MimeBodyPart object and set DataHandler object to
  // this object
  MimeBodyPart messageBodyPart2 = new MimeBodyPart();
  
  URL url=SendEmailUsingGMailSMTP.class.getResource("lesssecure.jpg");
  DataSource source = new FileDataSource(url.getFile());
  messageBodyPart2.setDataHandler(new DataHandler(source));
  messageBodyPart2.setFileName("My Image.jpg");

  // 5) create Multipart object and add MimeBodyPart objects to this
  // object
  Multipart multipart = new MimeMultipart();
  multipart.addBodyPart(messageBodyPart1);
  multipart.addBodyPart(messageBodyPart2);
  
  mailMessage.setContent(multipart);

  // Step3
  System.out.println("\n\n 3rd ===> Get Session and Send mail");
  Transport transport = mailSession.getTransport("smtp");

  // Enter your correct gmail UserID and Password
  // if you have 2FA enabled then provide App Specific Password
  transport.connect("smtp.gmail.com", "email@gmail.com", "password");
  transport.sendMessage(mailMessage, mailMessage.getAllRecipients());
  transport.close();
 }
  private static String readFile( ) throws IOException, URISyntaxException {
      BufferedReader reader = new BufferedReader( new FileReader (new File(SendEmail.class.getResource("template.html").toURI())));
      String         line = null;
      StringBuilder  stringBuilder = new StringBuilder();
      String         ls = System.getProperty("line.separator");

      try {
          while( ( line = reader.readLine() ) != null ) {
              stringBuilder.append( line );
              stringBuilder.append( ls );
          }
          return stringBuilder.toString();
      } finally {
          reader.close();
      }
  }
}


Askerali Maruthullathil

No comments: