springboot(九)mail发送邮件

x33g5p2x  于2021-12-17 转载在 其他  
字(10.7k)|赞(0)|评价(0)|浏览(515)

前言:

      SpringBoot实现邮件功能是非常的方便快捷的,因为SpringBoot默认有starter实现了Mail。 发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息。 最早期的时候我们会使用JavaMail相关api来写发送邮件的相关代码,后来spring退出了 JavaMailSender更加简化了邮件发送的过程,在之后springboot对此进行了封装就有了 现在的spring-boot-starter-mail

新建项目:springboot-mail:

   打开pom.xml,添加以下依赖:

  1. <dependencies>
  2. <!--mail-->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-mail</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-test</artifactId>
  10. <scope>test</scope>
  11. </dependency>
  12. <!--lombok-->
  13. <dependency>
  14. <groupId>org.projectlombok</groupId>
  15. <artifactId>lombok</artifactId>
  16. <version>1.16.22</version>
  17. </dependency>
  18. <!--freemarker-->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-freemarker</artifactId>
  22. </dependency>
  23. </dependencies>

编辑配置文件:application.properties

  1. # JavaMailSender 邮件发送的配置
  2. spring.mail.host=smtp.qq.com
  3. spring.mail.username=邮箱账号
  4. #QQ邮箱的授权码
  5. spring.mail.password=授权码
  6. spring.mail.properties.mail.smtp.auth=true
  7. spring.mail.properties.mail.smtp.starttls.enable=true
  8. spring.mail.properties.mail.smtp.starttls.required=true
  9. spring.mail.default-encoding=UTF-8
  10. #spring.mail.host=smtp.163.com
  11. #spring.mail.username=用户163邮箱
  12. #spring.mail.password=邮箱密码
  13. #spring.mail.properties.mail.smtp.auth=true
  14. #spring.mail.properties.mail.smtp.starttls.enable=true
  15. #spring.mail.properties.mail.smtp.starttls.required=true
  16. #spring.mail.default-encoding=UTF-8

授权码获取:开启POP3/SMTP服务  

     登陆qq邮箱 -->设置-->账户-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务-->POP3/SMTP服务   设置开启

新建MailBean.java

  1. @Data
  2. public class MailBean implements Serializable {
  3. //邮件发件人
  4. private String senderUser;
  5. //邮件接收人 可以同时发送多个人
  6. private String[] toUsers;
  7. //邮件抄送人 可以同时发送多个人
  8. private String[] ccUsers;
  9. //邮件密抄送人 可以同时发送多个人
  10. private String[] bccUsers;
  11. //邮件主题
  12. private String subject;
  13. //邮件内容
  14. private String content;
  15. //发送带文件的文件路径
  16. private String fileUrl;
  17. //附件名
  18. private String attachmentFilename;
  19. //发送静态资源文件中涉及<img>标签中的cid对应的contentId值
  20. private String contentId;
  21. //ftl文件名,默认配置为templates文件下的ftl文件
  22. private String ftlName;
  23. }

      别看这么多,其实我们用得到哪些对应设置值就可以了。

