Sunday, January 31, 2016

Sending text email from Java using Apache Commons Email

In this post, I wanted to show how to send an email using Apache Commons Email.

In this post I wanted to cover:
  • The program written in Java to send emails.
  • Challenges that I faced when sending emails.

Things one requires:

  • Eclipse.
  • Java.
  • Apache Commons Email library.
  • Two Gmail accounts (One acts as from address and one as to address) or One Gmail account (From and to address).

Apache Commons Email library can be downloaded from here: Apache Commons Email.

Configuration necessary in Eclipse before writing java program using Apache Commons Email library.

Create a Java project.
Right click on the project and choose properties.
In the properties choose Java Build Path and in Libraries tab click the button Add External Jars button on the right side.

Choose the jar that was downloaded from Apache website and add it.

Click OK and create a new Java class.

My Java class with Apache Commons Email code is as below:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.java;

import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

public class ApacheMailSample {

 public static void main(String[] args) {
  Email email = new SimpleEmail();
  email.setHostName("smtp.gmail.com");
  email.setSmtpPort(465);
  email.setAuthenticator(new DefaultAuthenticator("<sender>@gmail.com", "<sendersPass>"));
  email.setSSLOnConnect(true);
  email.setStartTLSEnabled(true);
  email.setStartTLSRequired(true);
  try {
   email.setFrom("<sender>@gmail.com");
   email.setSubject("Test email from java program");
   email.addTo("<recipient>@gmail.com");
   email.send();
  } catch (EmailException e) {
   e.printStackTrace();
  }
 }

}

In the above code, I have created an object of class SimpleEmail.

I have set host to smtp.gmail.com, smtp port to 465.

To the DefaultAuthenticator's constructor I have passed Username (from address) and Password.

According to Google, the following has to be configured to send an email.


SMTP HOST: smtp.gmail.com

SMTPPORT: 587 (465 for SSL) 
USE SSL: Optional
SMTP Auth: Login



I have used port 465 in my java program and set SSL to true using method setSSLOnConnect.

I have set TLSEnabled to true using the methods setStartTLSEnabled and setStartTLSRequired.

Using methods setFrom, setSubject, addTo one can add from address, set subject of the email, set to address respectively.

One will have to send email using method send.

Challenges that I have faced:

  • Initially I was getting AuthenticationFailedException, on my google search I found out that we have to enable access to less secure apps on from email address at this link: Less Secure Apps Setting. I had to click turn on to let my java program access the email.
  • I have initially used smtp.googlemail.com and I was getting a message, couldn't connect to smtp host with response -1. After I changed the smtp host to smtp.gmail.com I was able to send emails.
  • Without having methods setStartTLSEnabled and setStartTLSRequired, I was getting the exception AuthenticationFailedException.


After I resolved the above errors, I was able to send email successfully from one email address to another (Gmail).

Comments

blog comments powered by Disqus