SpringBoot系列之發送郵件極速入門與實踐
目錄
一、Email前言介紹
郵件發送業務,是很多公司都有的,本博客介紹一下基于SpringBoot的郵件發送功能,郵箱服務基于騰訊QQ郵箱
SpringBoot的肯定有很多場景啟動器starter,SpringBoot官方提供了spring-boot-starter-mail作為郵件服務的場景啟動器
二、Email例子實踐
2.1 開發實驗環境準備
- JDK 1.8
- SpringBoot2.2.1
- Maven 3.2+
- 開發工具
- IntelliJ IDEA
- smartGit
創建一個SpringBoot Initialize項目,詳情可以參考我之前博客:SpringBoot系列之快速創建項目教程
2.2 Meavn配置文件
配置spring-boot-starter-mail:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置Thymeleaf模板引擎
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
lombok,非必須,只是不想寫bean類的set,get
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.3 application配置
新建application.yml,注意password在QQ郵箱里不是郵箱密碼,需要去申請SMTP服務給的secret
spring:
mail:
host: smtp.qq.com
username: your_emial@qq.com
password: cmlebzqdtvejdibe
default-encoding: utf-8
向騰訊申請secret:

網易163郵箱的配置:
spring:
mail:
host: smtp.163.com
username: your163account@163.com
password: your163password
default-encoding: utf-8
2.4 發送文本格式郵件
Email DTO類:
package com.example.springboot.email.bean;
import lombok.Data;
/**
* <pre>
* EmailDto
* </pre>
*
* <pre>
* @author mazq
* 修改記錄
* 修改后版本: 修改人: 修改日期: 2020/07/22 16:26 修改內容:
* </pre>
*/
@Data
public class EmailDto {
/**
* 發送對象
*/
private String sendTo;
/**
* 發送主題
*/
private String subject;
/**
* 郵件內容
*/
private String content;
/**
* 發起對象
*/
private String sendFrom;
/**
* 附件路徑數組
*/
private String[] filePaths;
/**
* 內嵌圖片ID
*/
private String inlineImgId;
/**
* 內嵌圖片路徑
*/
private String inlineImgPath;
}
新建EmailService類:
@Autowired
MailProperties mailProperties;
@Autowired
JavaMailSender javaMailSender;
/**
* 發送文本郵件
* @Author mazq
* @Date 2020/07/22 16:31
* @Param [email]
* @return
*/
public void sendTextMail(EmailDto email) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(email.getSendTo());
mailMessage.setSubject(email.getSubject());
mailMessage.setText(email.getContent());
mailMessage.setFrom(mailProperties.getUsername());
javaMailSender.send(mailMessage);
}
junit測試:
@Test
void testSendTextMail(){
EmailDto emailDto = new EmailDto();
emailDto.setSendTo("your_email@qq.com");
emailDto.setSubject("發送文本郵件");
emailDto.setContent("測試發送文本郵件!");
emailService.sendTextMail(emailDto);
}

2.5 發送Html格式郵件
/**
* 發送Html郵件
* @Author mazq
* @Date 2020/07/22 16:31
* @Param [email]
* @return
*/
public void sendHtmlMail(EmailDto email) throws MessagingException {
MimeMessage mailMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true);
messageHelper.setTo(email.getSendTo());
messageHelper.setSubject(email.getSubject());
messageHelper.setText(email.getContent(),true);
messageHelper.setFrom(mailProperties.getUsername());
javaMailSender.send(mailMessage);
}
Junit測試:
@Test
void testSendHtmlMail() throws MessagingException {
EmailDto emailDto = new EmailDto();
emailDto.setSendTo("your_email@qq.com");
emailDto.setSubject("發送html郵件");
String html = "<html><head><title>email</title></head><body><h1>測試發送html郵件</h1></body></html>";
emailDto.setContent(html);
emailService.sendHtmlMail(emailDto);
}

