如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了
源码地址:https://github.com/keer123456789/springbootstudy/tree/master/maildemo
1.邮件基础知识
常见的邮件协议有两种:SMTP
和POP3
两种。它们的工作内容如图1:
①发信人使用用户代理来撰写邮件,用户代理使用SMTP
协议将邮件发送到发送方邮件服务器。
②发送方邮件服务器将邮件放入缓存队列中,等待发送。
③发送方的邮件服务器发现有等待发送的邮件,就想接收端的邮件服务器建立TCP连接。
④TCP连接建成后,使用SMTP
协议发送邮件。邮件发送成功后,关闭TCP连接。
⑤接收端的邮件服务器接收到邮件后,将邮件发到接收者的邮箱中。
⑥收信人打算收信时,调用用户代理,使用POP3
协议将邮件从接收端邮件服务器的邮箱取出。
2.准备工作
使用qq邮箱作为发送邮箱,需要在邮箱中将POP3
和SMTP
开启。
- 登录qq邮箱,打开设置,如图2:
- 点击账户,找到POP3和SMTP服务,点击开启,会给一个授权码,保存好,有大用如图3:
3.添加依赖,配置
###3.1 添加依赖
可以在创建项目时勾选,如图4:
pom.xml
中的依赖如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3.2 添加配置
spring.mail.password=**********
spring.mail.username=*******@qq.com
#465 或者 587
spring.mail.port=587
spring.mail.host=smtp.qq.com
spring.mail.default-encoding=UTF-8
- password:刚刚开启
SMTP
和POP3
的授权码,不是登录密码 - username:你的邮箱
- port:qq邮箱的STMP端口,一般是456或者587
3.发送邮件的四种方式
创建发送邮件的服务接口MailService
,代码如下:
public interface MailService {
/**
* 发送简单的文字邮件
*
* @param receiverMail 接受者邮箱
* @param subject 邮件主题
* @param content 邮件内容
*/
void sendSimpleMail(String receiverMail, String subject, String content);
/**
* 发送html文件的邮件
*
* @param receiverMail 接受者邮箱
* @param subject 邮件主题
* @param content 邮件内容
*/
void sendHtmlMail(String receiverMail, String subject, String content);
/**
* 发送带有附件的邮件
*
* @param receiverMail 接受者邮箱
* @param subject 邮件主题
* @param content 邮件内容
* @param filePath 附件文件地址
*/
void sendAttachmentsMail(String receiverMail, String subject, String content, String filePath);
/**
* 发送模板文件
*
* @param receiverMail 接受者邮箱
* @param subject 邮件主题
* @param user 发送模板信息
*/
void sendThymeleafMail(String receiverMail, String subject, User user);
}
3.1 发送简单的文字邮件
其中mailSender
是JavaMailSender
的实例。
public void sendSimpleMail(String receiverMail, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(senderMail); //设置发送者邮箱
message.setTo(receiverMail); //设置接受者邮箱
message.setSubject(subject); //设置主题
message.setText(content); //设置发送内容
try {
mailSender.send(message);
logger.info("简单邮件已经发送");
} catch (Exception e) {
e.printStackTrace();
logger.error("简单邮件发送失败!!!");
}
}
测试发送:
@Test
@DisplayName("发送简单邮件")
public void testSimpleMail() {
mailService.sendSimpleMail("1511***[email protected]", "Test use springboot send mail", "简单邮件测试文件");
}
如图5:
3.2 发送html格式的邮件
其中mailSender
是JavaMailSender
的实例。
public void sendAttachmentsMail(String receiverMail, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(senderMail);
helper.setTo(receiverMail);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String filename = file.getFile().getName();
helper.addAttachment(filename, file);
mailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("发送带附件的邮件时发生异常!");
}
}
测试发送:
@Test
@DisplayName("发送html邮件")
public void testHtmlMail() {
StringBuffer sb = new StringBuffer();
sb.append("<html><body><h1>使用springboot 发送html邮件 测试文件!!!</h1>")
.append("<p >测试成功</p>")
.append("<p >测试时间" + new Date() + "</p></body></html>");
mailService.sendHtmlMail("1511***[email protected]", "Test use springboot send mail", sb.toString());
}
如图6:
3.3 发送带附件的邮件
其中mailSender
是JavaMailSender
的实例。
public void sendAttachmentsMail(String receiverMail, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(senderMail);
helper.setTo(receiverMail);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String filename = file.getFile().getName();
helper.addAttachment(filename, file);
mailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("发送带附件的邮件时发生异常!");
}
}
测试代码:
@Test
@DisplayName("发送附件邮件")
public void testAttachmentsMail() {
String path = "./testMailFile.txt";
StringBuffer sb = new StringBuffer();
sb.append("<html><body><h1>使用springboot 发送附件邮件 测试文件!!!</h1>")
.append("<p >测试成功</p>")
.append("<p >测试时间" + new Date() + "</p></body></html>");
mailService.sendAttachmentsMail("[email protected]", "Test use springboot send mail", sb.toString(), path);
}
结果如图7:
3.4 发送thymeleaf模板邮件
- 引入
Thymeleaf
的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 创建
mail.html
模板文件
在resources/templates
文件加下创建mail.html
模板文件
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<bo
<p>hello 欢迎加入 Springboot大家庭,您的入职信息如下:</p>
<table border="1">
<tr>
<td>姓名</td>
<td th:text="${username}"></td>
</tr>
<tr>
<td>工号</td>
<td th:text="${num}"></td>
</tr>
<tr>
<td>部门</td>
<td th:text="${department}"></td>
</tr>
</table>
<div style="color: #ff1a0e">一起学习,共同努力!!</div>
</body>
</html>
- 创建相应的对象类
User
根据模板文件创建相应的对象类
public class User {
private String name;
private String num;
private String department;
public User() {
}
public String getName() {
return name;
}
public String getNum() {
return num;
}
public String getDepartment() {
return department;
}
public void setName(String name) {
this.name = name;
}
public void setNum(String num) {
this.num = num;
}
public void setDepartment(String department) {
this.department = department;
}
}
- 邮件发送代码
public void sendThymeleafMail(String receiverMail, String subject, User user) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(senderMail);
helper.setTo(receiverMail);
helper.setSubject(subject);
Context context = new Context();
context.setVariable("username", user.getName());
context.setVariable("num", user.getNum());
context.setVariable("department", user.getDepartment());
String process = templateEngine.process("mail.html", context);
helper.setText(process, true);
mailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
- 测试代码
@Test
@DisplayName("发送模板html邮件")
public void testThymeleafMail() {
User user = new User();
user.setName("keer");
user.setNum("135");
user.setDepartment("mail");
mailService.sendThymeleafMail("1511***[email protected]", "Test use springboot send mail", user);
}
如图8