关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言
官方自带的spring-boot-starter-mail针对普通的文本邮件已经很方便了,但是针对附件、html等还是不太友好的。SpringBoot如果开启了监控spring-boot-starter-actuator,服务器会实时检测邮件服务器是否正常,如果服务器异常,就会反复重试,从而引起服务器的崩溃,不要问我怎么知道的,说多了都是泪。
而今天要介绍的三方库,针对复杂的邮件类型,应对起来游刃有余。
02 Simple Java Mail
2.1 简介

Simple Java Mail 是一个拥有超简洁 API 的邮件库。它是世界上使用起来最简便的(Java)邮件库,可通过 SMTP 发送电子邮件。这个库让你无需处理诸如MimeMessage之类的底层API、繁琐的trycatch结构、内部类以及其他无用的东西。它是一个功能强大、特性完备的邮件库,同时又小巧且轻量。
核心模块:

核心依赖:
org.slf4j:slf4j-apicom.sun.mail:jakarta.mailcom.sun.activation:jakarta.activationjakarta.xml.bind:jakarta.xml.bind-apijakarta.annotation:jakarta.annotation-apicom.sanctionco.jmail:jmail (address validation)com.pivovarit:throwing-function (improved Streams api)
GitHub地址:github.com/bbottema/si...
2.2 Maven依赖
xml
<dependency>
<groupId>org.simplejavamail</groupId>
<artifactId>simple-java-mail</artifactId>
<version>8.12.6</version>
</dependency>
2.3 案例
java
@Test
void test01() {
Mailer mailer = MailerBuilder
.withSMTPServer("smtp.163.com", 465,
"xxxx@163.com", "授权码"
)
.withTransportStrategy(TransportStrategy.SMTPS)
.buildMailer();
Email email = EmailBuilder.startingBlank()
.from( "xxxxx@163.com")
.to( "xxxx@126.com")
.withSubject("测试邮件")
.withHTMLText("<h1>测试邮件123</h1>")
.buildEmail();
mailer.sendMail(email);
}
通过MailerBuilder构建发送的客户端,通过EmailBuilder构建发送邮件的具体信息。
内容更是支持丰富:

还有其他的特性,可以自行探索。
2.4 注意事项
如果在项目中正常使用,客户端没有必要每次都创建,只需要注册到Spring容器中,随用随取。
java
@Bean
public Mailer inhouseMailer() {
return MailerBuilder
.withSMTPServer(...)
.buildMailer();
}
2.5 避坑指南
小编在使用8.12.6版本时,出现了一些包找不到的问题:

由于又引入两个依赖才解决问题:
xml
<dependency>
<groupId>jakarta.mail</groupId>
<artifactId>jakarta.mail-api</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>2.1.4</version>
</dependency>
从更新日志来看,v8.11.0已经升级了但部分依赖的版本:

但是,实际发现版本并没有升上去。

也有可能小编本地JDK的问题,这里就不细说了。总之问题通过升级版本可以解决。
03 SMS4J
3.1 简介

SMS4J为短信聚合框架,帮您轻松集成多家短信服务,解决接入多个短信SDK的繁琐流程。 SMS4J着重解决短信发送的问题,但是作者也将邮件的发送也融合了进去。并且拥有独立依赖。

GitHub地址:github.com/dromara/sms...
Gitee地址:gitee.com/dromara/sms...
官方文档:sms4j.com
3.2 Maven依赖
因为小编的本地JDK是17,所以使用:
xml
<dependency>
<groupId>org.dromara.sms4j</groupId>
<artifactId>sms4j-email-jakarta-core</artifactId>
<version>3.3.5</version>
</dependency>
3.3 案例
java
@Test
void test02() {
MailSmtpConfig config = MailSmtpConfig.builder()
.fromAddress("xxxx@163.com")
.smtpServer("smtp.163.com")
.port("465")
.username(xxx@163.com")
.password("授权码")
.build();
MailFactory.put("mailClient", config);
MailMessage message = MailMessage.Builder()
.mailAddress("xxxxx@126.com")
.title("测试邮件2")
.htmlContent("<h1>测试邮件 this is body</h1>")
.build();
// 发送邮件:指定黑名单
MailFactory.createMailClient("mailClient", () -> List.of("")).send(message);
}
MailSmtpConfig构建客户端的配置,通过MailFactory创建客户端。MailMessage构建邮件内容。邮件发送还支持黑名单。邮件内容支持多种模式:

使用的注意事项同上面的案例。
3.4 邮箱监听
邮箱监听可以监听到某个IMAP协议邮箱中收到的邮件,并对其进行一定的处理。小编在测试发现了异常。
java
@Test
void test03() throws IOException {
MailImapConfig config2 = new MailImapConfig();
config2.setImapServer("imap.163.com");
config2.setAccessToken("授权码");
config2.setUsername("xxxx@163.com");
MonitorFactory.put("ws_Monitor", config2, monitorMessage -> {
System.out.println(JSON.toJSONString(monitorMessage));
return true;
});
MonitorFactory.start("ws_Monitor");
// MonitorFactory.stop("ws_Monitor");
System.in.read();
}
但是执行的时候:

该问题未能解决。查阅资料,是因为邮箱因为安全问题被拒绝了。
04 小结
Spring Boot提供了强大的邮件发送支持,而SMS4j和Simple Java Mail则在此基础上提供了更多高级功能和更简洁的API。
大家使用的时候,有没有遇到小编的问题呢?评论区留言。