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";
@Bean
public 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 {
@Autowired
private JavaMailSenderImpl javaMailSenderImpl;
@Autowired
private 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;
/** 测试代码 */
@Autowired
private MailService mailService;
/**
* 简单 邮件
* @return
*/
@Override
public String sendSimpleEmail() {
return mailService.sendSimpleEmail("****@qq.com","测试","1111111111111111ceshi");
}
/**
* html 邮件
* @return
*/
@Override
public 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
*/
@Override
public String sendFileMail() {
return mailService.sendFileMail("****@qq.com","测试","附件邮件测试……",false,
"1111.docx","C:\\Users\\admin\\Desktop\\新建a文档.docx");
}
/**
* 多附件 邮件
* @return
*/
@Override
public 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
*/
@Override
public String sendTemplateMail() {
// 模板参数
Map<String, Object> map = new HashMap<>();
map.put("username", "ceshiceshi");
return mailService.sendTemplateMail("****@qq.com", "测试", "email/templateMail", map);
}
/**
* 带附件 模板 邮件
* @return
*/
@Override
public 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
*/
@Override
public 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