You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:25:25