前言
本文介绍了如何使用SpringBoot中的JavaMailSender发送邮件,包括配置发件箱相关参数以及如何结合模板引擎如Thymeleaf发送HTML邮件。
1、导入jar包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
2、配置文件中增加发件箱相关配置。
spring:
mail:
host: 163.com #SMTP服务器地址
port: 465 #SMTP服务器端口
username: [email protected] #发件人邮箱用户名
password: 6ku*jd5SbWamBatj #发件人邮箱密码
protocol: smtp #邮件协议
test-connection: true #启动时测试邮件服务器连接
properties:
mail:
smtp:
ssl:
enable: true #启用SSL
auth: true #启用SMTP认证
starttls:
enable: true #启用TLS
3、构建配置类对象。
package com.xx.web.core.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.Properties;
@Configuration
public class MailConfig {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.port}")
private int port;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.properties.mail.smtp.auth}")
private boolean auth;
@Value("${spring.mail.properties.mail.smtp.starttls.enable}")
private boolean starttls;
@Value("${spring.mail.properties.mail.smtp.ssl.enable}")
private boolean ssl;
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
Properties properties= mailSender.getJavaMailProperties();
properties.put("mail.smtp.auth", auth);
properties.put("mail.smtp.starttls.enable", starttls);
properties.put("mail.smtp.ssl.enable", ssl);
return mailSender;
}
}
4、注入配置项,发送邮件。
package com.xx.web.service;
import com.xx.common.exception.BusinessException;
import com.xx.system.utils.CoreUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.nio.charset.StandardCharsets;
import java.util.Date;
@Service
@Lazy
public class MailService {
@Value("${spring.mail.username}")
private String username;
@Autowired
private JavaMailSender javaMailSender;
@Autowired
TemplateEngine templateEngine;
/**
* 验证码模板
*/
private static final String TMPL_VERIFICATION_CODE = "mail/verificationCode.html";
private static final String SIGN_NAME = "xx公司";
/**
* 使用template模板发送验证码
* @param mail
* @return
*/
public String sendVerificationCode(String mail) {
String checkCode = CoreUtils.randomString(6, true);
MimeMessage message = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name());
// 邮件主题
helper.setSubject("主题");
// 需要与发件箱一致
helper.setFrom(username);
// 收件人
helper.setTo(mail);
// 设置发送时间
helper.setSentDate(new Date());
// 设置变量
Context context = new Context();
context.setVariable("checkCode", checkCode);
context.setVariable("signName", SIGN_NAME);
String process = templateEngine.process(TMPL_VERIFICATION_CODE, context);
helper.setText(process, true);
} catch (MessagingException e) {
throw new BusinessException(e.getMessage(), e);
}
javaMailSender.send(message);
return checkCode;
}
}
MimeMessageHelper 中 multipartMode 各个值介绍:
-
MULTIPART_MODE_NO (0):
- 这表示消息不应该是多部分的,即它应该是一个简单的消息,没有附件或其他相关部分。
- 当使用此模式时,消息体应该只包含文本或HTML内容。
-
MULTIPART_MODE_MIXED (1):
- 这表示消息应该是多部分的,并且包含混合类型的内容。
- 当使用此模式时,消息可以包含多个部分,比如文本内容、HTML内容和附件。
- 在此模式下,邮件的各个部分是独立的,附件不会嵌入到HTML内容中。
-
MULTIPART_MODE_RELATED (2):
- 这表示消息应该是多部分的,并且包含相关的HTML内容。
- 当使用此模式时,消息通常包含HTML内容和与其相关的资源,如内嵌图片。
- 在此模式下,相关资源(如图片)会嵌入到HTML内容中,并且通常会有一个
Content-Id
来引用这些资源。
-
MULTIPART_MODE_MIXED_RELATED (3):
- 这表示消息应该是多部分的,并且既包含混合类型的内容,也包含相关的HTML内容。
- 当使用此模式时,消息可以包含文本内容、HTML内容和附件,同时HTML内容可以包含内嵌的资源。
- 这是发送包含内嵌图片和附件的HTML邮件时常用的模式。
5、调整发送内容模板。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p>【<span th:text="${signName}"></span>】您的验证码为:<span th:text="${checkCode}"></span>,请勿泄漏!如非本人操作,请忽略!</p>
</body>
</html>
参考:IO
标签:Springboot,import,springframework,ThymeLeaf,HTML,private,org,mail,邮件 From: https://blog.csdn.net/qq_38817868/article/details/141020687