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

使用Java通过Amazon SES SMTP发送邮件失败求助

解决亚马逊SES SMTP Java发送邮件失败的问题

看起来你已经做了基础配置,但还是卡壳了,结合你给出的信息,我整理了几个针对性的排查和解决方向:

1. 先把完整日志打出来是核心

你提到日志只显示DEBUG: JavaMa...,这明显是日志被截断了。JavaMail的debug日志包含了SMTP连接、认证、邮件发送全流程的细节,是定位问题的关键。你可以通过两种方式开启全量debug:

  • 在代码里添加配置:
    props.put("mail.debug", "true");
    
  • 或者启动程序时加JVM参数:-Dmail.debug=true
    拿到完整日志后,就能看到具体是认证失败、连接超时还是邮件内容不符合SES规范。

2. 核对SMTP核心配置细节

  • 端口与加密方式必须匹配:AWS SES的SMTP端口有两个选项,对应不同的加密配置,千万别搞混:
    • 端口587:必须开启STARTTLS,代码里要确保有props.put("mail.smtp.starttls.enable", "true");
    • 端口465:必须用SSL加密,对应配置是props.put("mail.smtp.ssl.enable", "true");
      要是用587却没开STARTTLS,大概率会卡在连接阶段。
  • SMTP凭证别搞混:SES的SMTP用户名/密码不是你的AWS账号密码,也不是IAM的Access Key/Secret Key,是需要在IAM控制台专门生成的SES SMTP凭证。你可以去IAM -> 用户 -> 安全凭证 -> "生成SMTP凭证"里确认,用错凭证肯定会认证失败。

3. 确认SES沙盒模式限制

新注册的SES账号默认处于沙盒模式,有两个硬性限制:

  • 发件人必须是已验证的身份
  • 收件人也必须是已验证的身份(不能给陌生邮箱发邮件)
    你可以去SES控制台的"已验证身份"页面,确认发件人和收件人邮箱的状态都是"已验证",且没有被禁用。

4. 排查依赖冲突问题

你用的com.sun.mail:javax.mail:1.6.1本身没问题,但要注意项目里有没有其他邮件相关的依赖冲突,比如同时引入了javax.mail:javax.mail-api或者其他版本的mail包。可以用Maven命令排查依赖树:

mvn dependency:tree

如果发现冲突,用<exclusions>标签把冲突依赖排除,比如:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.1</version>
    <exclusions>
        <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

5. 检查网络连通性

最后排查下网络问题:你的运行环境(本地/服务器)能不能连接到SES的SMTP主机?可以用telnet测试:

telnet 你的SES SMTP主机 587

比如美国东部1区的主机是email-smtp.us-east-1.amazonaws.com,如果telnet连不上,说明防火墙、安全组或者网络运营商挡住了587/465端口,需要开放对应端口的出站权限。

先按这些步骤排查,尤其是完整日志,拿到具体报错后就能更精准地解决问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:24