经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
SpringBoot实现邮件发送功能的姿势分享
来源:jb51  时间:2021/8/4 11:26:58  对本文有异议

前言

邮件发送,在实际的项目开发中,可能用的不是特别多,如果没有特定的需求,相信也没有多少小伙伴会特意的去关注,那么如果现在我们希望针对项目做一个异常的报警系统,当出现异常的时候,可以向指定的小伙伴发送邮件提醒,那么让我们来实现这个功能,可以怎么办呢?

这里介绍一下如何使用SpringBoot封装好的MailSender来实现邮件发送

I. 项目环境

1. 项目依赖

本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

开一个web服务用于测试

  1. <dependencies>
  2. <!-- 邮件发送的核心依赖 -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-mail</artifactId>
  6. </dependency>
  7. <!-- 适用于html模板形式的邮件发送,借助freemarker来实现html模板渲染 -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-freemarker</artifactId>
  11. </dependency>
  12. </dependencies>

2. 配置

在开始之前,我们需要先准备一个用于发送邮件的账号,比如我这里使用163的邮箱来发送邮件,需要先到邮箱提供商哪里获取授权码,具体如何获取这个东西,不同的邮箱姿势有些不同,各位小伙伴根据自己的实际情况,搜索一下,相信很快就能get到

这里简单介绍下网易邮箱的获取方式

接下来设置发送邮件相关的配置信息,配置文件application.yml

  1. spring:
  2. #邮箱配置
  3. mail:
  4. host: smtp.163.com
  5. from: xhhuiblog@163.com
  6. # 使用自己的发送方用户名 + 授权码填充
  7. username:
  8. password:
  9. default-encoding: UTF-8
  10. properties:
  11. mail:
  12. smtp:
  13. auth: true
  14. starttls:
  15. enable: true
  16. required: true

II. 邮件发送

接下来进入正题,我们将从简单基础的文本邮件发送开始,逐渐介绍如何添加附件,使用漂亮的html模板等

1. 简单文本邮件发送

我们这里直接使用JavaMailSender来发送一个基础的文本邮件

  1. @Service
  2. public class MailDemo {
  3. @Autowired
  4. private JavaMailSender javaMailSender;
  5.  
  6. @Value("${spring.mail.from:xhhuiblog@163.com}")
  7. private String from;
  8.  
  9. private void basicSend() {
  10. SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
  11. //邮件发送人
  12. simpleMailMessage.setFrom(from);
  13. //邮件接收人,可以是多个,参数为可变参数
  14. simpleMailMessage.setTo("bangzewu@126.com");
  15. //邮件主题,也就是标题
  16. simpleMailMessage.setSubject("SpringBoot测试邮件发送");
  17. //邮件内容
  18. simpleMailMessage.setText("简单的邮件正文");
  19.  
  20. javaMailSender.send(simpleMailMessage);
  21. }
  22. }
  • JavaMailSender: 直接作为一个Spring 的bean对象使用
  • SimpleMailMessage:简单的邮件对象,里面有一些邮件发送时,关联的基础信息
    • from: 发送方
    • replyTo: 邮件回复的收件人
    • to: 收件人
    • cc: 抄送
    • bcc: 密送
    • subject: 主题,也就是邮件标题
    • text: 邮件正文,文本格式
    • date: 邮件发送时间

2. html发送

对于简单的文本邮件发送,用上面的基本就够了,如果我们希望邮件的内容更美观一点的话,可以借助HTML来实现排版
区别于上面的SimpleMailMessage, 这里使用的是MimeMessage,来实现html内容发送

使用姿势与上面相比差不多,无非就是正文变成了html文本罢了

  1. /**
  2. * 发送html
  3. */
  4. public void sendHtml() throws MessagingException {
  5. MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
  6. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
  7. mimeMessageHelper.setFrom(from);
  8. mimeMessageHelper.setTo("bangzewu@126.com");
  9. mimeMessageHelper.setSubject("SpringBoot测试邮件发送");
  10.  
  11. //邮件内容
  12. mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
  13. "<div> 欢迎点击 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" +
  14. " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" +
  15. "</div>", true);
  16.  
  17. javaMailSender.send(mimeMailMessage);
  18. }

重点注意

注意上面的setText方法的第二个参数,必须有,且为true,否则会当成文本内容发送

3. 添加附件

