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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:12:26