在實際開發中,需要有很多地方用到關聯郵件發送消息,比如注冊成功信息,找回密碼信息,或者通過郵件發送即將過期信息等等,所使用的應用場景很多很多,下面調用JavaMailSender發送郵件,
一、郵箱配置
首先需要我們注冊郵箱,並開啟二級密碼設置,最主要的是開啟郵箱的POP3/SMTP服務,這里以網易雲郵箱舉例,點擊設置——POP3/SMTP/IMAP

並開啟授權碼,類似下圖,這個授權碼要牢記,后面會用到

1.配置完成,新建項目,在spirngBoot工程的pom.xml中導入郵件所需依賴及其他項目所需依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置application.properties
spring.mail.host=smtp.163.com spring.mail.username=xxxxxxxxxxx@163.com spring.mail.password=IPRWWISBDJIYVSYV spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.default-encoding=UTF-8
host qq郵箱為smtp.qq.com 網易郵箱為smtp.163.com
username為郵箱賬號
password 特別注意這里password不代表郵箱的登錄密碼, 而是在剛開始生成的授權碼
auth 開啟權限驗證
starttls.enable 是否開啟加密通訊
starttls.required 是否必須開啟加密通訊
3.新建郵件格式實體類,以自己內容為主 發送人,主題,內容
public class EmailBean implements Serializable {
private String[] receiver;
private String subject;
private String content;
public String[] getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = new String[] {receiver};
}
public void setReceiver(String... receiver) {
this.receiver = receiver;
}
..getter and setter
}
4.新建郵件發送工具類
(1)、純文本格式郵件
@Component
public class EmailUtil {
@Value("${spring.mail.username}")
private String sender;
@Autowired
JavaMailSender javaMailSender;
public void sendPlainTextMail(EmailBean emailBean){
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(sender);
simpleMailMessage.setTo(emailBean.getReceiver());
simpleMailMessage.setSubject(emailBean.getSubject());
simpleMailMessage.setText(emailBean.getContent());
javaMailSender.send(simpleMailMessage);
}
}
測試類調用
@Autowired
EmailUtil emailUtil;
@Test
public void sendMail(){
EmailBean emailBean = new EmailBean();
emailBean.setReceiver("xxxx@qq.com");
emailBean.setSubject("springBoot發送純文本郵件測試");
emailBean.setContent("這是一段純文本格式的郵件");
emailUtil.sendPlainTextMail(emailBean);
}
測試執行,最終執行結果


發送郵件給多人,當然這個可以用的地方不是很多,在實體類我們將接收者receiver設成數組格式,方便群發郵件
替換上一步emailBean.setReceiver()
@Test
public void sendMail(){
EmailBean emailBean = new EmailBean();
String[] arrReceivers = new String[] {"xxxxx1@qq.com", "xxxxx2@qq.com"};
emailBean.setReceiver(arrReceivers);
emailBean.setSubject("springBoot發送純文本郵件測試");
emailBean.setContent("這是一段春純文本格式的郵件,當前時間" + new Date());
emailUtil.sendPlainTextMail(emailBean);
logger.warn(String.format("發送郵件給%s成功", Arrays.toString(arrReceivers)));
}
結果


(2)發送帶有HTML代碼的郵件發送
可以看到我們使用的JavaMailSender繼承了MailSender,發送純文本格式的使用SimpleMailMessage

而發送帶有附件信息或者富文本格式的郵件我們需要使用MimeMessage

在上一步EmailUtils.java里添加方法
public void sendMimeMail(EmailBean emailBean) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(sender);
mimeMessageHelper.setTo(emailBean.getReceiver());
mimeMessageHelper.setSubject(emailBean.getSubject());
mimeMessageHelper.setText(emailBean.getContent(), true);
javaMailSender.send(mimeMessage);
}
進行測試
@Test
public void sendMimeEmail() throws MessagingException {
EmailBean emailBean = new EmailBean();
emailBean.setReceiver("xxxxxx@qq.com");
emailBean.setSubject("springBoot發送HTML格式郵件測試");
emailBean.setContent("<h1 style='color:red'>springBoot集成郵件發送html格式郵件測試</h1>");
emailUtil.sendMimeMail(emailBean);
logger.warn("發送郵件給成功");
}


