SpringBoot+thymeleaf发送邮件

在Spring Cloud项目中有几个服务都需要发送邮件。如果每一个服务都写一遍邮件发送代码,不仅重复代码比较多,而且维护起来也比较麻烦;就想着写一个单独的邮件模块。服务要发送邮件直接调用模块里的接口就好了。思路有两种:1.新建一个邮件服务,需要发邮件的时候通过Spring Cloud跨服务访问里面对应的Controller,2.新建一个邮件的jar包,需要发邮件的服务引入jar包,直接调用jar包里面的Service

第一次写博客,有不对的地方麻烦告诉我下;谢谢!

我这里是新建的jar包;简单实现了 文本、HTML、附件、多个附件、模板 邮件的发送

新建jar包代码

1.在pom.xml文件中添加SpringBoot-mail引用

     <!-- Spring 邮件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!-- Spring thymeleaf 邮件模板 引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

2.添加配置类 SpringMailConfig (我这里将配置放在JavaBean中,也可以写到配置文件中)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;import java.util.Properties;@Configuration
public class SpringMailConfig {// 发送邮件服务器private final static String HOST = "smtp.qq.com";// 邮箱private final static String USERNAME = "****@qq.com";// 客户端授权码private final static String PASSWORD = "****";private final static String PROPERTY_MAIL_SMTP_AUTH = "true";private final static String PROPERTY_mail_smtp_starttls_enable = "true";private final static String PROPERTY_mail_smtp_starttls_required = "true";@Beanpublic JavaMailSenderImpl mailSender() {JavaMailSenderImpl mailSender = new JavaMailSenderImpl();// 设置参数mailSender.setHost(HOST);mailSender.setUsername(USERNAME);mailSender.setPassword(PASSWORD);Properties properties = mailSender.getJavaMailProperties();properties.setProperty("mail.smtp.auth",PROPERTY_MAIL_SMTP_AUTH);properties.setProperty("mail.smtp.starttls.enable",PROPERTY_mail_smtp_starttls_enable);properties.setProperty("mail.smtp.starttls.required",PROPERTY_mail_smtp_starttls_required);mailSender.setJavaMailProperties(properties);return mailSender;}}

3.添加发送邮件类 MailService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;
import java.util.Map;@Component
public class MailService {@Autowiredprivate JavaMailSenderImpl javaMailSenderImpl;@Autowiredprivate TemplateEngine templateEngine;/*** 简单邮件* @param to       接收人* @param subject  主题* @param content  内容* @return*/public String sendSimpleEmail(String to,String subject,String content) {try {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(javaMailSenderImpl.getUsername());message.setTo(to); // 接收地址message.setSubject(subject); // 标题message.setText(content); // 内容javaMailSenderImpl.send(message);return "发送成功";} catch (Exception e) {e.printStackTrace();return e.getMessage();}}/*** html 邮件* @param to       接收人* @param subject  主题* @param html     内容*/public String sendHtmlMail(String to,String subject,String html){try {MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();// 设置utf-8编码,否则邮件会有乱码MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");messageHelper.setFrom(javaMailSenderImpl.getUsername());messageHelper.setTo(to);messageHelper.setSubject(subject);messageHelper.setText(html, true);javaMailSenderImpl.send(mimeMessage);return "发送成功";} catch (Exception e) {e.printStackTrace();return e.getMessage();}}/*** 带附件  邮件* @param to        接收人* @param subject   主题* @param content   内容* @param isHtml    是否是html 邮件  false:普通邮件,true:html邮件* @param fileName  文件名称* @param filePath  文件路径* @return*/public String sendFileMail(String to,String subject,String content,boolean isHtml,String fileName,String filePath){try {MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();// 设置utf-8编码,否则邮件会有乱码MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");messageHelper.setFrom(javaMailSenderImpl.getUsername());messageHelper.setTo(to);messageHelper.setSubject(subject);messageHelper.setText(content,isHtml);// 设置附件FileSystemResource file=new FileSystemResource(new File(filePath));if(StringUtils.isBlank(fileName)) {// 文件名为空时,取文件本身名称fileName = file.getFilename();}messageHelper.addAttachment(fileName,file);javaMailSenderImpl.send(mimeMessage);return "发送成功";} catch (Exception e) {e.printStackTrace();return e.getMessage();}}/*** 多附件 邮件* @param to       接收人* @param subject  主题* @param content  内容* @param isHtml   是否是html 邮件  false:普通邮件,true:html邮件* @param list     附件集合  filepath:附件路径,fileName:附件名* @return*/public String sendFilesMail(String to, String subject, String content, boolean isHtml, List<Map<String,String>> list){try {MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();// 设置utf-8编码,否则邮件会有乱码MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");messageHelper.setFrom(javaMailSenderImpl.getUsername());messageHelper.setTo(to);messageHelper.setSubject(subject);messageHelper.setText(content,isHtml);// 设置附件for (Map<String,String> map : list) {FileSystemResource file = new FileSystemResource(new File(map.get("filepath")));String fileName = map.get("fileName");if(StringUtils.isBlank(fileName)){// 文件名为空时,取文件本身名称fileName = file.getFilename();}messageHelper.addAttachment(fileName,file);}javaMailSenderImpl.send(mimeMessage);return "发送成功";} catch (Exception e) {e.printStackTrace();return e.getMessage();}}/*** 模板 邮件* @param to       接收人* @param subject  主题* @param tplStr   模板路径   默认路径为 resources/templates 这里传该路径下 之后的路径  mail/模板名称  例 email/templateMail 这里不用加后缀* @param map      绑定到模板的参数* @return*/public String sendTemplateMail(String to, String subject, String tplStr, Map<String,Object> map){try {MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();// 设置utf-8编码,否则邮件会有乱码MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");messageHelper.setFrom(javaMailSenderImpl.getUsername());messageHelper.setTo(to);messageHelper.setSubject(subject);// 设置模板参数Context context = new Context();context.setVariables(map);// 将参数 绑定到模板中String tempContent = templateEngine.process(tplStr, context);messageHelper.setText(tempContent,true);javaMailSenderImpl.send(mimeMessage);return "发送成功";} catch (Exception e) {e.printStackTrace();return e.getMessage();}}/*** 带附件 模板 邮件* @param to        接收人* @param subject   主题* @param tplStr    模板路径   默认路径为 resources/templates 这里传该路径下 之后的路径  mail/模板名称  例 email/templateMail 这里不用加后缀* @param map       绑定到模板的参数* @param fileName  附件名* @param filePath  附件路径* @return*/public String sendTemplateFileMail(String to, String subject, String tplStr, Map<String,Object> map, String fileName,String filePath){try {MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();// 设置utf-8或GBK编码,否则邮件会有乱码MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");messageHelper.setFrom(javaMailSenderImpl.getUsername());messageHelper.setTo(to);messageHelper.setSubject(subject);// 设置模板参数Context context = new Context();context.setVariables(map);// 将参数 绑定到模板中String tempContent = templateEngine.process(tplStr, context);messageHelper.setText(tempContent,true);// 设置附件FileSystemResource file=new FileSystemResource(new File(filePath));if(StringUtils.isBlank(fileName)) {// 文件名为空时,取文件本身名称fileName = file.getFilename();}messageHelper.addAttachment(fileName,file);javaMailSenderImpl.send(mimeMessage);return "发送成功";} catch (Exception e) {e.printStackTrace();return e.getMessage();}}/*** 多附件 模板 邮件* @param to       接收人* @param subject  主题* @param tplStr   模板路径   默认路径为 resources/templates 这里传该路径下 之后的路径  mail/模板名称  例 email/templateMail 这里不用加后缀* @param map      绑定到模板的参数* @param list     附件集合  filepath:附件路径,fileName:附件名* @return*/public String sendTemplateFilesMail(String to, String subject, String tplStr, Map<String,Object> map, List<Map<String,String>> list){try {MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();// 设置utf-8编码,否则邮件会有乱码MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");messageHelper.setFrom(javaMailSenderImpl.getUsername());messageHelper.setTo(to);messageHelper.setSubject(subject);// 设置模板参数Context context = new Context();context.setVariables(map);// 将参数 绑定到模板中String tempContent = templateEngine.process(tplStr, context);messageHelper.setText(tempContent,true);// 设置附件for (Map<String,String> fileMap : list) {FileSystemResource file = new FileSystemResource(new File(fileMap.get("filepath")));String fileName = fileMap.get("fileName");if(StringUtils.isBlank(fileName)){// 文件名为空时,取文件本身名称fileName = file.getFilename();}messageHelper.addAttachment(fileName,file);}javaMailSenderImpl.send(mimeMessage);return "发送成功";} catch (Exception e) {e.printStackTrace();return e.getMessage();}}}

4.添加邮件模板 templateMail.html

模板路径默认为 resources/templates 下面测试类代码中传的路径是在该路径下之后的路径(我这里的目录路径是resources/templates/mail/);

模板模板目录结构
模板代码

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>模板邮件</title>
</head>
<body>模板 邮件 测试: <font color='red' size='30' th:text="${username}"></font>
</body>
</html>

这里是让 Spring 加载配置类和发送邮件类的文件(如果项目能扫描到,也可以不添加)

在 resources 目录下添加 META-INF文件,然后在该文件夹下添加 spring.factories 文件
目录 resources/META-INF/spring.factories 让 Spring 加载配置类和发送邮件类
文件代码

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\包路径.SpringMailConfig,\包路径.MailService

代码相关博客
https://www.cnblogs.com/huanghzm/p/12217630.html
https://www.jb51.net/article/112979.htm

服务中调用代码

5.测试类代码

在需要发送邮件的服务中添加调用代码

/** 导包 */import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 /** 测试代码 */@Autowiredprivate MailService mailService;/*** 简单 邮件* @return*/@Overridepublic String sendSimpleEmail() {return mailService.sendSimpleEmail("****@qq.com","测试","1111111111111111ceshi");}/*** html 邮件* @return*/@Overridepublic String sendHtmlMail() {// html 字符串String html = "<!DOCTYPE html>" +"<html lang=\"zh-CN\">" +"<header></header>" +"<body>" +"<div><a href=\"https://www.baidu.com\">  html 邮箱测试 百度  </a></div>" +"</body>" +"</html>";return mailService.sendHtmlMail("****@qq.com","测试",html);}/*** 带附件 邮件* @return*/@Overridepublic String sendFileMail() {return mailService.sendFileMail("****@qq.com","测试","附件邮件测试……",false,"1111.docx","C:\\Users\\admin\\Desktop\\新建a文档.docx");}/*** 多附件 邮件* @return*/@Overridepublic String sendFilesMail() {// 附件集合List<Map<String,String>> list = new ArrayList<>();Map<String,String> map1 = new HashMap<>();map1.put("filepath","C:\\Users\\admin\\Desktop\\新建a文档.docx");map1.put("fileName","111.docx");Map<String,String> map2 = new HashMap<>();map2.put("filepath","C:\\Users\\admin\\Desktop\\新建b文档.docx");map2.put("fileName","222.docx");Map<String,String> map3 = new HashMap<>();map3.put("filepath","C:\\Users\\admin\\Desktop\\新建c文档.docx");list.add(map1);list.add(map2);list.add(map3);return mailService.sendFilesMail("****@qq.com","测试","多附件邮件测试……",false,list);}/*** 模板 邮件* @return*/@Overridepublic String sendTemplateMail() {// 模板参数Map<String, Object> map = new HashMap<>();map.put("username", "ceshiceshi");return mailService.sendTemplateMail("****@qq.com", "测试", "email/templateMail", map);}/*** 带附件 模板 邮件* @return*/@Overridepublic String sendTemplateFileMail() {// 模板参数Map<String, Object> map = new HashMap<>();map.put("username", "ceshiceshi");return mailService.sendTemplateFileMail("****@qq.com", "测试", "email/templateMail", map,"1111.docx","C:\\Users\\admin\\Desktop\\新建a文档.docx");}/*** 多附件 模板 邮件* @return*/@Overridepublic String sendTemplateFilesMail() {// 模板参数Map<String, Object> map = new HashMap<>();map.put("username", "ceshiceshi");// 附件集合List<Map<String,String>> list = new ArrayList<>();Map<String,String> map1 = new HashMap<>();map1.put("filepath","C:\\Users\\admin\\Desktop\\新建a文档.docx");map1.put("fileName","111.docx");Map<String,String> map2 = new HashMap<>();map2.put("filepath","C:\\Users\\admin\\Desktop\\新建b文档.docx");map2.put("fileName","222.docx");Map<String,String> map3 = new HashMap<>();map3.put("filepath","C:\\Users\\admin\\Desktop\\新建c文档.docx");list.add(map1);list.add(map2);list.add(map3);return mailService.sendTemplateFilesMail("****@qq.com", "测试", "email/templateMail", map, list);}

参考博客:

https://www.cnblogs.com/codeplus/archive/2011/11/03/2232893.html
https://blog.csdn.net/qq_36761831/article/details/104129547

SpringBoot+thymeleaf 发送邮件相关推荐

  1. springboot+thymeleaf实现发Html邮件自由

    2019年,我刚接触测试架构和测试开发类的工作时,经常会有自动化发邮件的功能,大都是从各个平台自动化统计一些数据出来,每周定时发一封邮件给领导交差,回过头来再看看我发的邮件,不美观,不专业.这2年,也 ...

  2. Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题

    前言:这周在使用 Ajax+Thymeleaf 时遇到一个问题,折腾了我很久,在此记录一下 Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题 问题描述 我的目的:通过 Aja ...

  3. SpringBoot thymeleaf使用方法,thymeleaf模板迭代

    SpringBoot thymeleaf使用方法,thymeleaf模板迭代 SpringBoot thymeleaf 循环List.Map ============================= ...

  4. SpringBoot Thymeleaf使用教程(实用版)

    SpringBoot Thymeleaf使用教程(实用版) 使用Thymeleaf 三大理由: 简洁漂亮 容易理解 完美支持HTML5 使用浏览器直接打开页面 不新增标签 只需增强属性 学习目标 快速 ...

  5. java springboot+maven发送邮件

    springboot+maven发送邮件 废话不多说直接上代码 1. pom 文件导入jar包 <!--邮件发送--><dependency><groupId>ja ...

  6. springboot+thymeleaf+pageHelper带条件分页查询

    html层 <div><a class="num"><b th:text="'共 '+ ${result.resultMap['pages' ...

  7. 基于springboot+thymeleaf+mybatis的员工管理系统 —— 增删改查

    员工管理系统 - 增删改查 entity 查询所有功能 查询所有的页面 emplist.html 保存员工 保存员工的页面 addEmp.html 删除员工 修改员工 根据id查询员工 修改员工信息 ...

  8. 基于springboot+thymeleaf+mybatis的员工管理系统 —— 登录与注册

    员工管理系统 - 登录与注册功能 创建项目 pom.xml 数据库表设计和环境准备 建表SQL application.properties 用户注册与登录功能 entity dao service ...

  9. 基于Springboot + Thymeleaf 的招聘网站(源代码+数据库) 026

    部分代码地址 https://gitee.com/ynwynwyn/springboot-recruit-public 基于Springboot + Thymeleaf 的招聘网站(源代码+数据库) ...

  10. springBoot+thymeleaf框架实现cms内容管理和商城系统

    springBoot+thymeleaf框架实现cms内容管理和商城系统 概要介绍 基于开源框架springBoot2.3+thymeleaf+springSecurity+lucene8.5.2 是 ...

最新文章

  1. 文件系统过滤驱动开发(一)—Win32底层开发小组
  2. Junit 4.x 单元测试,参数化测试,套件测试 实例
  3. 不需编译让aspx页自主筛选数据绑定记录
  4. hibernate 多表查询
  5. windows内核驱动开发(WDK环境搭建)
  6. 史上最全!数学参考书大评测及常见问题
  7. java 语言的介绍
  8. 打印机服务器不支持1020,HP1020打印机驱动安装不上的解决办法
  9. Oracle查数据库某字段的本年数,上年同期数,同比
  10. 软件开发量评估法之一---德尔菲评估法
  11. 概率论与数理统计学习笔记——第7讲——连续型随机变量(2.5.4指数分布及其与泊松分布的关系)
  12. Elasticsearch:Ingest Pipeline 实践
  13. 如何辨别胖人多气虚阳虚,瘦人多血虚阴虚!【转】
  14. 地图切片的概念与原理
  15. 一步一步教你将java代码打成jar包用bat批处理命令运行
  16. 洛谷 P4869 albus就是要第一个出场(求一个数在线性基中的排名)
  17. ZHA_123的自我介绍
  18. ticwatch能支持鸿蒙吗,我的廉价表盒 篇二:过气的智能手表?出门问问Ticwatch2 一年半断断续续的使用体验...
  19. 浪潮8460m4安装linux,NF8460M4(DDR4) – IPMI设置
  20. Java处理PFX格式证书

热门文章

  1. BZOJ2303 APIO2011方格染色(并查集)
  2. ES6中Number中的扩展
  3. centos7 centos6.5部KVM使用NAT联网并为虚拟机配置firewalld iptables防火墙端口转发...
  4. lua -- table.nums
  5. java基础之输入语句
  6. 基于visual c++之windows核心编程代码分析(35)实践NT服务的框架
  7. SetWindowLong 和SetClassLong区别
  8. TypeError: ‘RClass‘ object is not callable, TypeError: ‘CClass‘ object is not callable
  9. 如何访问服务器表中信息,如何在 RADIUS 服务器的拨号接口上应用访问列表
  10. php怎样注释代码块,vscode怎样注释方法代码块