Spring Boot學習筆記:JavaMailSender發送郵件
項目中經常會有這樣的需求,用戶註冊成功,需要給用戶發送一封郵件。郵件需要有一定格式和樣式。本次例子中用freemarker做樣式,其他的模版引擎類似。
首先Spring Boot項目,項目結構如下
在pom.xml文件中添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
配置發件人信息,發件人郵箱需要開通POP3/SMTP服務,如下圖(我是采用126郵箱):
然後在application.properties中添加配置文件:
然後在service層中添加MailService類,代碼如下
import freemarker.core.ParseException; import freemarker.template.MalformedTemplateNameException; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; importorg.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.util.ResourceUtils; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Service public class MailService { private final static Logger logger = LoggerFactory.getLogger(MailService.class); @Value("${spring.mail.username}") private String from; @Autowired private JavaMailSender mailSender; @Autowired private FreeMarkerConfig freeMarkerConfig; // send simple email public String sendSimple(String to, String title, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(from); message.setTo(to); message.setSubject(title); message.setText(content); mailSender.send(message); logger.info("{} send email to {}", from, to); return "SUCESS"; } // send template mail public String sendTemplateMail(String to, String title) { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(title); Map<String, Object> model = new HashMap<>(); model.put("params", from); Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); mailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); } catch (MalformedTemplateNameException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (TemplateNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return "SUCEESS"; } // send template mail with attachment public String sendAttactmentMail(String to, String title){ MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(title); // add template Map<String, Object> model = new HashMap<>(); model.put("params", from); Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); // add attachment File file = ResourceUtils.getFile("classpath:static/flcl.jpg"); helper.addAttachment(file.getName(), file); mailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); } catch (MalformedTemplateNameException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (TemplateNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return "SUCCESS"; } }
這個service中寫了三個方法,三個方法的作用分別對應於:發送簡單郵件、發送模版郵件、發送帶附件的模版郵件
核心方法是 mailSender.send(message) ,message對象根據發送的郵件類型不同而不同,主要有MimeMessage MimeMessageHelper
發送帶附件的模板郵件方式是三者中最復雜,首先創建郵件對象MimeMessage ,然後通過MimeMessage對象創建MimeMessageHelper(此對象的作用:向MimeMessage對象中填充數據的助手),通過向MimeMessageHelper對象中添加一些屬性,例如發件人、收件人、郵件主題、模版、附件。其中freemarker模板文件xxx.ftl放在resources文件夾下中template(通過FreemakrerConfig獲取xxx.ftl的Template對象,然後轉換為String),其中附件flcl.jpg放在resources文件夾中的static中(通過ResourceUtils獲取文件對象File)。屬性添加完成後,就可以發送了。
然後在controller或者其他service層中調用該方法就可以了。
補充:
message.ftl文件內容如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <h1>Send email</h1> <div>this email come from ${params}</div> </body> </html>
發送成功後,可在收件箱中收到郵件
Spring Boot學習筆記:JavaMailSender發送郵件