SpringBoot開發案例之整合mail發送
記得上個月做過這樣一篇筆記,微服務架構實踐之郵件通知係統改造。
當時用的是開源的第三方插件mail和Thymeleaf做發送服務,顯然這樣子你需要配置一些東西,麻煩!!!接觸了Spring Boot以後,顯然有更好的解決方案,我們隻需要引入spring-boot-starter-mail模塊就實現了自動化配置。
好,廢話不扯,言歸正題(文中大部分是部分代碼,詳細代碼見Git)。
項目結構
引入依賴
在工程中的pom.xml中引入以下依賴:
<!-- email -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- thymeleaf 模版 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- freemarker 模版 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
application.properties中配置以下內容:
spring.mail.host=smtp.qq.com
spring.mail.username=345849402@qq.com
#授權碼g,在QQ郵箱客戶端生成 修改成自己的 設置-賬戶-開啟服務-獲取授權碼
spring.mail.password=XXXXXXX
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
#freemarker
spring.freemarker.template-loader-path=classpath:/static/template/
spring.freemarker.enabled=true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.allow-request-override=false
spring.freemarker.check-template-location=true
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
#thymeleaf
spring.thymeleaf.prefix=classpath:/static/template/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false
封裝實體
首先我們,封裝一個Email實體Email.java:
/**
* Email封裝類
* 創建者 科幫網
* 創建時間 2017年7月20日
*
*/
public class Email implements Serializable {
private static final long serialVersionUID = 1L;
//必填參數
private String email;//接收方郵件
private String subject;//主題
private String content;//郵件內容
//選填
private String template;//模板
private HashMap<String, String> kvMap;// 自定義參數
... 省略 get set
業務實現
既然用了spring,就按照spring的方式來,先定義一個接口IMailService,接著是實現MailServiceImpl。
以下代碼,實現了四種方式:純文本,富文本(圖片,附件),Freemarker模版以及Thymeleaf模版。
這裏需要注意的是,springboot 1.4.0以後 Velocity 廢棄了,官方建議用freemaker。而thymeleaf是博主自己實現的,顯然效率沒有freemaker高(評測對比見文章底部)。
@Service
public class MailServiceImpl implements IMailService {
@Autowired
private JavaMailSender mailSender;//執行者
@Autowired
public Configuration configuration;//freemarker
@Autowired
private SpringTemplateEngine templateEngine;//thymeleaf
@Value("${spring.mail.username}")
public String USER_NAME;//發送者
@Override
public void send(Email mail) throws Exception {
MailUtil mailUtil = new MailUtil();
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(USER_NAME);
message.setTo(mail.getEmail());
message.setSubject(mail.getSubject());
message.setText(mail.getContent());
mailUtil.start(mailSender, message);
}
@Override
public void sendHtml(Email mail) throws Exception {
MailUtil mailUtil = new MailUtil();
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(USER_NAME);
helper.setTo(mail.getEmail());
helper.setSubject(mail.getSubject());
helper.setText(
"<html><body><img src=\"cid:springcloud\" ></body></html>",
true);
// 發送圖片
File file = ResourceUtils.getFile("classpath:static"
+ Constants.SF_FILE_SEPARATOR + "image"
+ Constants.SF_FILE_SEPARATOR + "springcloud.png");
helper.addInline("springcloud", file);
// 發送附件
file = ResourceUtils.getFile("classpath:static"
+ Constants.SF_FILE_SEPARATOR + "file"
+ Constants.SF_FILE_SEPARATOR + "關注科幫網獲取更多源碼.zip");
helper.addAttachment("科幫網", file);
mailUtil.startHtml(mailSender, message);
}
@Override
public void sendFreemarker(Email mail) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(USER_NAME);
helper.setTo(mail.getEmail());
helper.setSubject(mail.getSubject());
Map<String, Object> model = new HashMap<String, Object>();
model.put("content", mail.getContent());
Template template = configuration.getTemplate(mail.getTemplate()+".flt");
String text = FreeMarkerTemplateUtils.processTemplateIntoString(
template, model);
helper.setText(text, true);
mailSender.send(message);
}
@Override
public void sendThymeleaf(Email mail) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(USER_NAME);
helper.setTo(mail.getEmail());
helper.setSubject(mail.getSubject());
Context context = new Context();
context.setVariable("email", mail);
String text = templateEngine.process(mail.getTemplate(), context);
helper.setText(text, true);
mailSender.send(message);
}
}
測試用例
老司機帶你去開車SpringbootMailApplication.java:
@SpringBootApplication
@ComponentScan(basePackages={"com.itstyle.mail"})
public class SpringbootMailApplication implements CommandLineRunner {
@Autowired
private IMailService mailService;
public static void main(String[] args) {
SpringApplication.run(SpringbootMailApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Email mail = new Email();
mail.setEmail("345849402@qq.com");
mail.setSubject("你個小逗比");
mail.setContent("科幫網歡迎您");
mail.setTemplate("welcome");
mailService.sendFreemarker(mail);
}
}
好了,不出意外,這四種方式應該絕對是沒問題的,小夥伴們就等著右下角彈窗窗吧。
最後,做了一個小小的評測,生成模版時間對比(1000次循環)
- Thymeleaf用時:2686ms
- Freemarker用時:498ms
對比測試,建議使用Freemarker模版。
項目:https://git.oschina.net/52itstyle/spring-boot-mail
作者: 小柒
出處: https://blog.52itstyle.com
本文版權歸作者和雲棲社區所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出, 如有問題, 可郵件(345849402@qq.com)谘詢。
最後更新:2017-07-20 23:04:15