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
相关产品推荐
相关产品推荐

