Spring Boot – 邮件发送
1、前期准备
以QQ邮箱为例子,首先需要申请开通POP3/STMP服务或者IMAP/SMTP服务。
SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,定义了邮件客户与STMP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。
POP3(Post Office Protocol3),即邮局协议,定义了邮件客户端与POP3服务器之间的通信规则。
IMAP(Internet Message Access Protocol),交互邮件访问协议,与POP3协议作用类似,是POP3协议的拓展,功能更强。
QQ邮箱,开通POP3/STMP服务或者IMAP/SMTP服务的步骤:
-
登录QQ邮箱,点击顶部的设置按钮和账户按钮
-
找到POP3/STMP服务,点击“开启”
-
按其指令操作后,会得到一个授权码,保存起来,后面会使用到
2、环境搭建
邮件发送是一个常见的功能,Sum公司提供了JavaMail用来实现邮件发现,但是配置较为繁琐。Spring框架提供了JavaMailSender来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration来进一步简化。
- 在Spring Boot项目中添加邮件依赖
<!-- 邮件依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 在application.yml配置邮件基本信息
spring:
mail:
host: smtp.qq.com # 发件服务器
username: xxx@qq.com # 账号
password: xxx # 密码(授权码)
port: 465
protocol: smtp # 协议
default-encoding: utf-8
# 下面这些配置大家不用深究,主要用于SSL连接配置
properties:
mail:
debug: true # 开启debug
imap:
ssl:
socketFactory:
fallback: false
smtp:
auth: true
ssl:
enable: true
socketFactory:
class: com.fintech.modules.base.util.mail.MailSSLSocketFactory
starttls:
enable: true
required: true
test-connection: false
3、发送简单邮件
创建一个MailService接口以及实现类来封装邮件的发送,代码如下:
public interface MailService {
/**
* 发送简单的邮件
* @param from 邮件发送者
* @param to 邮件接收人
* @param cc 邮件抄送人
* @param subject 邮件主题
* @param content 邮件内容
*/
public void sendSimpleMail(String from, String to, String cc, String subject, String content);
}
@Service
public class MailServiceImpl implements MailService {
// JavaMailSender是Spring Boot在MailSenderPropertiesConfiguration类中配置好的
// 这里直接注入使用即可
@Autowired
private JavaMailSender javaMailSender;
@Override
public void sendSimpleMail(String from, String to, String cc, String subject, String content) {
//构造一个SimpleMailMessage对象
SimpleMailMessage mailMessage = new SimpleMailMessage();
//进行相关配置
mailMessage.setFrom(from);
mailMessage.setTo(to);
mailMessage.setCc(cc);
mailMessage.setSubject(subject);
mailMessage.setText(content);
//使用JavaMailSender讲邮件发送出去
javaMailSender.send(mailMessage);
}
}
单元测试中写一个测试进行测试:
<!-- junit-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
@RunWith(SpringRunner.class)
@SpringBootTest
class ServiceTest {
@Autowired
private MailService mailService;
@Test
public void sendTest() {
//zhang_9782021@163.com
mailService.sendSimpleMail("xxx@qq.com",
"xxx@qq.com",
"xxx@qq.com",
"测试邮件的主题",
"测试邮件的内容");
}
}
至此,一个简单的邮件发送成功。
4、发送带附件的邮件
发送带附件的邮件也很容易,通过调用Attachment方法即可添加附件,该方法调用多次即可添加多个文件。
在service层的MailService添加一个新的方法,如下:
/**
* 发送带附件的邮件
* @param from 邮件发送者
* @param to 邮件接收人
* @param cc 邮件抄送人
* @param subject 邮件主题
* @param content 邮件内容
* @param file 附件文件
*/
public void sendAttachFileMail(String from, String to, String cc,
String subject, String content,
File file) throws MessagingException;
@Override
public void sendAttachFileMail(String from, String to, String cc,
String subject, String content,
File file) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
helper.addAttachment(file.getName(), file);
javaMailSender.send(message);
}
这里使用了MimeMessageHelper简化了邮件配置,其构造器的第二个参数true表示构造一个multipart message类型的邮件,multipart message类型的邮件包含多个正文、附件以及内嵌资源,最后通过addAttachment方法添加附件。
测试类:
@Test
public void sendTest02() throws MessagingException {
mailService.sendAttachFileMail("1652644822@qq.com",
"xxx@qq.com",
"xxx@qq.com",
"测试带附件邮件的主题",
"测试带附件邮件的内容",
new File("E:\\Photo\\基操勿6.jpg"));
}
5、Thymeleaf构建邮件模板
对于格式复杂邮件的,如果采用字符换进行HTML拼接,很容易出错,使用HTML模板很容易解决这个问题。
使用Thymeleaf构建邮件模板,首先添加Thymeleaf依赖:
<!-- Thymeleaf模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Thymeleaf邮件模板默认位置是在resources/templates目录下,创建相应的目录以及mail.html,代码:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>邮件</title>
</head>
<body>
<div>邮箱激活</div>
<div>您的注册信息是:</div>
<div>
<table border="1px">
<tr>
<td>用户名</td>
<td th:text="${userName}"></td>
</tr>
<tr>
<td>密码</td>
<td th:text="${password}"></td>
</tr>
</table>
</div>
</body>
</html>
在service层添加一个sendHtmlMail方法,代码如下:
/**
* 发送带附件的邮件
*
* @param from 邮件发送者
* @param to 邮件接收人
* @param cc 邮件抄送人
* @param subject 邮件主题
* @param content 邮件内容
*/
public void sendHtmlMail(String from, String to,
String cc, String subject,
String content) throws MessagingException;
@Override
public void sendHtmlMail(String from, String to, String cc, String subject, String content) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
javaMailSender.send(message);
}
测试类:
@Autowired
private TemplateEngine templateEngine;
@Test
public void sendHtmlMailTest() throws MessagingException {
Context context = new Context();
context.setVariable("userName", "Spring Boot");
context.setVariable("password", "Spring Boot");
String mail = templateEngine.process("mail", context);
mailService.sendHtmlMail("xxx@qq.com",
"xxx@qq.com",
"xxx@qq.com",
"测试Thymeleaf构建邮件模板的主题",
mail);
}
至此,几种不同的邮件发送的方式大致如此。
注:此文章为个人学习笔记,如有错误,敬请指正。