新建:MailUtil.java

  1. @Component
  2. public class MailUtil {
  3. @Autowired
  4. private JavaMailSender javaMailSender;
  5. @Autowired
  6. private Configuration configuration;
  7. private Logger logger = LoggerFactory.getLogger(MailUtil.class);
  8. /**
  9. * 发送简单格式的邮件
  10. * @param mailBean
  11. */
  12. public void sendSimpleMail(MailBean mailBean) {
  13. try {
  14. SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
  15. //邮件发送人
  16. simpleMailMessage.setFrom(mailBean.getSenderUser());
  17. //邮件接收人
  18. simpleMailMessage.setTo(mailBean.getToUsers());
  19. if(!StringUtils.isEmpty(mailBean.getCcUsers())){
  20. //抄送人,使用Cc还是Bcc大家根据具体场景自己选择
  21. simpleMailMessage.setCc(mailBean.getCcUsers());
  22. }
  23. if(!StringUtils.isEmpty(mailBean.getBccUsers())){
  24. //秘密抄送(发件人,收件人,抄送人都不会看到抄送给谁了)
  25. simpleMailMessage.setBcc(mailBean.getBccUsers());
  26. }
  27. //邮件主题
  28. simpleMailMessage.setSubject(mailBean.getSubject());
  29. //邮件内容
  30. simpleMailMessage.setText(mailBean.getContent());
  31. javaMailSender.send(simpleMailMessage);
  32. } catch (Exception e) {
  33. logger.error("发送失败", e.getMessage());
  34. }
  35. }
  36. /**
  37. * 发送HTML格式的邮件
  38. * @param mailBean
  39. */
  40. public void sendHTMLMail(MailBean mailBean) {
  41. try {
  42. MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
  43. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
  44. //发送者
  45. mimeMessageHelper.setFrom(mailBean.getSenderUser());
  46. //接收者
  47. mimeMessageHelper.setTo(mailBean.getToUsers());
  48. if(!StringUtils.isEmpty(mailBean.getCcUsers())){
  49. //抄送人,使用Cc还是Bcc大家根据具体场景自己选择
  50. mimeMessageHelper.setCc(mailBean.getCcUsers());
  51. }
  52. if(!StringUtils.isEmpty(mailBean.getBccUsers())){
  53. //秘密抄送(发件人,收件人,抄送人都不会看到抄送给谁了)
  54. mimeMessageHelper.setBcc(mailBean.getBccUsers());
  55. }
  56. mimeMessageHelper.setSubject(mailBean.getSubject());
  57. mimeMessageHelper.setText(mailBean.getContent(), true);
  58. javaMailSender.send(mimeMailMessage);
  59. } catch (Exception e) {
  60. System.out.println("发送失败:"+ e.getMessage());
  61. }
  62. }
  63. /**
  64. * 发送带附件格式的邮件
  65. * @param mailBean
  66. */
  67. public void sendAttachmentMail(MailBean mailBean) {
  68. try {
  69. MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
  70. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
  71. //发送者
  72. mimeMessageHelper.setFrom(mailBean.getSenderUser());
  73. //接收者
  74. mimeMessageHelper.setTo(mailBean.getToUsers());
  75. if(!StringUtils.isEmpty(mailBean.getCcUsers())){
  76. //抄送人,使用Cc还是Bcc大家根据具体场景自己选择
  77. mimeMessageHelper.setCc(mailBean.getCcUsers());
  78. }
  79. if(!StringUtils.isEmpty(mailBean.getBccUsers())){
  80. //秘密抄送(发件人,收件人,抄送人都不会看到抄送给谁了)
  81. mimeMessageHelper.setBcc(mailBean.getBccUsers());
  82. }
  83. mimeMessageHelper.setSubject(mailBean.getSubject());
  84. mimeMessageHelper.setText(mailBean.getContent());
  85. //文件路径
  86. FileSystemResource file = new FileSystemResource(new File(mailBean.getFileUrl()));
  87. mimeMessageHelper.addAttachment(mailBean.getAttachmentFilename(), file);
  88. javaMailSender.send(mimeMailMessage);
  89. } catch (Exception e) {
  90. System.out.println("发送失败:"+e.getMessage());
  91. }
  92. }
  93. /**
  94. * 发送带静态资源的邮件
  95. * @param mailBean
  96. */
  97. public void sendInlineMail(MailBean mailBean) {
  98. try {
  99. MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
  100. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
  101. //发送者
  102. mimeMessageHelper.setFrom(mailBean.getSenderUser());
  103. //接收者
  104. mimeMessageHelper.setTo(mailBean.getToUsers());
  105. if(!StringUtils.isEmpty(mailBean.getCcUsers())){
  106. //抄送人,使用Cc还是Bcc大家根据具体场景自己选择
  107. mimeMessageHelper.setCc(mailBean.getCcUsers());
  108. }
  109. if(!StringUtils.isEmpty(mailBean.getBccUsers())){
  110. //秘密抄送(发件人,收件人,抄送人都不会看到抄送给谁了)
  111. mimeMessageHelper.setBcc(mailBean.getBccUsers());
  112. }
  113. mimeMessageHelper.setSubject(mailBean.getSubject());
  114. // 注意<img/>标签,src='cid:jpg','cid'是contentId的缩写,'jpg'是一个标记
  115. mimeMessageHelper.setText(mailBean.getContent(), true);
  116. // 加载文件资源,作为附件
  117. FileSystemResource file = new FileSystemResource(new File(mailBean.getFileUrl()));
  118. // 调用MimeMessageHelper的addInline方法替代成文件('jpg[标记]', file[文件])
  119. mimeMessageHelper.addInline(mailBean.getContentId(), file);
  120. javaMailSender.send(mimeMailMessage);
  121. } catch (Exception e) {
  122. logger.error("邮件发送失败", e.getMessage());
  123. }
  124. }
  125. /**
  126. * 发送基于Freemarker模板的邮件
  127. * @param mailBean
  128. * @param map 模板中传入的值
  129. */
  130. public void sendTemplateMail(MailBean mailBean,Map<String, Object> map) {
  131. try {
  132. MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
  133. MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
  134. //发送者
  135. mimeMessageHelper.setFrom(mailBean.getSenderUser());
  136. //接收者
  137. mimeMessageHelper.setTo(mailBean.getToUsers());
  138. if(!StringUtils.isEmpty(mailBean.getCcUsers())){
  139. //抄送人,使用Cc还是Bcc大家根据具体场景自己选择
  140. mimeMessageHelper.setCc(mailBean.getCcUsers());
  141. }
  142. if(!StringUtils.isEmpty(mailBean.getBccUsers())){
  143. //秘密抄送(发件人,收件人,抄送人都不会看到抄送给谁了)
  144. mimeMessageHelper.setBcc(mailBean.getBccUsers());
  145. }
  146. mimeMessageHelper.setSubject(mailBean.getSubject());
  147. Template template = configuration.getTemplate(mailBean.getFtlName());
  148. String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
  149. mimeMessageHelper.setText(text, true);
  150. javaMailSender.send(mimeMailMessage);
  151. } catch (Exception e) {
  152. e.printStackTrace();
  153. logger.error("发送失败", e.getMessage());
  154. }
  155. }
  156. }

