Spring Boot Starter Mail发送邮件遇SMTP连接异常及超时问题求助
配置信息(application.properties)
email.username=sender@me.us <== 用于“FROM”字段 spring.mail.host=mail.4da.us <== 不确定是否需要? spring.mail.port=465 spring.mail.username=sender@me.us spring.mail.password=<我的登录密码> spring.mail.properties.mail.transport.protocol=smtp spring.mail.properties.mail.host=mail.4da.us spring.mail.properties.mail.smtp.port=465 spring.mail.properties.mail.smtp.auth=true
邮件发送代码
import org.springframework.mail.javamail.JavaMailSender; @Autowired private JavaMailSender javaMailSender; ... try { SimpleMailMessage mailMessage = new SimpleMailMessage(); // 设置必要信息 mailMessage.setFrom(EMAIL_USERNAME); mailMessage.setReplyTo(EMAIL_USERNAME); mailMessage.setSentDate(new Date()); mailMessage.setTo(emailRequest.getEmailAddress()); mailMessage.setText(buildMessage(emailRequest)); mailMessage.setSubject(SUBJECT); // 发送邮件 logger.info("发送邮件 {}", mailMessage); javaMailSender.send(mailMessage); catch (Exception e) { logger.error("邮件发送失败。错误信息: " + e.getMessage()); } ...
异常信息
首次触发的异常:
邮件发送失败。错误信息: 邮件服务器连接失败;
嵌套异常为javax.mail.MessagingException: 从SMTP主机mail.4da.us(端口465)收到无效问候,响应: [EOF]。发送失败的消息: javax.mail.MessagingException: 从SMTP主机mail.4da.us(端口465)收到无效问候,响应: [EOF]
添加超时配置后触发的异常:
邮件发送失败。错误信息: 邮件服务器连接失败;
嵌套异常为javax.mail.MessagingException: 读取响应时出现异常; 嵌套异常为: java.net.SocketTimeoutException: 读取超时。发送失败的消息: javax.mail.MessagingException: 读取响应时出现异常;
已完成的排查动作
- 与托管服务商确认配置无误,该邮箱账号可在本地正常收发邮件
- 尝试在SMTP地址前添加
smtp前缀,提示地址未找到 - 通过telnet测试端口连通性,结果正常:
telnet mail.4da.us 465正在尝试35.215.124.126... 已连接到mail.4da.us。转义字符为'^]'。
解决方案建议
1. 启用SSL加密(端口465强制要求)
端口465是SMTP over SSL的默认端口,当前配置缺少SSL相关参数,导致连接后无法完成握手,进而出现EOF或超时错误。添加以下配置:
spring.mail.properties.mail.smtp.ssl.enable=true spring.mail.properties.mail.smtp.ssl.trust=mail.4da.us
2. 简化配置,避免重复设置冲突
spring.mail.host和spring.mail.port属于Spring Boot顶层配置,会覆盖spring.mail.properties下的对应重复项。建议简化配置如下:
email.username=sender@me.us spring.mail.host=mail.4da.us spring.mail.port=465 spring.mail.username=sender@me.us spring.mail.password=<你的登录密码> spring.mail.properties.mail.transport.protocol=smtp spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.ssl.enable=true spring.mail.properties.mail.smtp.ssl.trust=mail.4da.us # 可选超时配置 spring.mail.properties.mail.smtp.connectiontimeout=5000 spring.mail.properties.mail.smtp.timeout=3000 spring.mail.properties.mail.smtp.writetimeout=5000
3. 验证发件人地址与SMTP账号一致性
确保mailMessage.setFrom()使用的地址和spring.mail.username完全匹配,部分邮件服务器会严格验证发件人地址与登录账号的一致性。
4. 排查应用环境的网络限制
虽然telnet能连通,但Java应用可能受限于容器防火墙、公司网络代理等限制,需确认应用所在环境允许465端口的SSL出站连接。
内容的提问来源于stack exchange,提问作者sonoerin

