spring boot 2 (springboot2读写分离)

最近有童鞋问到笔者如何用Spring Boot发送邮件,故而整理下Spring Boot发送邮件的各种姿势。

说到邮件放松,相信大家对Spring Framework提供的接口 JavaMailSender都不陌生。那么Spring Boot是否有开箱即用的邮件发送呢?答案是肯定的。Spring Boot为发送邮件提供了starter:spring-boot-starter-mail

本文详细探讨如何用Spring Boot发送邮件。

一、邮箱配置

以126邮箱为例:

1 开启SMTP服务

springboot2日志怎么设置,springboot2读写分离

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

springboot2日志怎么设置,springboot2读写分离

二、编码

2.1 准备工作

1 加依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2 写配置

spring:
 mail:
 host: smtp.126.com

 username: eacdy0000@126.com

 password: 上面设置的授权码

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";
}

结果类似下图:

springboot2日志怎么设置,springboot2读写分离

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,设为true
 messageHelper.setText("<h1>HTML内容..</h1>", true);

 this.javaMailSender.send(message);
 return "success";
}

结果类似下图:

springboot2日志怎么设置,springboot2读写分离

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,设为true
 messageHelper.setText("<h1>HTML内容..</h1>", true);
 messageHelper.addAttachment("附件名称",
 new ClassPathResource("wx.jpg"));

 this.javaMailSender.send(message);
 return "success";
}

结果类似下图:

springboot2日志怎么设置,springboot2读写分离

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,设为true
 messageHelper.setText("<h1>HTML内容..<img src=\"cid:attach\"/></h1>", true);
 messageHelper.addInline("attach", new ClassPathResource("wx.jpg"));

 this.javaMailSender.send(message);
 return "success";
}

由代码可知,只需在想要内联的地方使用 cid:xx引用内联附件,然后用addInline(xx, file)指定附件即可。两处的xx必须一致。

结果类似下图:

springboot2日志怎么设置,springboot2读写分离

2.6 发送基于Freemarker模板的邮件

上面的例子中,邮件内容是直接以字符串体现的,这通常不适合生产,因为实际项目中邮件往往带有变量。此时,可考虑使用Freemarker模板(或者其他模板,Spring Boot 2.x默认支持Freemarker、Groovy、Thymeleaf、Mustache四种模板引擎,也可根据需求使用其他模板引擎)。

创建Freemarker模板文件mail.ftl,并将其存放在resources/templates/目录中

<h1>亲爱的${username}, 欢迎关注${event}</h1>

编码:

@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模板的邮件测试");

 Map<String, Object> model = new HashMap<>;
 model.put("username", "itmuch");
 model.put("event", "IT牧场大事件");

 String content = FreeMarkerTemplateUtils.processTemplateIntoString(
 this.freemarkerConfiguration.getTemplate("mail.ftl"), model);

 // 第二个参数表示是否html,设为true
 messageHelper.setText(content, true);

 this.javaMailSender.send(message);
 return "success";
}

此时,结果类似下图:

springboot2日志怎么设置,springboot2读写分离

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