Spring Boot 2使用Amazon SES SMTP发送邮件时连接超时错误求助
嗨,我之前在Spring Boot项目里用AWS SES SMTP发邮件也碰到过类似的连接超时问题,给你整理几个实用的排查步骤,应该能帮你定位解决:
排查Spring Boot 2 + AWS SES SMTP连接超时问题
你提到使用spring-boot-starter-mail的JavaMailSender.send()方法时遇到连接超时,错误堆栈指向org.springframework.mail.MailSendException,可以从以下几个维度逐步排查:
1. 先确认AWS SES SMTP核心配置是否正确
首先检查你的application.properties(或application.yml)配置是否完全符合AWS SES要求,这是最容易踩坑的点:
- SMTP服务器地址:要对应你AWS账号所在区域,比如美国东部(弗吉尼亚北部)是
email-smtp.us-east-1.amazonaws.com,别写错区域地址 - 端口选择:AWS SES仅支持465(SSL加密)或587(TLS加密),不要用其他端口
- SMTP凭证:这里不是你的AWS账号密码,必须是在AWS控制台生成的SES专用SMTP凭证(路径:IAM -> 用户 -> 安全凭证 -> 访问密钥 -> 创建SMTP凭证)
- 加密配置:务必开启对应加密,配置示例:
# 用587端口时的配置 spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.ssl.trust=email-smtp.us-east-1.amazonaws.com # 用465端口时的配置 spring.mail.properties.mail.smtp.ssl.enable=true
2. 排查网络与防火墙限制
连接超时大概率是网络层面的拦截,建议做以下测试:
- 用命令测试连通性:比如
telnet email-smtp.us-east-1.amazonaws.com 587或nc -zv email-smtp.us-east-1.amazonaws.com 465,如果连不上,说明有防火墙、安全组或代理拦截 - 若部署在AWS EC2上:检查EC2安全组的出站规则,是否允许访问465/587端口
- 若在公司内网:联系IT团队开放对应端口的出站权限,或者配置代理(如果需要的话):
spring.mail.properties.mail.smtp.proxy.host=你的代理地址 spring.mail.properties.mail.smtp.proxy.port=你的代理端口
3. 检查AWS SES账号状态
虽然连接超时和账号状态关联度不高,但还是要确认:
- 你的SES账号是否已经移出沙箱环境(沙箱里的账号只能发送到验证过的邮箱,且有发送限额)
- 登录AWS SES控制台,查看“发送统计”和“事件通知”,确认账号没有被限制
4. 调整邮件发送超时参数
默认的超时时间可能太短,你可以在配置里延长超时时间:
spring.mail.properties.mail.smtp.connectiontimeout=10000 spring.mail.properties.mail.smtp.timeout=10000 spring.mail.properties.mail.smtp.writetimeout=10000
单位是毫秒,这里设置为10秒,可根据实际网络情况调整
5. 开启详细日志定位问题
开启JavaMail的debug日志,能看到SMTP连接、握手的完整过程,方便定位卡住的环节:
spring.mail.properties.mail.debug=true
日志会输出SMTP命令交互的细节,比如连接建立、TLS握手等步骤的状态
最后做个极简测试
如果以上步骤都排查过,可以写个简单的测试类,排除业务代码的干扰:
@SpringBootTest public class SesMailTest { @Autowired private JavaMailSender mailSender; @Test public void testSimpleSend() { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("你的验证邮箱@example.com"); message.setTo("测试接收邮箱@example.com"); message.setSubject("SES SMTP测试"); message.setText("这是一封测试邮件"); mailSender.send(message); } }
如果还是有问题,把完整的错误堆栈和debug日志贴出来,能更精准定位问题~
内容的提问来源于stack exchange,提问作者Marco Blos
相关产品推荐
相关产品推荐

