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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:19:07