tags: [jmail]
categories: [邮件服务]


前言

最近项目需要做邮件相关功能,研究了下使用javamail来发送邮件的一般方式,其中有一些经验,记录下来,希望以后可以少走点弯路
SpringBoot版本2.2.6

以QQ邮箱示例

  1. 登录QQ邮箱,设置 -> 账户 进入以下界面,将IMAP/SMTP服务开启

image.png

  1. 记录该授权码,以后需要用到

邮件功能实现

从我目前了解的来看,可以发送四种邮件,分别是普通邮件,HTML格式的邮件,带附件的邮件,模板邮件,其中HTML格式的邮件和模板邮件的区别在于,模板邮件有点像JSP,可以支持语法的编写和属性注入
简单的归纳邮件发送方法如下

  1. /**
  2. * 发送简单邮件
  3. *
  4. * @param from 发送人
  5. * @param to 接收人
  6. * @param subject 主题
  7. * @param content 内容
  8. */
  9. @SuppressWarnings("unused")
  10. private void sendSimpleMessage(String from, String to, String subject, String content){
  11. SimpleMailMessage message = new SimpleMailMessage();
  12. message.setFrom(from);
  13. message.setSubject(to);
  14. message.setTo(subject);
  15. message.setText(content);
  16. mailSender.send(message);
  17. }
  18. /**
  19. * 发送HTML邮件
  20. *
  21. * @param from 发送人
  22. * @param to 接收人
  23. * @param subject 主题
  24. * @param content 内容
  25. */
  26. @SuppressWarnings("unused")
  27. private void sendHtmlEmail(String from, String to, String subject, String content){
  28. MimeMessage message = mailSender.createMimeMessage();
  29. MimeMessageHelper helper;
  30. try {
  31. helper = new MimeMessageHelper(message, true);
  32. helper.setFrom(from);
  33. helper.setTo(to);
  34. helper.setSubject(subject);
  35. helper.setText(content, true);
  36. } catch (MessagingException e) {
  37. log.error("HTML邮件发送异常", e);
  38. throw new BusinessException(ExceptionEnum.EMAIL_SEND_ERROR);
  39. }
  40. mailSender.send(message);
  41. }
  42. /**
  43. * 发送模板邮件
  44. *
  45. * @param from 发件人
  46. * @param to 收件人
  47. * @param subject 主题
  48. * @param templateValue 模板map
  49. */
  50. private void sendTemplateEmail(String from, String to, String subject, Map<String, Object> templateValue){
  51. try {
  52. MimeMessage mimeMessage = mailSender.createMimeMessage();
  53. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
  54. mimeMessageHelper.setFrom(from);
  55. mimeMessageHelper.setTo(to);
  56. mimeMessageHelper.setSubject(subject);
  57. Context context = new Context();
  58. context.setVariables(templateValue);
  59. String text = templateEngine.process(captchaTemplate,context);
  60. mimeMessageHelper.setText(text, true);
  61. mailSender.send(mimeMessage);
  62. }catch (MessagingException e) {
  63. e.printStackTrace();
  64. }
  65. }

注意

  1. HTML邮件需要将整个HTML内容作为content来导入,所以实际生产中最好还是作为配置或者第三方文件导入,不宜写入代码中
  2. 模板文件应该导入

