很多时候邮件发送并不是主业务必须关注的结果,比如通知类、提醒类的业务可以允许延时或者失败。这个时候可以采用异步的方式来发送邮件,加快主交易执行速度,在实际项目中可以采用MQ发送邮件相关参数,监听到消息队列之后启动发送邮件。
1、在pom.xml文件中添加SpringBoot-mail引用
<!--整合SpringBoot-mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--整合SpringBoot-thymeleaf模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、SpringBoot的application.properties文件中添加邮箱配置
##配置发送邮件的服务器地址、用户名、邮箱授权码、编码
spring.mail.host=smtp.qq.com
spring.mail.username=用户名(邮箱地址)
spring.mail.password=邮箱授权码
spring.mail.default-encoding=UTF-8
3、文本、HTML、附件、多个附件、图片邮件发送的简单实现代码
package com.hern.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMailMessage;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.ArrayList;
/**
* @program: springboot-mail
* @description: MailService
* @author: 宋兆恒-2336909208@q.com
* @create: 2020-01-20 14:30
**/
@Service
public class MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
//指定发送者
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender mailSender;
public void sayHello(){
System.out.println("Hello World");
}
/*
* 发送简单文本邮件
* to:发送给谁
* subject:发送的主题(邮件主题)
* content:发送的内容
* */
public void sendSimpleMail(String to, String subject, String content){
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setTo(to);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
simpleMailMessage.setFrom(from);
//发送邮件
try {
mailSender.send(simpleMailMessage);
logger.info("简单邮件发送成功");
} catch (MailException e) {
logger.error("简单邮件发送失败",e);
}
}
/*
* 发送HTML邮件
* to:发送给谁
* subject:发送的主题(邮件主题)
* content:发送的内容
* */
public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
MimeMessage mimeMailMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
mimeMessageHelper.setFrom(from);
try {
mailSender.send(mimeMailMessage);
logger.info("HTML邮件发送成功!");
} catch (MailException e) {
logger.error("HTML邮件发送失败!",e);
}
}
/*
* 发送附件邮件
* to:发送给谁
* subject:发送的主题(邮件主题)
* content:发送的内容
* filePath:附件路径
* */
public void sendAttachmentsMail(String to, String subject, String content, String filePath) throws MessagingException {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content);
//获取文件路径以及文件名称
FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
String fileName = fileSystemResource.getFilename();
mimeMessageHelper.addAttachment(fileName,fileSystemResource);
mimeMessageHelper.setFrom(from);
try {
mailSender.send(mimeMessage);
logger.info("附件邮件发送成功!");
} catch (MailException e) {
logger.error("附件邮件发送失败!",e);
}
}
/*
* 发送多个附件邮件
* to:发送给谁
* subject:发送的主题(邮件主题)
* content:发送的内容
* filePath:附件路径
* */
public void sendAttachmentsMails(String to, String subject, String content, ArrayList filePaths) throws MessagingException {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content);
//获取文件路径以及文件名称
for (Object filepath:filePaths) {
FileSystemResource fileSystemResource = new FileSystemResource(new File((String) filepath));
String fileName = fileSystemResource.getFilename();
mimeMessageHelper.addAttachment(fileName,fileSystemResource);
}
mimeMessageHelper.setFrom(from);
try {
mailSender.send(mimeMessage);
logger.info("附件邮件发送成功!");
} catch (MailException e) {
logger.error("附件邮件发送失败!",e);
}
}
/*
* 发送图片件
* to:发送给谁
* subject:发送的主题(邮件主题)
* content:发送的内容
* imagePath:图片路径
* imageId:图片ID
* */
public void sendImage(String to, String subject, String content, String imagePath, String imageId) throws MessagingException {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content,true);
FileSystemResource fileSystemResource = new FileSystemResource(new File(imagePath));
mimeMessageHelper.addInline(imageId,fileSystemResource);
mimeMessageHelper.setFrom(from);
try {
logger.info("图片邮件发送成功!");
mailSender.send(mimeMessage);
} catch (MailException e) {
logger.error("图片邮件发送失败!",e);
}
}
}
模板邮件
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>邮件模板</title>
</head>
<body>
<h3>您好,感谢您的注册,这是一封验证邮件,请点击下面的链接完成注册,感谢您的支持!</h3>
<a href="#" th:href="@{ http://www.hernsong.com/register/{id}(id=${id}) }">激活账号</a>
</body>
</html>
4、目录结构
5、测试邮件发送
package com.hern.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import java.util.ArrayList;
/**
* @program: springboot-mail
* @description: 测试MailService
* @author: 宋兆恒-2336909208@q.com
* @create: 2020-01-20 15:41
**/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
//测试简单文本文件
@Test
public void sendSimpleMail(){
mailService.sendSimpleMail("123456789@163.com","Springboot-Mail测试","基于SpringBoot的邮件系统的文本邮件");
}
//发送HTML邮件
@Test
public void sendHtmlMail() throws MessagingException {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<html>\n").append("<body>\n").append("<h1>HTML邮件系统测试</h1>\n").append("</body>\n").append("</html>\n");
//String content = "<html>\n"+"<body>\n"+"<h1>HTML邮件系统测试</h1>\n"+"</body>\n"+"</html>\n";
mailService.sendHtmlMail("123456789@163.com","HTML邮件测试", String.valueOf(stringBuilder));
}
//发送单个附件邮件
@Test
public void sendAttachmentsMail() throws MessagingException {
String filePath = "src/main/resources/templates/2019.12杨寨工资明细.xls";
mailService.sendAttachmentsMail("123456789@163.com","多个附件邮件测试","附件邮件",filePath);
}
//发送多个附件邮件
@Test
public void sendAttachmentsMails() throws MessagingException {
String filePath = "src/main/resources/templates/2019.12杨寨工资明细.xls";
String filePath2 = "src/main/resources/templates/2019.12杨寨工资明细2.xls";
ArrayList<String> filePaths = new ArrayList();
filePaths.add(filePath);
filePaths.add(filePath2);
mailService.sendAttachmentsMails("123456789@163.com","多个附件邮件测试","附件邮件",filePaths);
}
@Test
public void sendImage() throws MessagingException {
String imagePath = "src/main/resources/templates/ZoomOut_ZH-CN4471982075_1920x1080.jpg";
String imageId = "123";
StringBuilder content = new StringBuilder();
content.append("<html>\n").append("<body>\n").append("<img src=\"").append(imagePath).append("\">\n").append("</body>\n").append("</html>");
mailService.sendImage("123456789@163.com","图片邮件","图片邮件",imagePath,imageId);
}
@Test
public void templateMail() throws MessagingException {
Context context = new Context();
context.setVariable("id","123");
String emailContent = templateEngine.process("emailTemplate",context);
mailService.sendHtmlMail("123456789@163.com","模板邮件",emailContent);
}
}
6、