SpringBoot邮件发送怎么玩?比官方自带的Mail更好用的三方工具

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

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-api
  • com.sun.mail:jakarta.mail
  • com.sun.activation:jakarta.activation
  • jakarta.xml.bind:jakarta.xml.bind-api
  • jakarta.annotation:jakarta.annotation-api
  • com.sanctionco.jmail:jmail (address validation)
  • com.pivovarit:throwing-function (improved Streams api)

GitHub地址:github.com/bbottema/si...

官网地址:www.simplejavamail.org/

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依赖

因为小编的本地JDK17,所以使用:

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提供了强大的邮件发送支持,而SMS4jSimple Java Mail则在此基础上提供了更多高级功能和更简洁的API

大家使用的时候,有没有遇到小编的问题呢?评论区留言。

相关推荐
一只乔哇噻1 分钟前
java后端工程师+AI大模型进修ing(研一版‖day59)
java·开发语言·算法·语言模型
武子康1 分钟前
Java-182 OSS 权限控制实战:ACL / RAM / Bucket Policy 与错误排查
java·数据库·阿里云·云计算·oss·fastdfs·fdfs
深圳佛手5 分钟前
Consul热更新的原理与实现
java·linux·网络
XL's妃妃8 分钟前
Java缓存全解析:概念、分类、Guava Cache、算法及对比
java·缓存·guava
聆风吟º10 分钟前
【Spring Boot 报错已解决】Spring Boot接口报错 “No converter found” 解决手册
java·spring boot·后端
ExiFengs11 分钟前
使用Java 8函数式编程优雅处理多层嵌套数据
java·开发语言·python
美味小鱼14 分钟前
DupFinder:一个用 Rust 编写的高性能重复文件查找工具
开发语言·后端·rust
写bug的小屁孩17 分钟前
1.Kafka-快速认识概念
java·分布式·kafka
Victor35619 分钟前
Redis(160)Redis的安全问题如何解决?
后端
linux修理工20 分钟前
vagrant file 设置固定IP并允许密码登录
java·linux·服务器