使用Laravel 5.3的Amazon SES 403 Forbidden SignatureDoesNotMatch

时间:2017-05-26 08:41:45

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

我正在使用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)创建root用户密钥/秘密 3)运行NTPDATE命令 4)php artisan cache:clear,config:clear,view:clear,dump-autoload
5)我也在.env中使用了sparkpost,这也给出了错误403:禁止。

我仍然看到以下错误:

[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

5 个答案:

答案 0 :(得分:1)

我一开始并不熟悉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不会这样做。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

如果不是这种情况,请确保您的IAM用户具有 SES写入权限: AWS IAM user for SES

答案 4 :(得分:0)

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