(3)html中含有圖片或者將圖片以正文發送郵件
html代碼中的圖片需要在MimeMessageHelper中添加
public void sendMimeMail(EmailBean emailBean) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(sender);
mimeMessageHelper.setTo(emailBean.getReceiver());
mimeMessageHelper.setSubject(emailBean.getSubject());
mimeMessageHelper.setText(emailBean.getContent(), true);
FileSystemResource fileSystemResource = new FileSystemResource(new File("C:\\Users\\ThinkPad\\Desktop\\image.png"));
mimeMessageHelper.addInline("image", fileSystemResource);
javaMailSender.send(mimeMessage);
}
這里mimeMessageHelper.addInline()中的參數表示獲取資源的id和Resource
@Test
public void sendMimeEmail() throws MessagingException {
EmailBean emailBean = new EmailBean();
emailBean.setReceiver("xxxxxx@qq.com");
emailBean.setSubject("springBoot發送HTML包含圖片郵件測試");
emailBean.setContent("<h5 style='color:red'>springBoot集成郵件發送html格式郵件測試</h5>" +
"<img src='cid:image");
emailUtil.sendMimeMail(emailBean);
logger.warn("發送郵件給成功");
}
點擊測試


可以看到圖片正常顯示
(4)帶有附件的郵件發送
在EmailUtil.java中添加方法
public void sendAppendMimeMail(EmailBean emailBean) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(sender);
mimeMessageHelper.setTo(emailBean.getReceiver());
mimeMessageHelper.setSubject(emailBean.getSubject());
mimeMessageHelper.setText(emailBean.getContent(), true);
String filePath = "C:\\Users\\ThinkPad\\Desktop\\賬號密碼.xls";
FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
mimeMessageHelper.addAttachment("11.xls", fileSystemResource);
javaMailSender.send(mimeMessage);
}
@Test
public void sendAppendMimeEmail() throws MessagingException {
EmailBean emailBean = new EmailBean();
emailBean.setReceiver("xxxxxx@qq.com");
emailBean.setSubject("springBoot集成郵件發送附件測試");
emailBean.setContent("<h1 style='color:red'>springBoot集成郵件發送html格式郵件及附件文件測試</h1>");
emailUtil.sendAppendMimeMail(emailBean);
logger.warn("含有附件郵件發送成功");
}


(5)使用Thymeleaf模板發送郵件
上一步我們用html代碼發送郵件,就寫了兩行已經感覺比較麻煩了字符串的拼接和圖片的上傳,較復雜的內容郵件用這種方式會顯得很麻煩,所有我們使用模板,需要改變的值用參數代替來達到個性化的郵件。
繼續在pom.xml文件中導入Thymeleaf依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
z在templates文件夾下新建mailTemp.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body >
<div style="background-color:#222222;">
<img src="http://message-center-cbc-cn.obs.cn-north-1.myhuaweicloud.com/BSS/templateImg/2019411_zh_logo.png" />
</div>
<h4 th:text="|尊敬的華為雲客戶${username}|"></h4>
您好!
<p style="text-indent:2em">您的賬戶余額不足50.00元,為了保證您的業務正常運行,請及時進行<a href="https://cnblogs.com/LiuFqiang">充值</a></p>
<p style="text-indent:2em">感謝您對華為雲的支持!</p>
<hr style="margin-left: initial;width: 100%; border:1px dashed #987cb9 ">
<p style="color: #999;font-size: 14px;margin-top:10px;margin-bottom:40px">
本郵件由系統自動發送,請勿直接回復!
</p>
<br >
<p>官方網站:<a href="https://cnblogs.com/LiuFqiang">https://cnblogs.com/LiuFqiang</a></p>
<p>Wechat:15641483049</p>
</body>
</html>
在測試類測試:
@Autowired
private TemplateEngine templateEngine;
@Test
public void sendHtmlEmail() throws MessagingException {
Context context = new Context();
context.setVariable("username", "劉**");
String emailContent = templateEngine.process("mailTemp", context);
EmailBean emailBean = new EmailBean();
emailBean.setReceiver("xxxxx@qq.com");
emailBean.setSubject("springBoot集成郵件服務");
emailBean.setContent(emailContent);
emailUtil.sendMimeMail(emailBean);
logger.warn("模板郵件發送成功!");
}
這里需要注意templateEmgine.process的模板路徑名字一個要與template靜態文件的相對應,並且模板的參數名與context.setVariable的一一對應


完結!!!
