Spring – Sending E-mail via Gmail SMTP server with MailSender

Spring comes with a useful ‘org.springframework.mail.javamail.JavaMailSenderImpl‘ class to simplify the e-mail sending process via JavaMail API. Here’s a Maven build project to use Spring’s ‘JavaMailSenderImpl‘ to send an email via Gmail SMTP server.

1. Project dependency

Add the JavaMail and Spring’s dependency.

File : pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
  http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mkyong.common</groupId>
  <artifactId>SpringExample</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>SpringExample</name>
  <url>http://maven.apache.org</url>
 
  <repositories>
  	<repository>
  		<id>Java.Net</id>
  		<url>http://download.java.net/maven/2/</url>
  	</repository>
  </repositories>
 
  <dependencies>
 
    <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>3.8.1</version>
             <scope>test</scope>
    </dependency>
 
    <!-- Java Mail API -->
    <dependency>
	    <groupId>javax.mail</groupId>
	    <artifactId>mail</artifactId>
	    <version>1.4.3</version>
    </dependency>
 
    <!-- Spring framework -->
    <dependency>
     	    <groupId>org.springframework</groupId>
	    <artifactId>spring</artifactId>
	    <version>2.5.6</version>
    </dependency>
 
  </dependencies>
</project>

2. Spring’s Mail Sender

A Java class to send email with the Spring’s MailSender interface.

File : MailMail.java

package com.mkyong.common;
 
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
 
public class MailMail
{
	private MailSender mailSender;
 
	public void setMailSender(MailSender mailSender) {
		this.mailSender = mailSender;
	}
 
	public void sendMail(String from, String to, String subject, String msg) {
 
		SimpleMailMessage message = new SimpleMailMessage();
 
		message.setFrom(from);
		message.setTo(to);
		message.setSubject(subject);
		message.setText(msg);
		mailSender.send(message);	
	}
}

3. Bean configuration file

Configure the mailSender bean and specify the email details for the Gmail SMTP server.

File : Spring-Mail.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
	<property name="host" value="smtp.gmail.com" />
	<property name="port" value="587" />
	<property name="username" value="username" />
	<property name="password" value="password" />
 
	<property name="javaMailProperties">
	   <props>
       	      <prop key="mail.smtp.auth">true</prop>
       	      <prop key="mail.smtp.starttls.enable">true</prop>
       	   </props>
	</property>
</bean>
 
<bean id="mailMail" class="com.mkyong.common.MailMail">
	<property name="mailSender" ref="mailSender" />
</bean>
 
</beans>

4. Run it

package com.mkyong.common;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App 
{
    public static void main( String[] args )
    {
    	ApplicationContext context = 
             new ClassPathXmlApplicationContext("Spring-Mail.xml");
 
    	MailMail mm = (MailMail) context.getBean("mailMail");
        mm.sendMail("[email protected]",
    		   "[email protected]",
    		   "Testing123", 
    		   "Testing only \n\n Hello Spring Email Sender");
 
    }
}

Download Source Code

Tags :

About the Author

