Spring Boot 3.0.0 发送邮件报错IMAPProvider not a subtype 求助
Spring Boot 3 + Thymeleaf 联系表单邮件发送错误解决
使用Spring Boot 3.0.0和Thymeleaf开发本地联系表单,提交消息时触发以下错误:
javax.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype java.util.ServiceConfigurationError: javax.mail.Provider: com.sun.mail.imap.IMAPProvider not a subtype
当前配置与代码
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency>
MessageInfoDto类
public class MessageInfoDto { private String name; private String email; private String text; public String getName() { return name; } public String getEmail() { return email; } public String getText() { return text; } public void setName(String name) { this.name = name; } public void setEmail(String email) { this.email = email; } public void setText(String text) { this.text = text; } }
控制器类
@Controller public class MessageInfoController { MessageInfoService messageInfoService; public MessageInfoController(MessageInfoService messageInfoService) { this.messageInfoService = messageInfoService; } @GetMapping("/contact") public String emialForm(Model model) { model.addAttribute("message", new MessageInfoDto()); return "contact"; } @PostMapping("/send") public String getMessage(MessageInfoDto message) { messageInfoService.sendEmail(message); return "redirect:/contact"; } }
服务类
@Service public class MessageInfoService { private final JavaMailSender mailSender; @Value("${spring.mail.username}") private String owner; public MessageInfoService(JavaMailSender mailSender) { this.mailSender = mailSender; } public void sendEmail(MessageInfoDto message) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setTo(owner); simpleMailMessage.setFrom(message.getEmail()); simpleMailMessage.setText(message.getText()); simpleMailMessage.setSubject("New Message"); simpleMailMessage.setReplyTo(message.getEmail()); mailSender.send(simpleMailMessage); } }
contact.html页面
<body> <main class="main-content" layout:fragment="content"> <h2 class="list-heading">Send us a message</h2> <form action="#" th:action="@{/send}" method="post" enctype="multipart/form-data" class="mc-form" th:object="${message}"> <label for="name">Your Name</label> <input type="text" id="name" placeholder="Your Name" th:field="*{name}" required> <label for="email">Your e-mail</label> <input type="text" id="email" placeholder="e-mail" th:field="*{email}"> <label for="message">Your message</label> <textarea id="message" rows="10" th:field="*{text}"></textarea> <button type="submit">Send</button> </form> </main> </body>
application.yml配置
spring: mail: host: smtp.gmail.com port: 587 username: 10*****@gmail.com password: [genereted password] properties: smtp: auth: true starttles: enable: true required: true
解决方案
1. 移除冲突的邮件依赖
Spring Boot 3基于Jakarta EE 9,使用jakarta.mail相关API,手动引入的com.sun.mail:javax.mail是旧Java EE时代的javax.mail包,两者类路径冲突导致错误。
直接删除pom.xml中的com.sun.mail:javax.mail依赖:
<!-- 移除该依赖 --> <!-- <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> -->
spring-boot-starter-mail已包含适配Spring Boot 3的Jakarta Mail实现,无需额外引入。
2. 修正application.yml配置错误
配置中的starttles是拼写错误,改为starttls:
spring: mail: host: smtp.gmail.com port: 587 username: 10*****@gmail.com password: [genereted password] properties: smtp: auth: true starttls: # 修正拼写 enable: true required: true
3. 额外优化建议
- 表单无文件上传需求,可移除
enctype="multipart/form-data",使用默认的application/x-www-form-urlencoded即可,减少不必要的解析开销。 - 确认Gmail应用专用密码已正确生成,且账号已开启对应权限(推荐使用App Password而非“不太安全的应用访问”)。
内容的提问来源于stack exchange,提问作者LadySylwia
相关产品推荐
相关产品推荐

