Spring Boot集成JavaMail引入dsn依赖后读取投递失败邮件报ClassNotFoundException
问题根源
你的Spring Boot版本属于2.x系列,默认使用javax.*命名空间的Java EE规范API,而高版本dsn依赖默认引入了jakarta.*命名空间的Activation API,和Spring Boot自带的javax.activation实现产生了包名冲突,导致类加载失败。
解决方案
步骤1:调整DSN依赖配置
修改dsn依赖,排除其自带的Jakarta Activation相关传递依赖,保持和Spring Boot starter-mail中的依赖版本兼容:
<dependency> <groupId>com.sun.mail</groupId> <artifactId>dsn</artifactId> <version>1.6.7</version> <exclusions> <exclusion> <groupId>jakarta.activation</groupId> <artifactId>jakarta.activation-api</artifactId> </exclusion> <exclusion> <groupId>com.sun.activation</groupId> <artifactId>jakarta.activation</artifactId> </exclusion> </exclusions> </dependency>
删除你额外添加的所有jakarta.activation相关依赖,Spring Boot的spring-boot-starter-mail已经自带了兼容的Activation实现,不需要额外引入。
步骤2:手动注册DSN内容处理器(可选,部分场景需要)
如果调整依赖后仍报错,可在项目启动类中添加DSN类型的内容处理器注册逻辑,避免类加载器找不到对应处理器:
import javax.activation.CommandMap; import javax.activation.MailcapCommandMap; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class YourApplication { public static void main(String[] args) { // 注册DSN邮件类型的内容处理器 MailcapCommandMap mailcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mailcap.addMailcap("message/delivery-status;; x-java-content-handler=com.sun.mail.dsn.DeliveryStatus"); mailcap.addMailcap("message/disposition-notification;; x-java-content-handler=com.sun.mail.dsn.DispositionNotification"); mailcap.addMailcap("multipart/report;; x-java-content-handler=com.sun.mail.dsn.MultipartReport"); CommandMap.setDefaultCommandMap(mailcap); SpringApplication.run(YourApplication.class, args); } }
步骤3:排查DevTools类加载问题
你的报错堆栈中出现了Spring Boot DevTools的RestartClassLoader,它的双类加载器机制可能会导致类加载冲突,可先在application.properties中添加配置禁用重启测试:
spring.devtools.restart.enabled=false
内容的提问来源于stack exchange,提问作者Christian Ibanibo
相关产品推荐
相关产品推荐

