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

Spring MVC集成JavaMail发送邮件无报错但失败求助

问题排查与解决方案

1. 核心问题定位

日志显示已连接smtp.gmail.com并准备启动TLS,但无邮件发送动作,说明SMTP握手成功,但邮件发送请求未被触发或执行过程中静默失败。

2. 配置项检查

POM.xml依赖验证

确保Spring Mail相关依赖完整,版本与Spring MVC匹配,避免依赖冲突:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

Dispatcher-servlet.xml邮件配置检查

确认JavaMailSender关键参数配置正确,尤其是谷歌邮箱的认证方式:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com"/>
    <property name="port" value="587"/>
    <property name="username" value="your-email@gmail.com"/>
    <!-- 谷歌邮箱需用应用专用密码,不是原账号密码(需先开启两步验证) -->
    <property name="password" value="your-app-specific-password"/>
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
            <!-- 开启调试日志,查看完整SMTP交互过程 -->
            <prop key="mail.smtp.debug">true</prop>
        </props>
    </property>
</bean>

3. 代码逻辑检查

ContactController验证

确保控制器正确调用发送方法,且不静默吞掉异常:

@RequestMapping(value="/contact", method=RequestMethod.POST)
public String processContact(@ModelAttribute("contact") Contact contact, Model model) {
    // 校验必填字段非空
    if(contact.getEmail() == null || contact.getMessage().trim().isEmpty()) {
        model.addAttribute("error", "必填字段不能为空");
        return "contact";
    }
    try {
        contactDAO.sendMail(contact);
        model.addAttribute("success", "邮件发送成功");
    } catch (Exception e) {
        // 必须输出异常日志,禁止仅捕获不处理
        e.printStackTrace();
        model.addAttribute("error", "邮件发送失败");
    }
    return "contact";
}

ContactDAO实现检查

确认注入JavaMailSender并调用发送方法:

@Autowired
private JavaMailSender mailSender;

public void sendMail(Contact contact) throws MessagingException {
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    
    helper.setFrom(contact.getEmail());
    helper.setTo("your-receive-email@gmail.com");
    helper.setSubject("联系表单消息:" + contact.getSubject());
    helper.setText("发送人邮箱:" + contact.getEmail() + "\n消息内容:" + contact.getMessage());
    
    // 关键:必须调用send方法触发邮件发送
    mailSender.send(message);
}

JSP页面表单验证

确保表单字段与实体类属性匹配,且无JS拦截提交:

<form:form modelAttribute="contact" method="POST" action="/contact">
    <form:input path="email" placeholder="你的邮箱"/>
    <form:input path="subject" placeholder="主题"/>
    <form:textarea path="message" placeholder="消息内容"/>
    <button type="submit">发送</button>
</form:form>

4. 调试技巧

  • 开启SMTP调试日志:通过mail.smtp.debug=true获取完整SMTP命令交互日志,确认是否执行了MAIL FROM、RCPT TO、DATA等核心命令
  • 独立测试邮件发送:编写测试类直接调用JavaMailSender发送邮件,排除控制器和DAO的逻辑干扰
  • 检查谷歌账号权限:未开启两步验证需允许"不太安全的应用访问";开启两步验证必须使用应用专用密码

内容的提问来源于stack exchange,提问作者Demba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:00:55