【问题标题】:Amazon SES 403 Forbidden SignatureDoesNotMatch using Laravel 5.3使用 Laravel 5.3 的 Amazon SES 403 禁止 SignatureDoesNotMatch
【发布时间】:2017-10-27 02:10:50
【问题描述】:

我正在使用 Laravel 5.3、EC2 和 SES 发送电子邮件。

配置/mail.php

'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),

.env 有

MAIL_DRIVER=ses
MAIL_HOST=email-smtp.us-west-2.amazonaws.com
MAIL_PORT=25
MAIL_ENCRYPTION=TLS
SES_KEY='AKIA------DZQ5TYQ'
SES_SECRET=AhN8d----------------ZbBq7TNBmhNnosfYbasg6Q
SES_REGION='us-west-2'

composer.json

"require": {
    "aws/aws-sdk-php": "~3.0", 
}

EC2 托管在孟买,SES 托管在美国西部。我尝试了以下方法:
1) 创建新的 IAM 用户并使用新的密钥/秘密。
2) 创建根用户密钥/秘密。
3) 运行 NTPDATE 命令。
4) php artisan cache:clear , config:clear, view:clear, dump-autoload
5) 我还在 .env 中使用了 sparkpost,这也给出了错误 403:forbidden。

我仍然看到以下错误:

[2017-05-26 06:02:00] local.ERROR: exception 'Aws\Ses\Exception\SesException' with message 'Error executing "SendRawEmail" on "https://email.us-west-2.amazonaws.com"; AWS HTTP error: Client error: `POST https://email.us-west-2.amazonaws.com` resulted in a `403 Forbidden` response:
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDo (truncated...)
 SignatureDoesNotMatch (client): The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

此处完全错误:https://pastebin.com/KSJinB1E

【问题讨论】:

  • 这可能会有所帮助。 docs.aws.amazon.com/ses/latest/DeveloperGuide/… >> 您的 SMTP 用户名和密码与您的 AWS 访问密钥 ID 和秘密访问密钥不同。不要尝试使用您的 AWS 凭证针对 SMTP 终端节点对您自己进行身份验证。只是想确保你尝试过这个。
  • 是的。这个做完了。我正在使用 IAM 凭证。请检查 SES_KEY 和 SES_SECRET。这是 IAM 用户的凭证。
  • 您提到您运行了 ntpdate,但没有运行输出?你确定你没有时钟偏差? ntpstat 的输出是什么?
  • 嗨@Robo。谢谢回复! $ sudo ntpdate -u ntp.ubuntu.com 5 月 28 日 07:01:54 ntpdate[9904]:调整时间服务器 91.189.89.199 偏移量 0.000914 秒 $ sudo ntpstat 无法与 NTP 守护进程对话。运行了吗?

标签: amazon-web-services laravel-5 amazon-ec2 aws-sdk amazon-ses


【解决方案1】:

对我来说,我必须在 .env 文件中指定与在 Amazon SES 中验证的相同的电子邮件地址。

【讨论】:

    【解决方案2】:

    您不需要 SMTP 用户名/密码,只需使用 IAM 密钥和密码即可让您在 Laravel 中登录 SES...

    您似乎在键和区域中添加了必要的引号,它们应该是:

    SES_KEY=AKIA------DZQ5TYQ
    SES_SECRET=AhN8d----------------ZbBq7TNBmhNnosfYbasg6Q
    SES_REGION=us-west-2
    

    如果不是这样,请确保您的 IAM 用户具有 SES 写入 权限:

    【讨论】:

      【解决方案3】:

      1) 检查您的服务器或本地计算机的“日期和时间”是否是最新的。

      2) 检查 config/mail.php 如下

      'driver'    => env('MAIL_DRIVER', 'ses'),
      'host'      => env('MAIL_HOST'),
      'port'      => env('MAIL_PORT', 587),
      'encryption'=> env('MAIL_ENCRYPTION', 'tls'),
      'username'  => env('MAIL_USERNAME'),
      'password'  => env('MAIL_PASSWORD'),
      'sendmail'  => '/usr/sbin/sendmail -bs',
      

      3) 检查您的 .env 文件,如下所示

      MAIL_DRIVER=ses
      MAIL_HOST=email-smtp.us-east-1.amazonaws.com
      MAIL_PORT=587
      MAIL_USERNAME=[your AMI KEY]
      MAIL_PASSWORD=[your AMI SECRET]
      MAIL_ENCRYPTION=tls
      

      4) 检查您的 Config/Services.php 文件,如下所示

      'ses' => [
          'key' => env('MAIL_USERNAME'),
          'secret' => env('MAIL_PASSWORD'),
          'region' => 'us-east-1',// change to your AWS region
      ],
      

      不要使用 amazon ses smtp 凭据作为 MAIL_USERNAME 和 MAIL_PASSWORD

      【讨论】:

      • 您最后关于不使用 SES 用户凭据的注释正是我所需要的...手动创建具有相同权限的新用户并使用这些凭据解决了我的问题
      【解决方案4】:

      我也在 laravel 中使用 'ses' MAIL_DRIVER 并且遇到了与 OP 完全相同的问题。对我来说,问题是我正在使用的 IAM 用户——我使用了 SES 向导为我创建的那个,它工作了一段时间,但后来停止了。我所要做的就是修复它,创建一个具有"ses:SendRawEmail" 权限的新“程序访问”IAM 用户,然后电子邮件开始流动。

      【讨论】:

      • 我还必须检查“AWS 管理控制台访问”,以便获取用户名和密码。所以以下 .env 设置对我有用:``` MAIL_USERNAME=[IAM USERNAME] MAIL_PASSWORD=[IAM PASSWORD] SES_KEY=[SMTP USERNAME] SES_SECRET=[SMTP PASSWORD] ```
      【解决方案5】:

      一开始我对 Laravel 并不熟悉。但是,如果您使用 SMTP,则需要指定 MAIL_USERNAMEMAIL_PASSWORD。此外,驱动程序应该是SMTP 而不是SES,因为您使用的是 SES 的 SMTP 主机。

      文档链接 - http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-credentials.html 应该为您提供生成不同于您的 AWS IAM 凭证的 SMTP 凭证的方法。

      简而言之,您不是使用 SES SDK 而是使用 SMTP 来发送电子邮件。所以 SES_KEY 和 SES_SECRET 不行。

      【讨论】:

      • 你不需要 smtp 用户名/密码,只需使用密钥和密码就可以让你在 laravel 中登录 ...
      猜你喜欢
      • 1970-01-01
      • 2017-01-19
      • 2019-11-18
      • 2020-07-19
      • 2014-04-22
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多