模板邮件发送示例

  1. 使用模板需要导入依赖,我们使用的是thymeleaf模板需要导入依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
    4. </dependency>
    1. spring:
    2. # thymeleaf
    3. thymeleaf:
    4. mode: LEGACYHTML5
    5. # 这里去除缓存,生产需要开启
    6. cache: false
  2. 配置文件配置,这自然是我们自定义的属性

    1. email:
    2. sender: 'bwensun@foxmail.com'
    3. # 邮件thymeleaf模板路径
    4. template:
    5. captcha: /mail/captcha
  3. 配置模板路径和模板文件

    1. resources目录下建立templates文件夹,该文件夹是SpringBoot几个默认的文件夹,templates下建立mail文件夹,mail文件夹下存放模板文件
    2. 编写模板文件如下

      1. <!DOCTYPE html>
      2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
      3. <head>
      4. <meta charset="UTF-8">
      5. <title>Title</title>
      6. </head>
      7. <body>
      8. <table
      9. width="100%"
      10. height="100%"
      11. cellpadding="0"
      12. cellspacing="0"
      13. bgcolor="#f5f6f7"
      14. >
      15. <tbody>
      16. <tr>
      17. <td height="50"></td>
      18. </tr>
      19. <tr>
      20. <td align="center" valign="top">
      21. <table
      22. width="600"
      23. cellpadding="0"
      24. cellspacing="0"
      25. bgcolor="#ffffff"
      26. style="border: 1px solid #f1f2f5;"
      27. class="main-content"
      28. >
      29. <tbody>
      30. <tr>
      31. <td
      32. colspan="3"
      33. height="54"
      34. style="text-align: center; background-color: #47bb9b;"
      35. >
      36. <div
      37. style="
      38. font-family: Helvetica, Arial, sans-serif;
      39. font-weight: bold;
      40. font-size: 28px;
      41. line-height: 28px;
      42. color: #fff;
      43. "
      44. >
      45. Zoombar
      46. </div>
      47. </td>
      48. </tr>
      49. <tr>
      50. <td width="20"></td>
      51. <td align="left">
      52. <table cellpadding="0" cellspacing="0" width="100%">
      53. <tbody>
      54. <tr>
      55. <td colspan="3" height="20"></td>
      56. </tr>
      57. <tr>
      58. <td th:text="${name}"
      59. bgcolor="#ffffff"
      60. align="left"
      61. style="
      62. background-color: #ffffff;
      63. font-size: 17px;
      64. color: #7b7b7b;
      65. padding: 28px 0 0 0;
      66. line-height: 25px;
      67. "
      68. >
      69. </td>
      70. </tr>
      71. <tr>
      72. <td
      73. align="left"
      74. valign="top"
      75. style="
      76. font-size: 14px;
      77. color: #7b7b7b;
      78. line-height: 25px;
      79. font-family: Hiragino Sans GB;
      80. padding: 20px 0px 20px 0px;
      81. "
      82. >
      83. 你此次注册的验证码如下,请在 30
      84. 分钟内输入验证码,或直接点击右侧的按钮,以进行下一步操作。
      85. 如非你本人操作,请忽略此邮件。
      86. </td>
      87. </tr>
      88. <tr>
      89. <td
      90. style="
      91. border-bottom: 1px #f1f4f6 solid;
      92. padding: 0 0 40px 0;
      93. "
      94. align="center"
      95. >
      96. <table border="0" cellspacing="0" cellpadding="0">
      97. <tbody>
      98. <tr>
      99. <td>
      100. <span style="font-family: Hiragino Sans GB;">
      101. <div th:text="${captcha}"
      102. style="
      103. padding: 10px 18px 10px 18px;
      104. border-radius: 3px;
      105. text-align: center;
      106. text-decoration: none;
      107. background-color: #ecf4fb;
      108. color: #47bb9b;
      109. font-size: 20px;
      110. font-weight: 700;
      111. letter-spacing: 2px;
      112. margin: 0;
      113. white-space: nowrap;
      114. "
      115. >
      116. </div>
      117. </span>
      118. </td>
      119. <td rowspan="3" width="20px;"></td>
      120. <td>
      121. <a
      122. href="http://baidu.com"
      123. style="
      124. display: inline-block;
      125. text-decoration: none;
      126. width: 150px;
      127. "
      128. >
      129. <div
      130. style="
      131. padding: 10px 18px 10px 18px;
      132. border-radius: 3px;
      133. text-align: center;
      134. text-decoration: none;
      135. background-color: #47bb9b;
      136. color: #ecf4fb;
      137. font-size: 17px;
      138. font-weight: 400;
      139. letter-spacing: 2px;
      140. margin: 0;
      141. white-space: nowrap;
      142. "
      143. >
      144. 打开激活页面
      145. </div>
      146. </a>
      147. </td>
      148. </tr>
      149. </tbody>
      150. </table>
      151. </td>
      152. </tr>
      153. <tr>
      154. <td colspan="3" height="20"></td>
      155. </tr>
      156. </tbody>
      157. </table>
      158. </td>
      159. </tr>
      160. <tr>
      161. <td></td>
      162. <td valign="top">
      163. 此邮件来自
      164. <a href="www.zoombar.fun" style="color: #47bb9b;">Zoombar</a>
      165. 网站,用于发送用户注册所需的验证码。
      166. </td>
      167. <td height="50"></td>
      168. </tr>
      169. </tbody>
      170. </table>
      171. </td>
      172. </tr>
      173. </tbody>
      174. </table>
      175. </body>
      176. </html>
  4. 调用发送邮件方法

    1. 我们以发送验证码邮件为例,传入用户名和验证码,就会以默认邮箱去发送验证码
      1. /**
      2. * 发送验证码邮件
      3. *
      4. * @param name 用户名
      5. * @param to 收件人
      6. * @param captcha 验证码
      7. */
      8. public void sendCaptchaEmail(String name, String to, String captcha) {
      9. String subject = "ZoomBar账号注册";
      10. Map<String, Object> templateValue = new HashMap<>();
      11. String username = "你好, " + name;
      12. templateValue.put("name", username);
      13. templateValue.put("captcha", captcha);
      14. sendTemplateEmail(emailSender, to, subject, templateValue);
      15. }
  5. 结果如下image.png

    后面遇到的问题

    原以为部署上去会一样,然而。。
    第一个问题是找不到模板路径,

    相关

  6. SpringBoot发送邮件

  7. spring boot 阿里云发送邮件,使用 qq 邮箱的 SMTP 服务,端口由 25 换成 465