如果餓了就喫,困了就睡,渴了就喝,人生就太無趣了
源碼地址: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