.NET环境下使用AWS SES发送邮件成功但未收到的问题排查
先梳理下你遇到的核心矛盾:用AWS SES官方SDK示例代码,仅修改了邮箱地址,发件箱已完成验证,调用SendEmailAsync()后系统提示发送成功,但目标邮箱始终收不到邮件;之前在VS2017里用SendEmail()直接报错,改成异步方法后解决了报错,但收信问题依旧。
下面是几个你可以逐一排查的方向,都是这类问题的常见诱因:
1. 先确认你的SES账号是否处于沙箱模式
AWS SES新注册的账号默认会被限制在沙箱环境里,这个模式有两个关键限制很容易被忽略:
- 只能给已完成验证的邮箱/域名发送邮件——哪怕你的发件箱验证过了,收件箱如果没验证,是绝对收不到邮件的
- 每天发送限额只有200封,单小时发送速率被限制在1封/秒
你可以登录AWS控制台,进入SES服务,左侧导航栏找「沙箱」入口,查看当前状态,同时确认目标邮箱是否在「已验证的身份」列表里。如果收件箱没验证,要么先去完成验证,要么提交申请移出沙箱(需要提供你的业务使用场景说明)。
2. 查看SES的邮件投递日志,找具体原因
AWS SES会记录每一封邮件的全链路状态,你可以通过两个渠道查看:
- CloudWatch日志:进入CloudWatch服务,找到SES对应的日志组,里面会详细记录邮件是被拒收、进入垃圾邮件、还是投递成功但被收件方过滤
- SES控制台的「已发送邮件」页面:这里能看到每封邮件的状态标签(比如「投递成功」「软退信」「硬退信」),以及对应的原因描述
如果日志显示「投递成功」但收件箱没收到,大概率是被收件方的邮箱服务商当成垃圾邮件拦截了,这时候要检查:
- 邮件主题和内容有没有垃圾邮件特征(比如堆砌营销词汇、带陌生链接/附件)
- 发件邮箱的DKIM、SPF配置是否正确(沙箱模式下虽不强制,但配置到位能大幅提升送达率)
3. 检查SendEmailAsync()的异步调用是否正确
在VS2017里,如果你只是把SendEmail()改成SendEmailAsync(),但没正确处理异步逻辑,可能会出现「系统提示发送成功」但实际请求没完成的情况。
确保你的调用代码是这样的:
// 必须用await等待异步操作完成,否则任务可能还没执行完程序就退出了 var response = await client.SendEmailAsync(sendEmailRequest); // 主动检查响应状态码,确认请求真的提交成功 if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) { Console.WriteLine("邮件发送请求已成功提交至SES"); } else { Console.WriteLine($"发送请求异常,状态码:{response.HttpStatusCode}"); }
如果没加await直接调用SendEmailAsync(),程序可能会跳过等待直接执行后续代码,表面上没报错,但邮件其实没真正发出去。
4. 检查目标邮箱的垃圾邮件/垃圾箱
有时候邮件确实投递成功了,但被收件方的邮箱服务商自动归类到垃圾箱或垃圾邮件文件夹里了。先去这些地方找找,别漏了。如果确实在垃圾箱里,可以把发件邮箱添加到收件方的联系人列表,或者标记为「非垃圾邮件」,后续的邮件就能正常进入收件箱了。
5. 再核对发件邮箱的验证状态
虽然你说发件邮箱已经验证,但还是建议再确认一遍:
- 发件邮箱是否在SES控制台的「已验证的身份」列表中,状态是否为「已验证」
- 如果是用域名发件,是否已经完成了DKIM、SPF的DNS配置(沙箱模式下域名发件也需要先验证域名)
内容的提问来源于stack exchange,提问作者peter




