Spring Boot 2 集成邮件发送组件
点击蓝色“泥瓦匠BYSocket”,关注我哟 加个“星标”,不忘签到哦
作者:周立@IT牧场
GitHub:http://www.itmuch.com/spring-boot/send-email/

本文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本。
最近有童鞋问到笔者如何用Spring Boot发送邮件,故而整理下Spring Boot发送邮件的各种姿势。
说到邮件放松,相信大家对Spring Framework提供的接口 JavaMailSender 都不陌生。那么Spring Boot是否有开箱即用的邮件发送呢?
答案是肯定的。Spring Boot为发送邮件提供了starter:spring-boot-starter-mail 。
本文详细探讨如何用Spring Boot发送邮件。
一、邮箱配置
以126邮箱为例:
1 开启SMTP服务

2 设置/重置客户端授权密码

二、编码
2.1 准备工作
1 加依赖
org.springframework.boot spring-boot-starter-mail
2 写配置
spring:mail:host: smtp.126.comusername: eacdy0000@126.compassword: 上面设置的授权码
2.2 发送简单邮件
public String simple() {SimpleMailMessage message = new SimpleMailMessage();// 发件人邮箱message.setFrom(this.mailProperties.getUsername());// 收信人邮箱message.setTo("511932633@qq.com");// 邮件主题message.setSubject("简单邮件测试");// 邮件内容message.setText("简单邮件测试");this.javaMailSender.send(message);return "success";}
结果类似下图:

2.3 发送HTML邮件
简单邮件是没有样式的,很多时候,我们希望发送的邮件内容带有样式,此时可发送HTML邮件。
public String html() throws MessagingException {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(message);messageHelper.setFrom(this.mailProperties.getUsername());messageHelper.setTo("511932633@qq.com");messageHelper.setSubject("HTML内容邮件测试");// 第二个参数表示是否html,设为truemessageHelper.setText("HTML内容..
", true);this.javaMailSender.send(message);return "success";}
结果类似下图:

2.4 发送带附件的邮件
很多场景下,需要为邮件插入附件,此时该怎么办呢?继续上代码——
@GetMapping("/attach")public String attach() throws MessagingException {MimeMessage message = this.javaMailSender.createMimeMessage();// 第二个参数表示是否开启multipart模式MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);messageHelper.setFrom(this.mailProperties.getUsername());messageHelper.setTo("511932633@qq.com");messageHelper.setSubject("带附件的邮件测试");// 第二个参数表示是否html,设为truemessageHelper.setText("HTML内容..
", true);messageHelper.addAttachment("附件名称",new ClassPathResource("wx.jpg"));this.javaMailSender.send(message);return "success";}
结果类似下图:

2.5 发送带内联附件的邮件
附件 + HTML基本能满足日常工作中多数需求。但如果能将附件内联在邮件内容中,那么体验就更好啦!如何实现附件的内联呢?
@GetMapping("/inline-attach")public String inlineAttach() throws MessagingException {MimeMessage message = this.javaMailSender.createMimeMessage();// 第二个参数表示是否开启multipart模式MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);messageHelper.setFrom(this.mailProperties.getUsername());messageHelper.setTo("511932633@qq.com");messageHelper.setSubject("内联附件的邮件测试");// 第二个参数表示是否html,设为truemessageHelper.setText("HTML内容..
", true);messageHelper.addInline("attach", new ClassPathResource("wx.jpg"));this.javaMailSender.send(message);return "success";}
由代码可知,只需在想要内联的地方使用 cid:xx 引用内联附件,然后用 addInline(xx, file)指定附件即可。
2.6 发送基于Freemarker模板的邮件
上面的例子中,邮件内容是直接以字符串体现的,这通常不适合生产,因为实际项目中邮件往往带有变量。此时,可考虑使用Freemarker模板(或者其他模板,Spring Boot 2.x默认支持Freemarker、Groovy、Thymeleaf、Mustache四种模板引擎,也可根据需求使用其他模板引擎)。
•创建Freemarker模板文件mail.ftl,并将其存放在resources/templates/ 目录中
亲爱的${username}, 欢迎关注${event}
•
编码:
@GetMapping("/freemarker")public String freemarker() throws MessagingException, IOException, TemplateException {MimeMessage message = this.javaMailSender.createMimeMessage();// 第二个参数表示是否开启multipart模式MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);messageHelper.setFrom(this.mailProperties.getUsername());messageHelper.setTo("511932633@qq.com");messageHelper.setSubject("基于freemarker模板的邮件测试");Mapmodel = new HashMap<>(); model.put("username", "itmuch");model.put("event", "IT牧场大事件");String content = FreeMarkerTemplateUtils.processTemplateIntoString(this.freemarkerConfiguration.getTemplate("mail.ftl"), model);// 第二个参数表示是否html,设为truemessageHelper.setText(content, true);this.javaMailSender.send(message);return "success";}
此时,结果类似下图:

References
[1] GitHub: https://github.com/eacdy/spring-boot-study/tree/master/spring-boot-mail[2] Gitee: https://gitee.com/itmuch/spring-boot-study/tree/master/spring-boot-mail
以下专题教程也许您会有兴趣
《程序兵法:算法与数据结构》 https://www.bysocket.com/archives/2314/algorithm
《Spring Boot 2.x 系列教程》https://www.bysocket.com/springboot
《Java 核心系列教程》https://www.bysocket.com/archives/2100
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
【墙裂推荐】
最近热门内容回顾 #技术人系列

下方二维码关注我

互联网草根,坚持分享技术、创业、产品等心得和总结~

点击“阅读原文”,领取 2020 年最新免费技术资料大全