2.6 發送html內嵌圖片
2.5介紹了發送html格式的郵件,如果html里要加上圖片?具體實現請看下文:
/**
* 發送html內嵌圖片郵件
* @Author mazq
* @Date 2020/07/22 16:31
* @Param [email]
* @return
*/
public void sendInLineImgMail(EmailDto email) throws MessagingException {
MimeMessage mailMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true);
messageHelper.setTo(email.getSendTo());
messageHelper.setSubject(email.getSubject());
messageHelper.setText(email.getContent(),true);
messageHelper.setFrom(mailProperties.getUsername());
FileSystemResource fileSystemResource = new FileSystemResource(new File(email.getInlineImgPath()));
messageHelper.addInline(email.getInlineImgId(), fileSystemResource);
javaMailSender.send(mailMessage);
}
這邊加上圖片路徑:
@Test
void testSendInLineImgMail() throws MessagingException {
String inlineImgPath = "C:\\Users\\Administrator\\Desktop\\007Tv3Vmly1ggxvrzrytij31hc0u047h.jpg";
String srcId = "img01";
EmailDto emailDto = new EmailDto();
emailDto.setSendTo("your_email@qq.com");
emailDto.setSubject("發送html內嵌圖片郵件");
emailDto.setInlineImgId(srcId);
emailDto.setInlineImgPath(inlineImgPath);
String html = "<html><head><title>email</title></head><body><h1>發送html內嵌圖片郵件</h1>"+
"<img src=\'cid:"+ srcId +"\'></img>" +
"</body></html>";
emailDto.setContent(html);
emailService.sendInLineImgMail(emailDto);
}
測試發送成功:

2.7 發送模板html郵件
如果發送html郵件,郵件里的內容要動態的,這種可以怎么實現?寫html的字符串,然后去發送也是可以,不過如果用模板引擎就可以簡潔點,請看代碼:
先寫個html,引入Thymeleaf模板引擎
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>模板郵件</title>
</head>
<body>
您好,<span th:text="${username}"></span>,歡迎訪問我的CSDN博客:
<a >CSDN鏈接</a>
</body>
</html>
Junit測試:
@Test
void testSendTemplateEmail() throws MessagingException {
Context context = new Context();
context.setVariable("username", "admin");
context.setVariable("id", "123456789");
EmailDto emailDto = new EmailDto();
emailDto.setSendTo("your_emial@qq.com");
emailDto.setSubject("發送模板html郵件");
emailDto.setContent(templateEngine.process("test",context));
emailService.sendHtmlMail(emailDto);
}
測試成功,數據是動態的

2.8 發送Attachment郵件
如果要發送帶附件的郵件,怎么實現?請看代碼:
/**
* 發送附件郵件
* @Author mazq
* @Date 2020/07/22 16:31
* @Param [email]
* @return
*/
public void sendAttachmentMail(EmailDto email) throws MessagingException {
MimeMessage mailMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true);
messageHelper.setTo(email.getSendTo());
messageHelper.setSubject(email.getSubject());
messageHelper.setText(email.getContent(),true);
messageHelper.setFrom(mailProperties.getUsername());
for (String filePath : email.getFilePaths()) {
FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
messageHelper.addAttachment(fileSystemResource.getFilename() , fileSystemResource);
}
javaMailSender.send(mailMessage);
}
@Test
void testSendAttachmentMail() throws MessagingException {
String[] filePaths = new String[]{"C:\\Users\\Administrator\\Desktop\\awrrpt_2_22022_22023.html","C:\\Users\\Administrator\\Desktop\\awr.html"};
EmailDto emailDto = new EmailDto();
emailDto.setSendTo("your_email@qq.com");
emailDto.setSubject("發送附件郵件");
emailDto.setFilePaths(filePaths);
String html = "<html><head><title>email</title></head><body><h1>測試發送附件郵件</h1></body></html>";
emailDto.setContent(html);
emailService.sendAttachmentMail(emailDto);
}

代碼例子下載:code download
IT程序員

浙公網安備 33010602011771號