Spring Batch Email
spring-boot-starter-mail
Spring Boot has Email feature named spring-boot-starter-mail.
build.gradle
dependencies {
compile("org.springframework.boot:spring-boot-starter-mail")
}
If you want to support attachment of email, please add java-mail
dependencies {
compile("org.springframework.boot:spring-boot-starter-mail")
compile("javax.mail:javax.mail-api")
}
Tasklet
This is simple tasklet example
@Component
@Data
public class MailTasklet implements Tasklet {
private String from;
private String to;
private String title;
private String message;
private JavaMailSender sender;
@Autowired
public MailTasklet(@Value("${app.mail.from}") final String from,
@Value("${app.mail.to}") final String to,
@Value("${app.mail.subject}") final String title,
@Value("${app.mail.message}") String message) {
this.from = from;
this.to = to;
this.title = title;
this.message = message;
this.sender = new JavaMailSenderImpl();
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
//sendMailWithAttachment(from, to, title, message);
sendMail(from, to, title, message);
return RepeatStatus.FINISHED;
}
/*
* Helpers
*/
/*
* This is without attachment
*/
private void sendMail(String from, String to, String title, String message) throws MailException {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom(from);
msg.setTo(to);
msg.setSubject(title);
msg.setText(message);
this.sender.send(msg);
}
/*
* Mail with attachment
*/
private void sendMailWithAttachment(String from, String to, String title, String message) throws MailException {
MimeMessage mimeMessage = this.sender.createMimeMessage();
try{
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(title);
helper.setText(message);
// Works!!
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("attachment.txt").getFile());
helper.addAttachment("test.txt", file);
} catch (MessagingException e) {
throw new MailParseException(e);
}
this.sender.send(mimeMessage);
}
}
The file location is resources/test.txt
Listener
@Component
public class JobEndEmailNotificationListener extends JobExecutionListenerSupport {
private String from;
private String to;
private String title;
private String message;
private JavaMailSender sender;
@Autowired
public JobEndEmailNotificationListener(@Value("${app.mail.from}") final String from,
@Value("${app.mail.to}") final String to,
@Value("${app.mail.subject}") final String title,
@Value("${app.mail.message}") String message) {
this.from = from;
this.to = to;
this.title = title;
this.message = message;
this.sender = new JavaMailSenderImpl();
}
@Override
public void afterJob(JobExecution jobExecution) {
sendMail(from, to, title, message);
System.out.println("------------Job Complete-----------------");
}
private void sendMail(String from, String to, String title, String message) throws MailException {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom(from);
msg.setTo(to);
msg.setSubject(title);
msg.setText(message);
this.sender.send(msg);
}
}
Property
To work with this code, we need properties for smtp server and default values(from, to, etc….)
resources/applicaiton.yml
spring:
mail:
host: localhost
smtp:
timeout: 5000
connectiontimeout: 5000
app:
mail:
from: daiji.ito@rakuten.com
to: daiji.ito@rakuten.com
subject: Test
message: Spring Boot Stareter Mail
How to test it
For Windows, virtual SMTP server software is very useful to test. smtp4dev
