使用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,大概率会卡在连接阶段。
- 端口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
相关产品推荐
相关产品推荐

