Monday, May 30, 2011

Sending Email with Attachments using JavaMail

We can send emails using JavaMail API.
Instead of directly using JavaMail API here is a small utility to send emails which shields the user from JavaMail internals.

EmailConfiguration.java

package com.sivalabs.email;
import java.util.Properties;

public class EmailConfiguration
{
 private Properties properties = new Properties();
 
 public static final String SMTP_HOST = "mail.smtp.host";
 public static final String SMTP_AUTH = "mail.smtp.auth";
 public static final String SMTP_TLS_ENABLE = "mail.smtp.starttls.enable";
 public static final String SMTP_AUTH_USER = "smtp.auth.user";
 public static final String SMTP_AUTH_PWD = "smtp.auth.pwd";
 public static final String DEBUG = "debug";
 
 public Properties getProperties()
 {
  return this.properties;
 }
 
 public void setProperty(String key, String value)
 {
  this.properties.put(key, value);
 }
 
 public void addProperties(Properties props)
 {
  this.properties.putAll(props);
 }
 
 public String getProperty(String key)
 {
  return this.properties.getProperty(key);
 }
}

Email.java

package com.sivalabs.email;
import java.util.ArrayList;
import java.util.List;

public class Email 
{
 private String from;
 private String[] to;
 private String[] cc;
 private String[] bcc;
 private String subject;
 private String text;
 private String mimeType;
 private List<Attachment> attachments = new ArrayList<Attachment>();
 
 public String getFrom()
 {
  return from;
 }
 public void setFrom(String from)
 {
  this.from = from;
 }
 public String[] getTo()
 {
  return to;
 }
 public void setTo(String... to)
 {
  this.to = to;
 }
 public String[] getCc()
 {
  return cc;
 }
 public void setCc(String... cc)
 {
  this.cc = cc;
 }
 public String[] getBcc()
 {
  return bcc;
 }
 public void setBcc(String... bcc)
 {
  this.bcc = bcc;
 }
 public String getSubject()
 {
  return subject;
 }
 public void setSubject(String subject)
 {
  this.subject = subject;
 }
 public String getText()
 {
  return text;
 }
 public void setText(String text)
 {
  this.text = text;
 }
 public String getMimeType()
 {
  return mimeType;
 }
 public void setMimeType(String mimeType)
 {
  this.mimeType = mimeType;
 }
 public List<Attachment> getAttachments()
 {
  return attachments;
 }
 public void addAttachments(List<Attachment> attachments)
 {
  this.attachments.addAll(attachments);
 }
 public void addAttachment(Attachment attachment)
 {
  this.attachments.add(attachment);
 }
 public void removeAttachment(int index)
 {
  this.attachments.remove(index);
 }
 public void removeAllAttachments()
 {
  this.attachments.clear();
 }
}

Attachment.java

package com.sivalabs.email;

public class Attachment
{
 private byte[] data;
 private String filename;
 private String mimeType;
 
 public Attachment()
 {
 }
 
 public Attachment(byte[] data, String filename, String mimeType)
 {
  super();
  this.data = data;
  this.filename = filename;
  this.mimeType = mimeType;
 }

 public byte[] getData()
 {
  return data;
 }
 public void setData(byte[] data)
 {
  this.data = data;
 }
 public String getFilename()
 {
  return filename;
 }
 public void setFilename(String filename)
 {
  this.filename = filename;
 }

 public String getMimeType()
 {
  return mimeType;
 }

 public void setMimeType(String mimeType)
 {
  this.mimeType = mimeType;
 }
 
}

EmailService.java

package com.sivalabs.email;

