Learn how to send email in spring boot applications with the help of JavaMailSender
for sending simple emails as well as emails with attachments.
Table of Contents 1. Maven 2. SMTP configuration 3. Pre-configured email templates 4. Send simple email 5. Send email with attachment 6. Send email with inline images 7. Demo
1. Maven
In Spring boot application, include spring-boot-starter-mail dependency.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> </dependencies>
2. SMTP configuration
With spring boot, we can configure SMTP settings in application.properties
file.
2.1. Gmail
debug=true spring.mail.host=smtp.gmail.com spring.mail.port=25 spring.mail.username=admin@gmail.com spring.mail.password=xxxxxx # Other properties spring.mail.properties.mail.debug=true spring.mail.properties.mail.transport.protocol=smtp spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.connectiontimeout=5000 spring.mail.properties.mail.smtp.timeout=5000 spring.mail.properties.mail.smtp.writetimeout=5000 # TLS , port 587 spring.mail.properties.mail.smtp.starttls.enable=true # SSL, post 465 #spring.mail.properties.mail.smtp.socketFactory.port = 465 #spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory
To be able to use two factor authentication as well as keep the “allow less secure apps” option off, it is highly recommended to use an app password instead of the Gmail password.
Feel free to use below below SMTP servers, incase you have access to them.
2.2. Outlook
Find this information from your admin incase it is some corporate server.
spring.mail.host=smtp-mail.outlook.com spring.mail.port=587 spring.mail.username=outlookuserid@outlook.com spring.mail.password=xxxxxx spring.mail.properties.mail.protocol=smtp spring.mail.properties.mail.tls=true spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.ssl.trust=smtp-mail.outlook.com
2.3. AWS SES
Find relevant configuration from your AWS settings page. [Read More]
spring.mail.host=email-smtp.us-east-1.amazonaws.com spring.mail.port=465 spring.mail.username=xxxxxxxxxxx spring.mail.password=xxxxxxxxxxx spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.ssl.enavle=true spring.mail.properties.mail.protocol=smtps spring.mail.properties.mail.smtps.auth=true
3. Pre-configured email templates
We can create email templates to reuse every time – we have to send an email periodically or on any specific event or duration. In given example, we are creating a very simple text only email using SimpleMailMessage.
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mail.SimpleMailMessage; @Configuration public class EmailConfig { @Bean public SimpleMailMessage emailTemplate() { SimpleMailMessage message = new SimpleMailMessage(); message.setTo("user@gmail.com"); message.setFrom("admin@gmail.com"); message.setSubject("Important email"); message.setText("FATAL - Application crash. Save your job !!"); return message; } }
4. Send simple email
To send emails of different types, we have created an EmailService
class which can take required parameters to set in emails before sending them.
@Service("emailService") public class EmailService { @Autowired private JavaMailSender mailSender; @Autowired private SimpleMailMessage preConfiguredMessage; /** * This method will send compose and send the message * */ public void sendMail(String to, String subject, String body) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(body); mailSender.send(message); } /** * This method will send a pre-configured message * */ public void sendPreConfiguredMail(String message) { SimpleMailMessage mailMessage = new SimpleMailMessage(preConfiguredMessage); mailMessage.setText(message); mailSender.send(mailMessage); } }
5. Send email with attachment
Multimedia emails are send using MimeMessageHelper which is used to configure MimeMessage
. These mime messages are rich text emails.
@Autowired private JavaMailSender mailSender; public void sendMailWithAttachment(String to, String subject, String body, String fileToAttach) { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); mimeMessage.setFrom(new InternetAddress("admin@gmail.com")); mimeMessage.setSubject(subject); mimeMessage.setText(body); FileSystemResource file = new FileSystemResource(new File(fileToAttach)); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.addAttachment("logo.jpg", file); } }; try { mailSender.send(preparator); } catch (MailException ex) { // simply log it and go on... System.err.println(ex.getMessage()); } }
6. Send email with inline images
Rich text include media content in between text content. To do so in emails, we have to use MimeMessageHelper
‘s addInline() method.
@Autowired private JavaMailSender mailSender; public void sendMailWithInlineResources(String to, String subject, String fileToAttach) { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); mimeMessage.setFrom(new InternetAddress("admin@gmail.com")); mimeMessage.setSubject(subject); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setText("<html><body><img src='cid:identifier1234'></body></html>", true); FileSystemResource res = new FileSystemResource(new File(fileToAttach)); helper.addInline("identifier1234", res); } }; try { mailSender.send(preparator); } catch (MailException ex) { // simply log it and go on... System.err.println(ex.getMessage()); } }
7. Spring boot send email demo
To send emails using above configuration, please update the spring.mail.username
and spring.mail.password
properties in application.properties file.
Now execute EmailService
‘s method to send emails.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application implements CommandLineRunner { @Autowired private EmailService emailService; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) { emailService.sendMail("lokeshgupta1981@gmail.com", "Hi", "Ho ho ho"); emailService.sendPreConfiguredMail("Ho ho ho"); } }
Drop me your questions related to sending emails with spring boot.
Happy Learning !!