这段时间的项目中突然需要用到发送邮件的功能,之前一直都觉得这个功能会很复杂,但是具体了解之后发现其实很简单,也就是调个接口的事情。
配置
首先导入包;在pom.xml
中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
然后在application.yml
中配置smtp信息(把下面的信息换成自己服务商的配置)
spring:
mail:
host: smtp.ym.163.com # smtp地址
username: mail@xxx.com # 用户名
password: xxx # 密码
default-encoding: utf-8
# port: 994
properties:
mail.smtp.auth: true
mail.smtp.timeout: 10000
mail.smtp.writetimeout: 10000
mail.smtp.connectiontimeout: 10000
mail.smtp.starttls.enable: true
mail.smtp.starttls.required: true
mail.smtp.socketFactory.port: 994 # 端口
mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback: false
我这边是以网易的域名邮箱为例子的,需要注意的是,网易的域名邮箱只提供了SSL加密,而不提供TLS加密,所以我这边单独设置了mail.smtp.socketFactory.port
,而把port
给注释了;如果大家的服务商提供了TLS加密,那么只填写port
就行了。
使用
我这边首先创建个Service,并注入JavaMailSender
@Service
public class MailService {
@Value("${spring.mail.username}")
private String MailUserName;
private JavaMailSender javaMailSender;
@Resource
public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
}
发送简单的邮件
public void sendSimpleMail() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
message.setFrom("Test<" + MailUserName + ">"); // 发送邮件的用户名称
message.setTo("xxx@xxx.com"); // 邮件发送给谁
message.setSubject("简单的邮件"); // 邮件的标题
// message.setText("Test"); 仅文本内容
message.setText("<h1>Test</h1>", true); // 带HTML的内容
javaMailSender.send(mimeMessage);
}
发送带副本的邮件
public void sendSimpleMail() throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("Test<" + MailUserName + ">");
helper.setTo("xxx@xxx.com");
helper.setSubject("带文件的邮件");
helper.setText("<h1>Test</h1>", true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
javaMailSender.send(mimeMessage);
}
HTML邮件进阶
有个很常见的用途,就是用户注册的时候给用户发送一封欢迎邮件,邮件里面肯定会包含用户的相关信息,这里的信息可以看作是一个变量,那么问题来了,我们应该如何让邮件里面包含这个”变量“呢?我想最简单的实现方式应该就是拼接字符串了,但是这样的问题在于不直观,不好维护,并且在代码里面出现一长串字符串也不好看。但邮件内容既然是HTML,那么我们能不能用HTML解析框架来返回一个HTML字符串呢?那么我们就可以直接把邮件的模板写在HTML文件内由框架来帮我们替换相关的变量,这样就直观很多了。
要实现这样的操作也很简单,我这里使用thymeleaf
这个框架来解析HTML。(这个框架如果是在SpringBoot直接返回网页内容的项目中应该也是用得很广泛的)
首先还是添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
之后还是在application.yml中写配置
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
然后我们创建相关的文件夹resources/templates/mail
,再在mail文件夹内新建HTML,我这里就叫welcome.html
,然后在里面写HTML即可
<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Test</title>
<meta charset="utf-8">
</head>
<div>
<table style="font-family: Segoe UI, SegoeUIWF, Arial, sans-serif; font-size: 12px; color: #333333; border-spacing: 0; border-collapse: collapse; padding: 0; width: 580px; direction: ltr">
<tbody>
<tr style="background-color: #0078D4">
<td style="padding: 0">
<table style="font-family: Segoe UI, SegoeUIWF, Arial, sans-serif; border-spacing: 0; border-collapse: collapse; width: 100%">
<tbody>
<tr>
<td style="font-size: 38px; color: #FFFFFF; padding: 12px 22px 4px 22px" colspan="3">
Test
</td>
</tr>
<tr>
<td style="font-size: 20px; color: #FFFFFF; padding: 0 22px 18px 22px" colspan="3"
th:text="${username}+' 测试邮件'"> <!-- 注意这行 -->
用户 测试邮件
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
需要注意的是邮件里面写的HTML是有一定限制的,具体的可以百度,我这里用的是微软的模板。
解释一下th:text="${username}+' 测试邮件'"
。${username}
对应后面在Java中传递的参数的名字,解析之后会把“用户 测试邮件
”替换成“${username} 测试邮件
”,更多详细的解释可以搜一下thymeleaf的用法。
最后修改一下MailService
@Service
public class MailService {
@Value("${spring.mail.username}")
private String MailUserName;
private JavaMailSender javaMailSender;
private TemplateEngine templateEngine;
@Resource
public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
@Autowired
public void setTemplateEngine(TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
public void sendWelcomeMail() throws MessagingException {
Context context = new Context();
context.setVariable("username", "测试用户"); // 这里对应HTML中的${username}
String mailContent = templateEngine.process("mail/welcome", context); // 这里对应我们新建的HTML文件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
message.setFrom("Test<" + MailUserName + ">");
message.setTo("xxx@xxx.com");
message.setSubject("HTML解析测试邮件");
message.setText(mailContent, true);
javaMailSender.send(mimeMessage);
}
}
最后调用一下sendWelcomeMail()
就能查看效果咯。