mkyong
Founder of Mkyong.com and HostingCompass.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

  • David

    Hello,

    Would be possible to set the SMTP server dynamically? I want the user to persist this data in an embedded database once the app is deployed and, after that, configure the mailsender.

    Thank you in advance and congratulations for this great article ;)

  • subodh

    how to send emails using gwt and spring and hibernate.

  • subodh

    how to send emails using gwt and spring.

  • Shruti

    Hi,

    Thanks for this tutorial. This is really effective.
    One issue I am facing while running this code. The mail is getting delivered without the subject and from.
    Can you please let me know apart from this code do I need to do anything else.

    My Code:
    package com.cms.notification.mail;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mail.MailSender;
    import org.springframework.mail.SimpleMailMessage;

    public class SampleMail {
    @Autowired
    private MailSender mailSender;

    public void sendMail(String from, String to,String subject, String msg){

    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom(from);
    message.setTo(to);
    message.setSubject(subject);
    message.setText(msg);
    mailSender.send(message);

    System.out.println(“DONE”);
    }

    }

    Regards,
    Shruti

  • Andrey

    Hi. Error in Spring Web MVC. java.lang.NullPointerException.

            Mail mail = new Mail();
            mail.sendMail(&quot;mail@example.com&quot;, &quot;mail@example.com&quot;, &quot;Spring mail&quot;, &quot;Test mail from Spring Framework&quot;);
  • http://tanvietblog.com TanViet

    I have downloaded your source code but I see your code in this article is quite different from your code in source code. Which code should I refer?

    • http://www.mkyong.com mkyong

      May I know what are the differences? Just try run it yourself then you will know which code should follow :)

  • Baljit
  • Silvio

    Thank you dude!

  • himanshu

    nice tutorial boss

  • shilpa

    Hi I’m using javamailproperties in the mail bean. I want bounced email notification to be send to another address rather than “from” address in the mail. I’m not getting error but bounced mails are not being sent either.
    bean properties

    &lt;bean id=&quot;MailSender&quot; class=&quot;org.springframework.mail.javamail.JavaMailSenderImpl&quot;&gt;
            &lt;property name=&quot;host&quot; value=&quot;${MAIL_HOST}&quot;/&gt;
            &lt;property name=&quot;port&quot; value=&quot;${MAIL_PORT}&quot;/&gt;
            &lt;property name=&quot;javaMailProperties&quot;&gt;
                &lt;props&gt;
                    &lt;prop key=&quot;mail.debug&quot;&gt;true&lt;/prop&gt;
                    &lt;prop key=&quot;mail.transport.protocol&quot;&gt;smtp&lt;/prop&gt;
                    &lt;!--prop key=&quot;mail.smtp.auth&quot;&gt;false&lt;/prop--&gt;
                    &lt;prop key=&quot;mail.smtp.starttls.enable&quot;&gt;false&lt;/prop&gt;
                    &lt;prop key=&quot;mail.smtp.from&quot;&gt;[email protected]&lt;/prop&gt;
                &lt;/props&gt;
            &lt;/property&gt;
        &lt;/bean&gt;

    java mail sender is

    public void sendMail(final MailBean p_mailBean) {
            MimeMessagePreparator l_preparator = new MimeMessagePreparator() {
     
                public void prepare(MimeMessage p_msg) throws Exception {
                    //p_msg.setHeader(&quot;Return-Path&quot;, &quot;&lt;[email protected]&gt;&quot;);
     
                    p_msg.setRecipient(RecipientType.TO, new InternetAddress(p_mailBean.getRecipient()));                  
                    if (p_mailBean.getFrom() != null &amp;&amp; !&quot;&quot;.equals(p_mailBean.getFrom())) {
                        p_msg.setFrom(new InternetAddress(p_mailBean.getFrom()));
                    } else {
                        p_msg.setFrom(new InternetAddress(getFromAddress()));
                    }
                    p_msg.setSubject(p_mailBean.getSubject());
                    p_msg.setContent(p_mailBean.getText(), &quot;text/html&quot;);
                }
            };
            try {            
                this.mailSender.send(l_preparator);
            } catch (MailException me) {
                System.out.println(&quot;exception occurred&quot;);
                me.printStackTrace();
                //Doesn't rethrow the exception
                logger.error(&quot;Error sending mail to &quot; + p_mailBean.getRecipient(), me);
                logger.error(StackTraceHandler.getTrace(me));
            }
        }

    can you help me find what is the problem please? I’ve been working on this for 2 days now :(
    Thank you

  • Rohit

    Nice work mkong!!! Keep it coming

  • Petri

    Hi,

    i just followed your tutorial and got a “org.springframework.mail.MailAuthenticationException” but managed to solve it. Problem was that freshly created gmail -account is blocked somehow, tried with my own personal account and problem was gone.

  • Ankit Kothana

    code works fine but mail is not recieved at the other hand. please help..

  • patric

    I getting the error as below when I am trying the send the email via the spring mvc framework. I could not figure out the problem. Can anyone help me with the solution?

    Is the below error meant that I cant access the smtp of the gmail host?

    DEBUG: JavaMail version 1.4.3
    DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
    DEBUG: Tables of loaded providers
    DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
    DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
    DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
    DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
    DEBUG SMTP: useEhlo true, useAuth true
    DEBUG SMTP: trying to connect to host “smtp.gmail.com”, port 25, isSSL false

  • Koushik Roy

    Is there any way to know whether the email has been successfully delivered or not. I meant to say whether any bounce back message is there?

  • Pingback: Spring and Hibernate » Agile Mobile Developer()

  • Just another name

    Thanks a lot, it was really useful. There is a

    simpleMailMessage

    in the project that can be downloaded which isn’t really used (and it’s not used in the example on this page), you may want to delete in there.

  • KN (Karunakar Neravetla)

    Do you know how to get a delivery notificaiton of an email sent by using JavaMailSenderImpl.

    I have tried to set the following properties and tried, but it doesn’t work.

    true
    true
    true
    ISO-8859-1
    “SUCCESS, FAILURE ORCPT=rfc822;[email protected]
    HDRS

  • Bharat

    Great Tutorial !!! Thanks Mkyoung !

  • GAURAV SINGH

    is it work for port=465 for secure connection

  • Ludvianto Ovandi
    org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
      nested exception is:
    	java.net.ConnectException: Connection refused: connect. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
      nested exception is:
    	java.net.ConnectException: Connection refused: connect; message exception details (1) are:
    Failed message 1:
    javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
      nested exception is:
    	java.net.ConnectException: Connection refused: connect
    	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391)
    • Ludvianto Ovandi

      Why they call localhost with port 25 ??

    • http://www.mkyong.com mkyong

      Make sure you set this correctly, Gmail post is 587

      &lt;property name=&quot;port&quot; value=&quot;587&quot; /&gt;
  • Dinesh

    I have done above example but its giving runtime exeception as:

    Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. xu6sm19670673igb.7

  • Pingback: Java: Send Mail Gagal? «()

  • CK

    Thanks for you example.

    BTW, does anyone know can we use this for commercial purpose? Does it violate any Gmail’s rules?

    • http://www.mkyong.com mkyong

      Contact Gmail team for more information.

  • ramesh

    Nice tutorial,

    • ramesh

      i want to insert hyperlink in mail, how to do it with spring please tell me any one knows….

  • jaime

    cool!

  • Pingback: Spring Tutorials()

  • Sertac

    I’m getting following error please help :(

    nested exception is javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;
    Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;
      nested exception is:
    	java.net.ConnectException: Connection refused: connect
    	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706)
    	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
    	at javax.mail.Service.connect(Service.java:291)
    	at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389)
    	... 9 more
    Caused by: java.net.ConnectException: Connection refused: connect
    	at java.net.PlainSocketImpl.socketConnect(Native Method)
    	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    	at java.net.Socket.connect(Socket.java:529)
    	at java.net.Socket.connect(Socket.java:478)
    	at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:284)
    	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:227)
    	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1672)
    	... 12 more

    Process finished with exit code 1

    Thanks.

    • http://www.mkyong.com mkyong

      Are you behind Firewall or proxy? Make sure your network didn’t blocked smtp.gmail.com and port 587. Often time, your company just blocked anything but port 80.

      • Sertac

        Yes you are right after turn off the firewall sample code worked.
        Thanks.

      • taburiss_m

        good?very gook?I use the Macfee and it intercept?so it is always error?

  • Chathuranga Withana

    Nice tutorial…. it works…

    How can i set proxy settings here, to send emails through network that uses a proxy server?

    Thanks!

  • anilkumar

    Hi,

    Nice tutorail, but
    org.springframework.mail.MailSender
    is not resolved

    Where I can get jar…?

    • http://www.mkyong.com mkyong

      MailSender is belong to Spring core, see Maven dependencies below

          <!-- Java Mail API -->
          <dependency>
      	    <groupId>javax.mail</groupId>
      	    <artifactId>mail</artifactId>
      	    <version>1.4.3</version>
          </dependency>
       
          <!-- Spring framework -->
          <dependency>
           	    <groupId>org.springframework</groupId>
      	    <artifactId>spring</artifactId>
      	    <version>2.5.6</version>
          </dependency>
  • http://www.viniciusdepaula.com/blog Vinidog

    Nice tuto guy!!!

    Tks a lot ;-)

  • Pingback: Spring – Define an E-mail template in bean configuration file | Spring()