Laravel使用AWS SES发邮件遇403 SignatureDoesNotMatch错误求助
排查Laravel + AWS SES 403 SignatureDoesNotMatch错误
我之前也碰到过一模一样的问题,结合你的描述,咱们一步步来排查根源:
最可能的核心问题:混淆了SMTP凭证和IAM访问密钥
你提到是从SES控制台的SMTP设置>创建我的SMTP凭证生成的密钥,但这里要注意:
- Laravel使用
aws/aws-sdk-php调用SES API时,需要的是AWS IAM用户的Access Key ID和Secret Access Key,而不是SES的SMTP凭证! - SES的SMTP凭证是给传统SMTP客户端(比如PHPMailer)用的,它的密码是AWS生成的特殊字符串,和IAM用户的Secret Access Key完全不同,用它来调用SES API必然会出现签名不匹配的错误。
之前测试账号能正常工作,大概率是你当时误打误撞用了IAM的密钥,而非SMTP凭证。
具体排查&解决步骤
1. 创建/配置正确的IAM用户
- 登录AWS控制台,进入IAM服务,创建一个新的IAM用户(或使用现有用户),给用户添加SES相关权限:
- 最简单的方式是附加
AmazonSESFullAccess策略(生产环境建议自定义更严格的策略,仅允许ses:SendRawEmail、ses:SendEmail等必要操作) - 自定义策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendRawEmail", "ses:SendEmail" ], "Resource": "*" } ] }
- 最简单的方式是附加
- 生成该IAM用户的Access Key ID和Secret Access Key,把这两个值替换到你的
.env文件中:SES_KEY=你的IAM Access Key ID SES_SECRET=你的IAM Secret Access Key SES_REGION=us-east-1
2. 清除Laravel配置缓存
生产环境Laravel会缓存配置,新的.env值可能没生效,执行以下命令:
php artisan config:clear php artisan cache:clear
3. 检查服务器时间同步
AWS的签名验证依赖于准确的时间,如果服务器时间和AWS时间偏差超过5分钟,也会触发SignatureDoesNotMatch错误:
- 用
date命令查看服务器时间,对比当前UTC时间 - 如果偏差较大,安装并启动NTP服务同步时间(比如
apt install ntp或yum install ntp)
4. 确认SES区域与配置一致
确保.env中的SES_REGION和你新账号SES服务所在的区域完全一致(你当前用的us-east-1如果是正确的就不用改)
额外验证
你已经通过SES控制台能发送邮件,说明SES服务本身、域名/邮箱验证都是正常的,重点就放在凭证类型和IAM权限上,按照上面的步骤操作后应该就能解决问题了。
内容的提问来源于stack exchange,提问作者kenfai
相关产品推荐
相关产品推荐

