Laravel集成AWS SES邮件发送成功但收件箱未收到问题排查求助
AWS SES发送成功但收件箱未收到邮件的排查建议(Laravel Vapor环境)
以下是针对你的场景的具体排查步骤:
1. 核查AWS SES的邮件实际发送状态
- 登录AWS SES控制台,进入「邮件发送」>「发送统计」,确认是否有对应时间的发送请求记录,同时查看是否存在软退信、硬退信或投诉数据
- 进入「邮件轨迹」页面,输入收件邮箱进行搜索,查看邮件的完整流向:是否被收件服务商标记为垃圾邮件、拦截,或是SES未实际发出
2. 验证IAM用户权限完整性
- 确认你的IAM用户已被授予
ses:SendEmail和ses:SendRawEmail权限——Laravel发送的富文本/带附件邮件可能调用SendRawEmail接口,仅配置SendEmail会导致隐性失败 - 在IAM控制台查看该用户的权限策略,确保包含类似如下的允许规则:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail" ], "Resource": "*" } ] }
3. 补全Laravel与Vapor的配置细节
- 确认.env或Vapor环境变量中配置了
AWS_DEFAULT_REGION——SES是区域服务,若未指定区域,SDK可能使用默认区域,但你的SES服务可能在其他区域激活,导致发送请求投递到错误区域 - 检查Vapor仪表盘的环境变量,确认
MAIL_MAILER已设置为ses(Vapor环境变量优先级高于本地.env) - 在Vapor中临时设置
LOG_LEVEL=debug,触发密码重置后查看详细日志,核对Laravel调用SES时的收件人、发件人参数是否正确,是否存在未捕获的警告信息
4. 排查收件邮箱的邮件拦截规则
- 检查收件邮箱的「垃圾邮件」「垃圾箱」「归档」文件夹,部分邮件服务商可能自动归类此类触发邮件
- 用
MAIL_FROM_ADDRESS对应的邮箱给收件邮箱发送一封普通测试邮件,确认双方邮件通道未被收件服务商拦截
5. 确认SES发件人验证与域名配置
- 确保
MAIL_FROM_ADDRESS是SES控制台中已验证的邮箱或域名——即使脱离沙箱环境,发件人必须为已验证身份(除非你完成了域名验证并通过生产访问审核) - 若使用域名作为发件人,检查DKIM、SPF记录是否在DNS服务商处正确配置,SES控制台提供了对应的验证工具可确认记录生效状态
6. 绕过Laravel直接测试SES接口
- 在Vapor环境中执行一段简单的AWS SDK测试代码,直接调用SES发送邮件,排除Laravel框架层面的问题:
use Aws\Ses\SesClient; $client = new SesClient([ 'version' => 'latest', 'region' => env('AWS_DEFAULT_REGION'), 'credentials' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), ], ]); $result = $client->sendEmail([ 'Destination' => ['ToAddresses' => ['your-target-email@example.com']], 'Message' => [ 'Body' => ['Text' => ['Data' => '测试邮件:直接调用SES接口']], 'Subject' => ['Data' => 'SES接口测试'], ], 'Source' => env('MAIL_FROM_ADDRESS'), ]); var_dump($result);
7. 检查Laravel邮件队列状态
- 若Laravel配置了邮件队列(如
MAIL_QUEUE=database),确认Vapor环境中的队列服务是否正常运行——邮件可能被放入队列但未被处理,导致返回成功但实际未发送 - 可临时将
MAIL_QUEUE设置为sync,测试邮件是否能立即发送
内容的提问来源于stack exchange,提问作者devsead
相关产品推荐
相关产品推荐

