使用spring maill发送邮件
三种不同内容及附件
- 发送简易邮件
- 发送Html格式的可带附件的邮件
- 发送基于thymeleaf模板引擎的可带附件的邮件
三种方式基本配置
1、在pom文件中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、配置文件:
application.properties:
#thymeleaf
spring.thymeleaf.mode=HTML
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
#mail
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
#使用qq发送邮件
spring.profiles.active=qq
application-qq.properties:
# JavaMailSender 邮件发送的配置
spring.mail.host=smtp.qq.com
#QQ邮箱
spring.mail.username=1043437643@qq.com
#QQ邮箱的授权码
spring.mail.password=dkflmkddyzcybdda
application-163.properties:(选配)
spring.mail.host=smtp.163.com
spring.mail.username=xxx@163.com
#163邮箱密码
spring.mail.password=xxxxxx
3、创建Email实体类EmailBo:
private Integer id;
/** 邮件主题 */
private String subject;
/** 邮件显示内容 */
private String content;
/** 发送人 */
private String sender;
/** 收件人 */
private String[] recipient;
/** 抄送人 */
private String[] cc;
/** 内容是否是html */
private boolean isHtml;
/** 附件列表 一个map存储一个附件的名称和路径 */
private List<Map<String, String>> attachFiles;
1、发送简易邮件
编写一个发送邮件的工具类EmailUtils添加下面内容:
public class EmailUtils {
private static final Logger logger = LoggerFactory.getLogger(EmailUtils.class);
/**
* 发送简易邮件
* @param emailBo
* @return
*/
public static boolean sendSimpleMail(JavaMailSender javaMailSender,EmailBo emailBo) {
boolean flag = true;
try {
//获取邮件对象
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//发件人
simpleMailMessage.setFrom(emailBo.getSender());
//收件人
simpleMailMessage.setTo(emailBo.getRecipient());
//抄送人
simpleMailMessage.setCc(emailBo.getCc());
//邮件主题
simpleMailMessage.setSubject(emailBo.getSubject());
//邮件内容
simpleMailMessage.setText(emailBo.getContent());
//发送邮件
javaMailSender.send(simpleMailMessage);
} catch (MailException e) {
logger.error("邮件发送失败:{}", e.getMessage());
flag = false;
}
return flag;
}
}
调用EmailUtils工具类发送邮件:
@RestController
@RequestMapping("email")
public class EmailController {
private static final Logger logger = LoggerFactory.getLogger(EmailController.class);
//读取环境配置
@Autowired
private Environment env;
//spring邮件发送接口
@Autowired
private JavaMailSender javaMailSender;
@RequestMapping("sendEmail")
public Boolean sendEmail(){
EmailBo emailBo = new EmailBo();
//设置发件人从配置文件读取
emailBo.setSender(env.getProperty("spring.mail.username"));
//设置收件人
emailBo.setRecipient(new String[]{"321771738@qq.com"});
//设置抄送人
emailBo.setCc(new String[]{"1787470815@qq.com"});
//设置主题
emailBo.setSubject("主题");
//设置内容
emailBo.setContent("内容");
boolean isSend = EmailUtils.sendSimpleMail(javaMailSender,emailBo);
logger.info("邮件发送:{}", isSend);
return isSend;
}
}
2、发送Html格式的可带附件的邮件(可多个附件)
新建一个常量类EmailConf保存附件的名称和路径:
public class EmailConf {
//文件一
public static final String FILE_NAME = "test1.docx";
public static final String FILE_PATH ="C:\\Users\\86177\\Desktop\\test1.docx.docx";
//文件二
public static final String FILE_NAME2 = "test2.docx";
public static final String FILE_PATH2 = "C:\\Users\\86177\\Desktop\\test2.docx";
}
编写一个发送邮件的工具类EmailUtils添加下面内容:
(若工具类已存在可在工具类EmailUtils中新添加下面方法)
public class EmailUtils {
private static final Logger logger = LoggerFactory.getLogger(EmailUtils.class);
/**
* 发送html格式的可带附件的邮件
* 可多个附件
* @param emailBo
*/
public static boolean sendHtmlMailWithAttachment(JavaMailSender javaMailSender,EmailBo emailBo) throws MessagingException {
boolean flag = true;
try {
//设置邮件发送的基本配置(发送人,标题,内容。。。)
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true,"UTF-8");
mimeMessageHelper.setSubject(emailBo.getSubject());
mimeMessageHelper.setText(emailBo.getContent(), emailBo.isHtml());
mimeMessageHelper.setFrom(emailBo.getSender());
mimeMessageHelper.setTo(emailBo.getRecipient());
//抄送人参数不为null时设置抄送人
if (emailBo.getCc() != null) {
mimeMessageHelper.setCc(emailBo.getCc());
}
//附件参数不为空时,循环获取附件
if (emailBo.getAttachFiles() != null) {
FileSystemResource file = null;
for (Map<String, String> attachment : emailBo.getAttachFiles()) {
//获取文件路径(与调用工具方法时的参数TreeMap对应)
String filePath = attachment.get("filePath");
//获取文件名称(与调用工具方法时的参数TreeMap对应)
String fileName = attachment.get("fileName");
//获取文件
file = new FileSystemResource(filePath);
//将文件添加至附件列表
/*mimeMessageHelper.addAttachment(fileName, file);*/
try {
//将文件添加至附件列表--文件名为中文时需采用UTF-8方式防止乱码
//此处需捕获或抛出异常
mimeMessageHelper.addAttachment(MimeUtility.encodeWord(fileName,"UTF-8","B"), file);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
//发送邮件
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
logger.error("邮件发送失败:{}", e.getMessage());
flag = false;
}
return flag;
}
}
调用EmailUtils工具类发送邮件:
@RestController
@RequestMapping("email")
public class EmailController {
private static final Logger logger = LoggerFactory.getLogger(EmailController.class);
//读取环境配置
@Autowired
private Environment env;
//spring邮件发送接口
@Autowired
private JavaMailSender javaMailSender;
@RequestMapping("sendHtmlEmail")
public Boolean sendHtmlEmail(){
EmailBo emailBo = new EmailBo();
//设置发件人从配置文件读取
emailBo.setSender(env.getProperty("spring.mail.username"));
//设置收件人
emailBo.setRecipient(new String[]{"321771738@qq.com"});
//设置抄送人
emailBo.setCc(new String[]{"1787470815@qq.com"});
//设置主题
emailBo.setSubject("HTML格式的测试邮件");
//设置内容
emailBo.setContent("<h3><a href='http://www.baidu.com'>百度一下,你就知道</a></h3>");
//设置是否为Html格式
emailBo.setHtml(true);
//设置附件集合(可采用List<Map>方式设置多个)
List<Map<String, String>> maps = new ArrayList<>();
Map<String, String> map1 = new TreeMap<>();
map1.put("filePath",EmailConf.FILE_PATH);
map1.put("fileName",EmailConf.FILE_NAME);
maps.add(map1);
Map<String, String> map2 = new TreeMap<>();
map2.put("filePath",EmailConf.FILE_PATH2);
map2.put("fileName",EmailConf.FILE_NAME2);
maps.add(map2);
//设置附件集合(可采用List<Map>方式设置多个)
emailBo.setAttachFiles(maps);
boolean isSend = false;
try {
//调用工具类
//需捕获异常
isSend = EmailUtils.sendHtmlMailWithAttachment(javaMailSender,emailBo);
} catch (MessagingException e) {
e.printStackTrace();
}
logger.info("邮件发送:{}", isSend);
return isSend;
}
}
3、发送邮件内容基于thymeleaf模板引擎的可带附件的邮件
pom添加依赖jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在resources/templates目录下新建email.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
您好,这是验证邮件,请点击下面的链接完成验证,<br/>
<a th:href="@{${href}}">激活账号</a>
</body>
</html>
调用EmailUtils工具类发送邮件:
基于thymeleaf模板引擎发送和前面Html格式的发送其实差不多,只是html格式的邮件是把邮件内容用html代码输入,而thymeleaf模板引擎是获取上下文,设置模板的参数、把解析模板的值作为邮件内容。所以可以复用发送Html格式的可带附件的邮件的util工具类方法
//基于thymeleaf模板引擎发送邮件所需thymeleaf工具类包
@Autowired
private TemplateEngine templateEngine;
@RestController
@RequestMapping("email")
public class EmailController {
private static final Logger logger = LoggerFactory.getLogger(EmailController.class);
//读取环境配置
@Autowired
private Environment env;
//spring邮件发送接口
@Autowired
private JavaMailSender javaMailSender;
//基于thymeleaf模板引擎发送邮件所需thymeleaf工具类包
@Autowired
private TemplateEngine templateEngine;
@RequestMapping("sendHtmlEmail")
public Boolean sendHtmlEmail(){
//替换模板中的 "@{${href}}" 变量的值
//Context导包导 import org.thymeleaf.context.Context;
Context context = new Context();
context.setVariable("href", "http://www.baidu.com");
//解析模板 作为邮件内容
//templateEngine 需注入
String content = templateEngine.process("email", context);
EmailBo emailBo = new EmailBo();
//设置发件人从配置文件读取
emailBo.setSender(env.getProperty("spring.mail.username"));
//设置收件人
emailBo.setRecipient(new String[]{"321771738@qq.com"});
//设置抄送人
emailBo.setCc(new String[]{"1787470815@qq.com"});
//设置主题
emailBo.setSubject("HTML格式的测试邮件");
//设置内容
emailBo.setContent(content);
//设置是否为Html格式
emailBo.setHtml(true);
//设置附件集合(可采用List<Map>方式设置多个)
List<Map<String, String>> maps = new ArrayList<>();
Map<String, String> map1 = new TreeMap<>();
map1.put("filePath",EmailConf.FILE_PATH);
map1.put("fileName",EmailConf.FILE_NAME);
maps.add(map1);
Map<String, String> map2 = new TreeMap<>();
map2.put("filePath",EmailConf.FILE_PATH2);
map2.put("fileName",EmailConf.FILE_NAME2);
maps.add(map2);
//设置附件集合(可采用List<Map>方式设置多个)
emailBo.setAttachFiles(maps);
boolean isSend = false;
try {
//调用工具类
//需捕获异常
isSend = EmailUtils.sendHtmlMailWithAttachment(javaMailSender,emailBo);
} catch (MessagingException e) {
e.printStackTrace();
}
logger.info("邮件发送:{}", isSend);
return isSend;
}
}