武培轩

推荐搜索

SpringBootSpringJavaMySQLRedisElasticsearch

最近在项目开发中有向使用者发送报警通知的功能,其中报警媒介就包括邮件,这篇文章就简单介绍了 Spring Boot 如何快速集成实现邮件发送。
通常在实际项目中,也有其他很多地方会用到邮件发送,比如通过邮件注册账户/找回密码,通过邮件发送订阅信息等等。

开发前准备

下面以 QQ 邮箱为例,其他的邮箱的配置也大同小异。

登录 QQ 邮箱,点击设置->账户,开启IMAP/SMTP服务,并生成授权码。

Spring Boot 优雅地发送邮件_第1张图片

在这里插入图片描述
准备工作做好后,就开始进行项目实战吧!

Spring Boot 集成邮件发送

Spring Boot 集成邮件发送主要分为以下三步:

  1. 加入依赖
  2. 配置邮件
  3. 演示邮件发送

加入依赖

首先创建一个 Spring Boot 项目,然后在 pom.xml 加入如下依赖(其中 thymeleaf 是为了发送模版邮件):


    org.springframework.boot
    spring-boot-starter-mail


    org.springframework.boot
    spring-boot-starter-thymeleaf

创建邮件配置

在配置文件 application.properties 中配置邮件的相关参数,具体内容如下:

# 使用 smtp 协议
spring.mail.protocol = smtp
spring.mail.host = smtp.qq.com
spring.mail.port = 587
spring.mail.username = [email protected]
# 授权码
spring.mail.password = yourauthorizationcode
spring.mail.test-connection = false
spring.mail.properties.mail.smtp.auth = false
spring.mail.properties.mail.debug = false
spring.mail.properties.mail.mime.splitlongparameters = false
spring.mail.default-encoding = UTF-8

其中指定了邮件的协议、端口以及邮件账户和授权码等。

服务类

在这里主要介绍发送简单邮件、模板等操作,在 service 包下创建 Mailervice 类。

发送简单邮件

首先注入 JavaMailSender,然后构造 SimpleMailMessage ,调用 javaMailSender 的 send 方法就可以完成简单的邮件发送,具体代码如下所示:

public void sendSimpleMail(String from, String to, String subject, String text) {
 SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
 // 发件人
 simpleMailMessage.setFrom(from);
 // 收件人
 simpleMailMessage.setTo(to);
 // 邮件主题
 simpleMailMessage.setSubject(subject);
 // 邮件内容
 simpleMailMessage.setText(text);
 javaMailSender.send(simpleMailMessage);
}

编写对应的 Controller 层,代码如下:

@GetMapping("/sendSimpleMail")
public void sendSimpleMail() {
 mailService.sendSimpleMail("[email protected]",
   "[email protected]",
   "欢迎关注微信公众号「武培轩」",
   "感谢你这么可爱,这么优秀,还来关注我,关注了就要一起成长哦回复【资料】领取优质资源!");
}

调用发送简单邮件接口后,就可以在 QQ 邮箱中收到邮件:

Spring Boot 优雅地发送邮件_第2张图片

发送复杂邮件
虽然简单的纯文本邮件已经基本够用了,但是有的时候,也需要很多样式来丰富邮件,接下来就来演示下发送复杂邮件(文本+图片+附件)。
首先使用 javaMailSender 创建一个 MimeMessage 实例,用 MimeMessageHelper 设置开启内嵌和附件功能,然后通过 addInline 方法嵌入图片(其中 logo 需要与 text 中的 cid 对应起来),addAttachment 方法添加附件,具体代码如下:

public ResponseEntity sendMimeMail(String from, String to, String subject, String text) {
 MimeMessage mimeMessage = javaMailSender.createMimeMessage();
 try {
  MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
  helper.setFrom(from);
  helper.setTo(to);
  helper.setSubject(subject);
  // 设置邮件内容,第二个参数设置是否支持 text/html 类型
  helper.setText(text, true);
  helper.addInline("logo", new ClassPathResource("img/logo.jpg"));
  helper.addAttachment("logo.pdf", new ClassPathResource("doc/logo.pdf"));
  javaMailSender.send(mimeMessage);
  return ResponseEntity.status(HttpStatus.CREATED).body("发送成功");
 } catch (MessagingException e) {
  e.printStackTrace();
  return ResponseEntity.status(HttpStatus.NOT_FOUND).body("e.getMessage()");
 }
}

编写对应的 Controller 层,代码如下:

@GetMapping("/sendMimeMail")
public ResponseEntity sendMimeMail() {
 return mailService.sendMimeMail("[email protected]",
   "[email protected]",
   "欢迎关注微信公众号「武培轩」",
   "

感谢你这么可爱,这么优秀,还来关注我,关注了就要一起成长哦~~


" + "回复【资料】领取优质资源!
" + ""); }

调用发送复杂邮件接口后,就可以在 QQ 邮箱中收到邮件:

发送模板邮件
Java 的模板引擎有许多,在这里使用的是 Thymeleaf,注入 TemplateEngine,使用它来解析模版,然后将返回的字符串作为内容发送,具体代码如下:

public ResponseEntity sendTemplateMail(String from, String to, String subject, Context context) {
 MimeMessage message = javaMailSender.createMimeMessage();
 try {
  MimeMessageHelper helper = new MimeMessageHelper(message, true);
  helper.setFrom(from);
  helper.setTo(to);
  helper.setSubject(subject);
  // 解析邮件模板
  String text = templateEngine.process("mailTemplate", context);
  helper.setText(template, true);
  javaMailSender.send(message);
  return ResponseEntity.status(HttpStatus.CREATED).body("发送成功");
 } catch (Exception e) {
  e.printStackTrace();
  return ResponseEntity.status(HttpStatus.NOT_FOUND).body("e.getMessage()");
 }
}

编写对应的 Controller 层,代码如下:

@GetMapping("/sendTemplateMail")
public ResponseEntity sendTemplateMail() {
 Context context = new Context();
 context.setVariable("username", "武培轩");
 return mailService.sendTemplateMail("[email protected]",
   "[email protected]",
   "欢迎关注微信公众号「武培轩」",
   context);
}

调用发送模板邮件接口后,就可以在 QQ 邮箱中收到邮件:

Spring Boot 优雅地发送邮件_第3张图片

**总结


**
本文的完整代码在 https://github.com/wupeixuan/SpringBoot-Learn 的 mail 目录下。
Spring Boot 集成邮件发送还是比较简单的,大家可以下载项目源码,自己在本地运行调试这个项目,更好地理解如何在 Spring Boot 中开发邮件服务。
留言讨论
最好的关系就是互相成就,大家的点赞、在看、分享、留言就是我创作的最大动力。

参考
https://github.com/wupeixuan/SpringBoot-Learn


●Spring Boot 集成 Redis 实现数据缓存
●Spring Boot 集成阿里云 OSS 进行文件存储
●Spring Boot 集成 Elasticsearch 实战

Spring Boot 优雅地发送邮件_第4张图片

武培轩
有帮助?在看,转发走一波
喜欢作者