Spring Boot 发送 email
一、使用SpringBoot 发送邮件
1.创建子模块
这里我们创建一个子模块,创建步骤同 SpringBoot_01_入门示例
1 | group = 'com.ray.study' |
2.引入依赖
2.1 继承父工程依赖
在父工程spring-boot-seeds
的 settings.gradle
加入子工程
1 | rootProject.name = 'spring-boot-seeds' |
这样,子工程spring-boot-09-other-sendmail
就会自动继承父工程中subprojects
`函数里声明的依赖,主要包含如下依赖:
1 | implementation 'org.springframework.boot:spring-boot-starter-web' |
2.2 引入Mail
依赖
将子模块spring-boot-09-other-sendmail
的build.gradle
修改为如下内容:
1 | dependencies { |
3.拿到邮箱授权码
这里以qq邮箱为例:登录qq邮箱 -> 设置 -> 账户 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 -> 点击生成授权码
然后就可以拿到邮箱授权码
4.修改application.yml
需要配置邮箱:SMTP邮件服务器地址、用户的邮箱地址、用户的邮箱授权码(也就是3中拿到的邮箱授权码)
1 | spring: |
这里,我们以qq邮箱为例,给出一个示例配置(数据是错误的,大家需要改成自己的),其他邮箱也是一样的:
1 | spring: |
- smtp:邮件发送协议
- pop3:邮件接收协议
如果是网易邮箱:
1 | spring: |
5.业务实现
这里我们实现一个邮件发送的service
(1)MailService
1 | package com.ray.study.springboot09othersendmail.service; |
(2)MailServiceImpl
1 | package com.ray.study.springboot09othersendmail.service.impl; |
6.单元测试
- MailServiceTest
1 | package com.ray.study.springboot09othersendmail.service; |
效果如下图:
(1)简单文本
(2)内嵌静态资源
(3)带附件
二、结合模板引擎来发送模板邮件
- 通过模板引擎技术,可以定制发送邮件的模板
通常我们使用邮件发送服务的时候,都会有一些固定的场景,比如重置密码、注册确认等,给每个用户发送的内容可能只有小部分是变化的。
所以,很多时候我们会使用模板引擎来为各类邮件设置成模板,这样我们只需要在发送时去替换变化部分的参数即可。
在这一部分,我们将在上一部分的基础上结合 thymeleaf
来发送邮件模板
参考资料
1.修改依赖
在模块spring-boot-09-other-sendmail
的build.gradle
中加入 thymeleaf 依赖
1 | dependencies { |
2.修改 application.yml
在 application.yml 文件中加入 thymeleaf 配置
1 | spring: |
3.业务实现
3.1 entity
(1)Mail
1 | package com.ray.study.springboot09othersendmail.entity; |
(2)MailTemplate
1 | package com.ray.study.springboot09othersendmail.entity; |
3.2 service
TemplateMailService
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package com.ray.study.springboot09othersendmail.service;
import com.ray.study.springboot09othersendmail.entity.Mail;
/**
* 邮件发送类
*
*/
public interface TemplateMailService {
/**
* 发送邮件:
* (1)当邮件有模板时按模板发送
* (2)无模板时按内容发送
* @param mail 邮件
*/
void send(Mail mail);
}TemplateMailServiceImpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110package com.ray.study.springboot09othersendmail.service.impl;
import com.ray.study.springboot09othersendmail.entity.Mail;
import com.ray.study.springboot09othersendmail.service.TemplateMailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.thymeleaf.TemplateEngine;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Iterator;
import java.util.Map;
/**
* description
*
*/
public class TemplateMailServiceImpl implements TemplateMailService {
private JavaMailSender mailSender;
private String from;
private TemplateEngine templateEngine;
public void send(Mail mail) {
if(mail.getMailTemplate()!=null
&& !StringUtils.isEmpty(mail.getMailTemplate().getFilePath())){
sendByTemplate( mail);
}else{
sendByText(mail);
}
}
/**
* 根据邮件文本内容发送邮件
* @param mail
*/
private void sendByText(Mail mail){
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(mail.getTo());
helper.setSubject(mail.getSubject());
// 启用html
helper.setText(mail.getText(), true);
// 添加邮件中内嵌的静态资源
Iterator<Map.Entry<String, String>> inlineEntries = mail.getInlineMap().entrySet().iterator();
while (inlineEntries.hasNext()){
Map.Entry<String, String> entry = inlineEntries.next();
String contentId = entry.getKey();
String filePathName = entry.getValue();
FileSystemResource file = new FileSystemResource(new File(filePathName));
helper.addInline(contentId, file);
}
// 添加邮件末尾的附件
Iterator<Map.Entry<String, String>> attachmentEntries = mail.getAttachmentMap().entrySet().iterator();
while (attachmentEntries.hasNext()){
Map.Entry<String, String> entry = attachmentEntries.next();
String contentId = entry.getKey();
String filePathName = entry.getValue();
FileSystemResource file = new FileSystemResource(new File(filePathName));
helper.addAttachment(contentId, file);
}
mailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
log.debug("邮件发送成功:{} -> {}", from, mail.getTo());
}
/**
* 根据模板发送邮件
* @param mail 邮件
*/
private void sendByTemplate(Mail mail){
String text = templateEngine.process(mail.getMailTemplate().getFilePath(), mail.getMailTemplate().getContext());
mail.setText(text);
sendByText(mail);
}
}
3.3 模板及静态资源文件
3.3.1 模板文件
如上图,这里我们模仿京东发送电子发票的邮件:
在resources/templates/mail
目录文件夹下创建模板mail-template.html
:
1 |
|
3.3.2 静态资源文件
resources/static/img
: 图片目录resources/static/pdf
:电子发票目录
4.单元测试
- TemplateMailServiceTest
1 | package com.ray.study.springboot09othersendmail.service; |
效果如下图: