Spring Framework 自己有一套基于 JavaMail
的邮件服务包 org.springframework.mail
,并通过 JavaMailSender 接口提供了一种简易的发送邮件的方式。这样,开发人员就可以不用操心底层的邮件系统,使用 Spring 提供的接口即可方便地使用邮件服务。官方文档:https://docs.spring.io/spring/docs/5.0.10.RELEASE/spring-framework-reference/integration.html#mail
而在 SpringBoot 中,提供了更为简便的自动配置,又进一步简化了开发人员工作。官方文档:https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#boot-features-email 。下面介绍一下 SpringBoot 中配置邮件服务的具体方法。
想要使用 SpringBoot 的邮件服务,需要依赖 spring-boot-starter-mail
。所以在 pom 中添加依赖。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-mailartifactId>
dependency>
spring:
mail:
# 邮件服务地址
host: smtp.163.com
# 端口
port: 25
# 编码格式
default-encoding: utf-8
# 用户名
username: [email protected]
# 授权码
password: xxx
# 其它参数
properties:
mail:
smtp:
# 如果是用 SSL 方式,需要配置如下属性
starttls:
enable: true
required: true
mail.smtp.starttls.enable
为 true。有关详细的参数说明见文档https://javaee.github.io/javamail/#Development_Releases有关 SpringBoot 中 auto-configuration 的参数见源码:MailProperties.java
MailService.java
@Service
public class MailService {
private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
@Autowired
private JavaMailSender mailSender;
private static final String SENDER = "[email protected]";
/**
* 发送普通邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendSimpleMailMessge(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(SENDER);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
} catch (Exception e) {
logger.error("发送简单邮件时发生异常!", e);
}
}
/**
* 发送 HTML 邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendMimeMessge(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
} catch (MessagingException e) {
logger.error("发送MimeMessge时发生异常!", e);
}
}
/**
* 发送带附件的邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param filePath 附件路径
*/
@Override
public void sendMimeMessge(String to, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
helper.addAttachment(fileName, file);
mailSender.send(message);
} catch (MessagingException e) {
logger.error("发送带附件的MimeMessge时发生异常!", e);
}
}
/**
* 发送带静态文件的邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param rscIdMap 需要替换的静态文件
*/
@Override
public void sendMimeMessge(String to, String subject, String content, Map<String, String> rscIdMap) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
for (Map.Entry<String, String> entry : rscIdMap.entrySet()) {
FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
helper.addInline(entry.getKey(), file);
}
mailSender.send(message);
} catch (MessagingException e) {
logger.error("发送带静态文件的MimeMessge时发生异常!", e);
}
}
}
@Autowired
自动注入 JavaMailSender 类,这个类已经自动被 Spring 容器管理了。其中的属性配置即为 yml 中的配置,SpringBoot 已经在项目启动的时候帮我们 auto-configuration 了。
这里我封装了4种发送邮件的方法。
helper.addInline
方法将 html 文件中,资源属性的 cid 替换成对应的文件。详见第3章中测试用例。SpringbooEmailDemoApplicationTests.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbooEmailDemoApplicationTests {
@Autowired
private MailService mailService;
private static final String TO = "[email protected]";
private static final String SUBJECT = "主题 - 测试邮件";
private static final String CONTENT = "Testing Testing Testing";
/**
* 测试发送普通邮件
*/
@Test
public void sendSimpleMailMessage() {
mailService.sendSimpleMailMessge(TO, SUBJECT, CONTENT);
}
/**
* 测试发送html邮件
*/
@Test
public void sendHtmlMessage() {
String htmlStr = "Test
";
mailService.sendMimeMessge(TO, SUBJECT, htmlStr);
}
/**
* 测试发送带附件的邮件
* @throws FileNotFoundException
*/
@Test
public void sendAttachmentMessage() throws FileNotFoundException {
File file = ResourceUtils.getFile("classpath:testFile.txt");
String filePath = file.getAbsolutePath();
mailService.sendMimeMessge(TO, SUBJECT, CONTENT, filePath);
}
/**
* 测试发送带附件的邮件
* @throws FileNotFoundException
*/
@Test
public void sendPicMessage() throws FileNotFoundException {
String htmlStr = "测试:图片1
图片2
";
Map<String, String> rscIdMap = new HashMap<>(2);
rscIdMap.put("pic1", ResourceUtils.getFile("classpath:pic01.jpg").getAbsolutePath());
rscIdMap.put("pic2", ResourceUtils.getFile("classpath:pic02.jpg").getAbsolutePath());
mailService.sendMimeMessge(TO, SUBJECT, htmlStr, rscIdMap);
}
}
SpringBoot 中提供了简易的配置方法和简单的接口,极大方便了开发者在应用中开发有关发送邮件的服务。以上,就是 SpringBoot 中配置邮件服务的操作。
项目 Demo 地址:springboot-email-demo
站在前人的肩膀上前行,感谢以下博客及文献的支持。