0%

SpringBoot-邮件服务

前言

发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息。最早期的时候我们会使用 JavaMail 相关 api 来写发送邮件的相关代码,后来 Spring 推出了 JavaMailSender 更加简化了邮件发送的过程,在之后 Spring Boot 对此进行了封装就有了现在的 spring-boot-starter-mail ,本章文章的介绍主要来自于此包。

pom.xml文件

需要引入spring-boot-starter-mail依赖。

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
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.huzh</groupId>
<artifactId>springboot-mail</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springboot-mail</name>
<description>springboot-mail</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<!--thymeleaf-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.yml配置

  • 配置邮箱的信息,使用QQ邮箱,密码这里需要在邮箱–>设置–>账户里面开启POP3/SMTP服务。
  • main中的信息是发送者和接受者。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    spring:
    mail:
    ##邮箱服务器地址
    ##QQ smtp.qq.com
    ##sina smtp.sina.cn
    ##aliyun smtp.aliyun.com
    ##163 smtp.163.com
    host: smtp.qq.com
    username: *******@qq.com
    password: ******
    default-encoding: utf-8
    server:
    port: 8080
    main:
    formMail:
    sender: *******@qq.com
    receiver: ******@qq.com

完整controller类

这里包含了发送文本邮件、发送html邮件、发送附件邮件、发送图片邮件和发送html模板邮件。其中发送模板邮件需要HTML代码。这里主要用到JavaMailSender类作为邮件发送和TemplateEngine类作为模板解析。

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
@RestController
public class MailController {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Value("${main.formMail.sender}")
private String sender;
@Value("${main.formMail.receiver}")
private String receiver;

@Autowired
private JavaMailSender javaMailSender;

@Autowired
private TemplateEngine templateEngine;

/**
* @return java.lang.String
* @Description 发送文本邮件
* @date 2019/8/14 9:44
* @author huzh
**/
@RequestMapping("/sendMail")
public String sendMail() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(sender);
message.setTo(receiver);
//邮件主题
message.setSubject("文本邮件测试");
//邮件内容
message.setText("hello mail");

try {
javaMailSender.send(message);
logger.info("简单邮件已经发送。");
} catch (MailException e) {
logger.error("发送简单邮件时发生异常!", e);
}
return "success";
}

/**
* @return java.lang.String
* @Description 发送html邮件
* @date 2019/8/14 11:52
* @author huzh
**/
@RequestMapping("/sendHtmlMail")
public String sendHtmlMail() {
String content = "<html>\n" +
"<body>\n" +
" <h3>hello world ! 这是一封Html邮件!</h3>\n" +
"</body>\n" +
"</html>";
MimeMessage message = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(sender);
helper.setTo(receiver);
helper.setSubject("html邮件测试");
helper.setText(content, true);

javaMailSender.send(message);
logger.info("html邮件发送成功");
} catch (MessagingException e) {
logger.error("发送html邮件时发生异常!", e);
}
return "success";
}

/**
* @return java.lang.String
* @Description 发送html模板邮件
* @date 2019/8/14 14:51
* @author huzh
**/
@RequestMapping("/sendHtmlTemplateMail")
public String sendHtmlTemplateMail() {
//创建邮件正文
Context context = new Context();
context.setVariable("id", "006");
String content = templateEngine.process("emailTemplate", context);

MimeMessage message = javaMailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(sender);
helper.setTo(receiver);
helper.setSubject("html模板邮件测试");
helper.setText(content, true);

javaMailSender.send(message);
logger.info("html邮件发送成功");
} catch (MessagingException e) {
logger.error("发送html邮件时发生异常!", e);
}
return "success";
}

/**
* @return java.lang.String
* @Description 发送附件邮件
* @date 2019/8/14 12:31
* @author huzh
**/
@RequestMapping("/sendFilesMail")
public String sendFilesMail() {
String filePath = "C:\\Users\\Administrator\\Downloads\\11.doc";
MimeMessage message = javaMailSender.createMimeMessage();

try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(sender);
helper.setTo(receiver);
helper.setSubject("附件邮件测试");
helper.setText("附带附件", true);

FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);

javaMailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送带附件的邮件时发生异常!", e);
}

return "success";
}

/**
* @return java.lang.String
* @Description 发送图片邮件
* @date 2019/8/14 12:33
* @author huzh
**/
@RequestMapping("/sendImgMail")
public String sendImgMail() {
String Id = "test_mail";
String content = "<html><body>这是有图片的邮件:<img src=\'cid:" + Id + "\'></body></html>";
String imgPath = "C:\\Users\\Administrator\\Downloads\\222.jpg";

MimeMessage message = javaMailSender.createMimeMessage();

try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(sender);
helper.setTo(receiver);
helper.setSubject("图片邮件测试");
helper.setText(content, true);

FileSystemResource res = new FileSystemResource(new File(imgPath));
helper.addInline(Id, res);

javaMailSender.send(message);
logger.info("嵌入静态资源的邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送嵌入静态资源的邮件时发生异常!", e);
}
return "success";
}
}

模板HTML

创建模板emailTemplate.html文件

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
您好,这是验证邮件,请点击下面的链接完成验证,<br/>
<a href="#" th:href="@{ http://www.ityouknow.com/neo/{id}(id=${id}) }">激活账号</a>
</body>
</html>

欢迎关注我的其它发布渠道