测试:

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class SpringbootMailApplicationTests {
  4. @Autowired
  5. private MailUtil mailUtil;
  6. /**
  7. * 发送简单格式的邮件
  8. * @throws Exception
  9. */
  10. @Test
  11. public void sendSimpleMail() throws Exception {
  12. MailBean mailBean = new MailBean();
  13. //发件人
  14. mailBean.setSenderUser("123@qq.com");
  15. //收件人
  16. mailBean.setToUsers(new String[]{"213@qq.com","232@163.com"});
  17. //抄送人
  18. mailBean.setCcUsers(new String[]{"412@qq.com"});
  19. //秘密抄送人
  20. mailBean.setBccUsers(new String[]{"23235@163.com"});
  21. //主题
  22. mailBean.setSubject("测试主题");
  23. //内容
  24. mailBean.setContent("测试内容");
  25. mailUtil.sendSimpleMail(mailBean);
  26. }
  27. /**
  28. * 发送HTML格式的邮件
  29. * @throws Exception
  30. */
  31. @Test
  32. public void sendHTMLMail() throws Exception {
  33. MailBean mailBean = new MailBean();
  34. //发件人
  35. mailBean.setSenderUser("123@qq.com");
  36. //收件人
  37. mailBean.setToUsers(new String[]{"213@qq.com","232@163.com"});
  38. //抄送人
  39. mailBean.setCcUsers(new String[]{"412@qq.com"});
  40. //秘密抄送人
  41. mailBean.setBccUsers(new String[]{"23235@163.com"});
  42. //标题
  43. mailBean.setSubject("测试发送HTML邮件");
  44. StringBuilder sb = new StringBuilder();
  45. sb.append("<h1>html格式邮件</h1>")
  46. .append("<span style='color:red'>测试内容。。。。。。</span> ")
  47. .append("<hr/>");
  48. //内容
  49. mailBean.setContent(sb.toString());
  50. mailUtil.sendHTMLMail(mailBean);
  51. }
  52. /**
  53. * 发送带附件格式的邮件
  54. * @throws Exception
  55. */
  56. @Test
  57. public void sendAttachmentMail() throws Exception {
  58. MailBean mailBean = new MailBean();
  59. //必须参数:发件人
  60. mailBean.setSenderUser("123@qq.com");
  61. //必须参数:收件人
  62. mailBean.setToUsers(new String[]{"213@qq.com","232@163.com"});
  63. //可选参数:抄送人
  64. mailBean.setCcUsers(new String[]{"412@qq.com"});
  65. //可选参数:秘密抄送人
  66. mailBean.setBccUsers(new String[]{"23235@163.com"});
  67. //必须参数:主题
  68. mailBean.setSubject("测试发送附件");
  69. //必须参数:内容
  70. mailBean.setContent("正文部分");
  71. //必须参数:文件路径
  72. mailBean.setFileUrl("D:/a.jpg");
  73. //必须参数:附件名称
  74. mailBean.setAttachmentFilename("a.jpg");
  75. mailUtil.sendAttachmentMail(mailBean);
  76. }
  77. /**
  78. * 发送带静态资源的邮件
  79. * @throws Exception
  80. */
  81. @Test
  82. public void sendInlineMail() throws Exception {
  83. MailBean mailBean = new MailBean();
  84. //必须参数:发件人
  85. mailBean.setSenderUser("123@qq.com");
  86. //必须参数:收件人
  87. mailBean.setToUsers(new String[]{"213@qq.com","232@163.com"});
  88. //可选参数:抄送人
  89. mailBean.setCcUsers(new String[]{"412@qq.com"});
  90. //可选参数:秘密抄送人
  91. mailBean.setBccUsers(new String[]{"23235@163.com"});
  92. //必须参数:主题
  93. mailBean.setSubject("测试发送带静态资源邮件");
  94. //必须参数 可以设置为上传文件后缀
  95. mailBean.setContentId("jpg");
  96. //必须参数:内容
  97. mailBean.setContent("\'<html><body>带静态资源的邮件内容:<img src='cid:"+mailBean.getContentId()+"' /></body></html>\'");
  98. //必须参数:文件路径
  99. mailBean.setFileUrl("D:/a.jpg");
  100. mailUtil.sendInlineMail(mailBean);
  101. }
  102. /**
  103. * 发送基于Freemarker模板的邮件
  104. * @throws Exception
  105. */
  106. @Test
  107. public void sendTemplateMail() throws Exception {
  108. MailBean mailBean = new MailBean();
  109. //必须参数:发件人
  110. mailBean.setSenderUser("123@qq.com");
  111. //必须参数:收件人
  112. mailBean.setToUsers(new String[]{"213@qq.com","232@163.com"});
  113. //可选参数:抄送人
  114. mailBean.setCcUsers(new String[]{"412@qq.com"});
  115. //可选参数:秘密抄送人
  116. mailBean.setBccUsers(new String[]{"23235@163.com"});
  117. //必须参数:主题
  118. mailBean.setSubject("测试发送带FreeMarker邮件");
  119. //必须参数:ftl文件名
  120. mailBean.setFtlName("mail.ftl");
  121. Map<String,Object> map =new HashMap<>();
  122. map.put("content","我是传入ftl模板中的centent属性的值");
  123. map.put("name","我是传入ftl模板中的name属性的值");
  124. mailUtil.sendTemplateMail(mailBean,map);
  125. }
  126. }

        注:发送不同格式得邮件得方法都有必须要传入得参数,都有注释。别少传哦! 

src/main/resouce/templates/mail.ftl 模板

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8"/>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. name:${name}<br/>
  9. content:${content}
  10. </body>
  11. </html>

源码地址https://gitee.com/xu0123/springboot2

相关文章