import java.util.List;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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 EmailService 
{
 private EmailConfiguration configuration = null;
 private Authenticator auth =null;
 
 public EmailService(EmailConfiguration configuration)
 {
  this.configuration = configuration;
  this.auth = this.buildSmtpAuthenticator();     
 }
 
 private Authenticator buildSmtpAuthenticator()
 {
  String emailId = configuration.getProperty(EmailConfiguration.SMTP_AUTH_USER);
  String password = configuration.getProperty(EmailConfiguration.SMTP_AUTH_PWD);
  return new SMTPAuthenticator(emailId, password);
 }
 
 public void sendEmail(Email email)
 {
  Session session = Session.getDefaultInstance(this.configuration.getProperties(), auth);
  boolean debug = Boolean.valueOf(this.configuration.getProperty(EmailConfiguration.DEBUG));
     session.setDebug(debug);
     
     try 
     {
      Message msg = this.buildEmailMessage(session, email);
   Transport.send(msg);
  } 
     catch (MessagingException e) 
  {
   throw new RuntimeException(e);
  }     
 }
 
 private Message buildEmailMessage(Session session, Email email) throws MessagingException
 {
  Message msg = new MimeMessage(session);
     msg.setSubject(email.getSubject());
     this.addRecievers(msg, email);
     Multipart multipart = new MimeMultipart();
     this.addMessageBodyPart(multipart, email);
     this.addAttachments(multipart, email);   
        msg.setContent(multipart);
     return msg;
 }
 
 private void addRecievers(Message msg, Email email) throws MessagingException
 {
  InternetAddress from = new InternetAddress(email.getFrom());
     msg.setFrom(from);
     
     InternetAddress[] to = this.getInternetAddresses(email.getTo());
     msg.setRecipients(Message.RecipientType.TO, to);

     InternetAddress[] cc = this.getInternetAddresses(email.getCc());
     msg.setRecipients(Message.RecipientType.CC, cc);

     InternetAddress[] bcc = this.getInternetAddresses(email.getBcc());
     msg.setRecipients(Message.RecipientType.BCC, bcc);

 }
 private void addMessageBodyPart(Multipart multipart, Email email) throws MessagingException
 {
   BodyPart messageBodyPart = new MimeBodyPart();
   messageBodyPart.setContent(email.getText(), email.getMimeType());      
   multipart.addBodyPart(messageBodyPart);      
 }
 private void addAttachments(Multipart multipart, Email email) throws MessagingException
 {
  List<Attachment> attachments = email.getAttachments();
     if(attachments != null && attachments.size() > 0)
     {
      for (Attachment attachment : attachments) 
      {
       BodyPart attachmentBodyPart = new MimeBodyPart();
          String filename = attachment.getFilename() ;
          DataSource source = new ByteArrayDataSource(attachment.getData(), 
                 attachment.getMimeType());
          attachmentBodyPart.setDataHandler(new DataHandler(source));
          attachmentBodyPart.setFileName(filename);
          multipart.addBodyPart(attachmentBodyPart);
   }
     }  
 }
 private InternetAddress[] getInternetAddresses(String... addresses) 
       throws AddressException
 {
  if(addresses == null || addresses.length == 0)
  {
   return null;
  }
  InternetAddress[] iAddresses = new InternetAddress[addresses.length];
     for (int i = 0; i < addresses.length; i++)
     {
      iAddresses[i] = new InternetAddress(addresses[i]);
     }
     return iAddresses;
 }
}

class SMTPAuthenticator extends javax.mail.Authenticator
{
 private String username;
 private String password;
 
    public SMTPAuthenticator(String username, String password) {
  this.username = username;
  this.password = password;
 }
    
 public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication(username, password);
    }
}
Add the mail.jar, activation.jar to the classpath. Here is the TestClient on how to use the EmailService Utility.
package com.sivalabs.email;

public class EmailClient
{
 public static void main(String[] args)
 {
  EmailConfiguration configuration = new EmailConfiguration();
  configuration.setProperty(EmailConfiguration.SMTP_HOST, "smtp.gmail.com");
  configuration.setProperty(EmailConfiguration.SMTP_AUTH, "true");
  configuration.setProperty(EmailConfiguration.SMTP_TLS_ENABLE, "true");
  configuration.setProperty(EmailConfiguration.SMTP_AUTH_USER, "xyz@gmail.com");
  configuration.setProperty(EmailConfiguration.SMTP_AUTH_PWD, "**********");
  
  EmailService emailService = new EmailService(configuration);
  Email email = new Email();
  email.setFrom("sivaprasadreddy.k@gmail.com");
  email.setTo("sivaprasadreddy_k@yahoo.co.in");
  email.setCc("sivaprasadreddy.k@gmail.com");
  
  email.setSubject("Test Mail from SivaLabs");
  email.setText("Hi, 

This is a test email from Siva Labs

"); email.setMimeType("text/html"); Attachment attachment1 = new Attachment("ABCDEFGH".getBytes(), "test1.txt","text/plain"); email.addAttachment(attachment1); Attachment attachment2 = new Attachment("XYZZZZZZ".getBytes(), "test2.txt","text/plain"); email.addAttachment(attachment2); emailService.sendEmail(email); } }

3 comments:

  1. Hi can you please provide the code in a zip, it would be more easier to run the code in that way.

    ReplyDelete
  2. Its good for me as novice to learn.please provide code in zip

    ReplyDelete
  3. if for iso-8859-1

    MimeType:
    email.setMimeType("text/html; charset=utf-8");

    Class EmailService:
    .....
    private Message buildEmailMessage(Session session, Email email) throws MessagingException {
    // Message msg = new MimeMessage(session);
    // msg.setSubject(email.getSubject());
    // Fix for ISO by Ricardo Cabral
    MimeMessage msg = new MimeMessage(session);
    msg.setSubject(email.getSubject(), email.getCharset());
    ....

    ReplyDelete