How to Send Email in Java Using Apache Commons
Apache commons has an email library built on top of Java Mail API. This simplifies the process of sending emails from Java programs. Apache commons email API has classes for sending HTML emails, emails with attachments or even emails with embedded images. For this article, Apache commons email version 1.4 and Java Mail version 1.5.6 is used.
In order to run these examples you need to have Java Mail API library and Apache commons email library.
- The JavaMail API library can be downloaded from here. Ensure that the downloaded javax.mail.jar is in the classpath when compiling and running the programs.
- Download the Apache commons email library from here. Extract the zip contents and ensure that the extracted jar commons-email-1.4.jar is in the Java classpath when compiling and running the following sample programs.
The following examples use the SMTP email server provided by Google for Gmail. However you can use any other SMTP email server. Don't forget to change the username and password in the following examples. When using Gmail, you may get the following error,
org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:465
To solve the above issue you need to turn on Access for less secure apps from this Google link. This requirement is specific to Gmail accounts.
Following are the configuration attributes for various email providers that you can use in the Java program using Apache commons email library. All the accounts below use the SMTP port of 465 and are SSL enabled.
Email Provider | Host name | Comments |
Gmail | smtp.gmail.com | Enable less secure access as mentioned above. |
Yahoo Mail | smtp.mail.yahoo.com | From account security tab of your yahoo account, enable allow apps that use less secure sign in. |
Sendgrid | smtp.sendgrid.net | Create an API key in Sendgrid. Use "apikey" as user name the actual API key as the password. |
Mailgun | smtp.mailgun.org | Default SMTP user name and password are available from the default domain page in Mailgun panel. If you are using free account, you can only send to authorized recipients. |
Sending Simple Text Email in Java Using Apache Commons
import org.apache.commons.mail.DefaultAuthenticator; import org.apache.commons.mail.Email; import org.apache.commons.mail.SimpleEmail; // Java program to send simple email using apache commons email // Uses the Gmail SMTP servers public class SimpleEmailSender { private static final String HOST = "smtp.gmail.com"; private static final int PORT = 465; private static final boolean SSL_FLAG = true; public static void main(String[] args) { SimpleEmailSender sender = new SimpleEmailSender(); sender.sendSimpleEmail(); } private void sendSimpleEmail() { String userName = "username@gmail.com"; String password = "password"; String fromAddress="username@gmail.com"; String toAddress = "quickprogrammer@gmail.com"; String subject = "Test Mail"; String message = "Hello from Apache Mail"; try { Email email = new SimpleEmail(); email.setHostName(HOST); email.setSmtpPort(PORT); email.setAuthenticator(new DefaultAuthenticator(userName, password)); email.setSSLOnConnect(SSL_FLAG); email.setFrom(fromAddress); email.setSubject(subject); email.setMsg(message); email.addTo(toAddress); email.send(); }catch(Exception ex){ System.out.println("Unable to send email"); System.out.println(ex); } } }
To compile and run the above programs, ensure that the Apache commons email library jar commons-email-1.4.jar and Java Mail library jar javax.mail.jar is in the same folder where Java source files are stored. Then use the following commands,
To compile in linux/mac,
To compile in Windows,
To run in linux/mac,
To run in Windows,
If you are using Gradle build system, you can use the following build.gradle for running Java programs using Apache commons email library,
apply plugin: 'java' repositories { jcenter() } dependencies { compile 'org.apache.commons:commons-email:1.4' }