邮件中添加附件,我们自己写邮件的时候可以直接选择附件上传,那么代码的实现方式又有什么区别呢?

  1. /**
  2. * 发送附件
  3. */
  4. public void sendWithFile() throws MessagingException, IOException {
  5. MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
  6. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
  7. mimeMessageHelper.setFrom(from);
  8. mimeMessageHelper.setTo("bangzewu@126.com");
  9. mimeMessageHelper.setSubject("SpringBoot测试邮件发送");
  10.  
  11. mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
  12. "<div> 欢迎点击 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" +
  13. " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" +
  14. "</div>");
  15.  
  16. String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg";
  17. URL imgUrl = new URL(url);
  18. mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream);
  19.  
  20. javaMailSender.send(mimeMailMessage);
  21. }

注意上面的实现,与前面差别不大,关键点在于attachment附件,上面的实现是在附件中添加一个图片,为了简单起见,图片是直接从网络下载的,然后将Stream作为传参

4. Freemaker模板

上面的html发送,会发现需要我们自己来组装html正文,这个操作可能就不是很美好了,借助页面渲染引擎来实现邮件模板支持,可以说是一个比较常见的方案了,这里简单介绍下Freemaker的实现姿势,至于themlaf, beef或者jsp啥的,都没有太大的区别

首先写一个邮件模板 resources/template/mail.ftl

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <meta name="description" content="SpringBoot thymeleaf"/>
  7. <meta name="author" content="YiHui"/>
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  9. <title>邮件模板</title>
  10. </head>
  11. <style>
  12. .title {
  13. color: #c00;
  14. font-weight: normal;
  15. font-size: 2em;
  16. }
  17.  
  18. .content {
  19. color: darkblue;
  20. font-size: 1.2em;
  21. }
  22.  
  23. .sign {
  24. color: lightgray;
  25. font-size: 0.8em;
  26. font-style: italic;
  27. }
  28. </style>
  29. <body>
  30.  
  31. <div>
  32. <div class="title">${title}</div>
  33. <div class="content">${content}</div>
  34. </div>
  35. </body>
  36. </html>

上面的模板中,定义了两个变量,一个title,一个content,这个就是我们需要替换的值

接下来是邮件发送实例

  1. import freemarker.template.Configuration;
  2.  
  3. @Autowired
  4. private Configuration configuration;
  5.  
  6. /**
  7. * freemarker 模板
  8. */
  9. public void freeMakerTemplate() throws MessagingException, IOException, TemplateException {
  10. MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
  11. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
  12. mimeMessageHelper.setFrom(from);
  13. mimeMessageHelper.setTo("bangzewu@126.com");
  14. mimeMessageHelper.setSubject("SpringBoot测试邮件发送");
  15.  
  16. Map<String, Object> map = new HashMap<>();
  17. map.put("title", "邮件标题");
  18. map.put("content", "邮件正文");
  19. String text = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), map);
  20. mimeMessageHelper.setText(text, true);
  21.  
  22. String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg";
  23. URL imgUrl = new URL(url);
  24. mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream);
  25.  
  26. javaMailSender.send(mimeMailMessage);
  27. }

注意上面的实现,关键点就利用FreeMarkerTemplateUtils来实现模板的渲染,输出html正文,因此如果想使用其他的模板渲染引擎,就是改这里即可

5. 测试与小结

最后简单的调用一下上面的实现,看下邮件是否可以发送成功

本篇博文介绍了一下如何发送邮件,并针对简单的文本邮件,html正文,附件等不同的给出了实例;整体看下来使用姿势不难,不过邮件的几个术语可以了解一下

  • to: 接收人,就是邮件发送的目标群众
  • cc: 抄送,一般来讲抄送的名单,只是让他感知到有这封邮件,属于周知对象
  • bcc: 密送,与上面两个不一样,接收人和抄送人不知道密送给谁了,这就是最大的区别,说实话这个玩意我从没用过

接下来一篇博文,将介绍一下如何将log日志与邮件发送关联起来,当出现异常的时候,邮件发送给开发者

III. 不能错过的源码和相关知识点

0. 项目

工程:github.com/liuyueyi/sp
源码:github.com/liuyueyi/sp

总结

到此这篇关于SpringBoot实现邮件发送功能的文章就介绍到这了,更多相关SpringBoot邮件发送内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号