使用 Laravel 5.3 的 Amazon SES 403 禁止 SignatureDoesNotMatch
Amazon SES 403 Forbidden SignatureDoesNotMatch using Laravel 5.3
我正在使用 Laravel 5.3、EC2 和 SES 发送电子邮件。
config/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 托管在 us-west。我尝试了以下方法:
1) 创建新的 IAM 用户并使用新的 key/secret.
2) 创建root用户key/secret.
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.
一开始我不熟悉Laravel。但是,如果您使用的是 SMTP,则需要指定 MAIL_USERNAME
和 MAIL_PASSWORD
。此外,驱动程序应该是 SMTP
而不是 SES
,因为您使用的是 SES 的 SMTP 主机。
文档 link - http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-credentials.html 应该为您提供生成不同于 AWS IAM 凭证的 SMTP 凭证的方法。
简而言之,您使用的不是SES SDK,而是SMTP来发送邮件。所以 SES_KEY 和 SES_SECRET 不行。
我也在 laravel 中使用 'ses' MAIL_DRIVER
并且遇到了与 OP 完全相同的问题。对我来说,问题是我正在使用的 IAM 用户 - 我使用了 SES 向导为我创建的用户,该用户工作了一段时间,但随后停止了。我要做的就是修复它,创建一个新的 'Programmatic access' IAM 用户并获得 "ses:SendRawEmail"
权限,电子邮件开始流动。
1) 检查您的服务器或本地计算机的 "Date & time" 是否是最新的。
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
您不需要 SMTP username/password,只需使用 IAM 密钥和密码就可以让您在 Laravel 中登录 SES...
你好像在key和region里加了必要的引号,应该是:
SES_KEY=AKIA------DZQ5TYQ
SES_SECRET=AhN8d----------------ZbBq7TNBmhNnosfYbasg6Q
SES_REGION=us-west-2
如果不是这种情况,请确保您的 IAM 用户具有 SES 写入 权限:
对我来说,我必须在 .env 文件中指定与在 Amazon SES 中验证的相同的电子邮件地址。
我正在使用 Laravel 5.3、EC2 和 SES 发送电子邮件。
config/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 托管在 us-west。我尝试了以下方法:
1) 创建新的 IAM 用户并使用新的 key/secret.
2) 创建root用户key/secret.
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.
一开始我不熟悉Laravel。但是,如果您使用的是 SMTP,则需要指定 MAIL_USERNAME
和 MAIL_PASSWORD
。此外,驱动程序应该是 SMTP
而不是 SES
,因为您使用的是 SES 的 SMTP 主机。
文档 link - http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-credentials.html 应该为您提供生成不同于 AWS IAM 凭证的 SMTP 凭证的方法。
简而言之,您使用的不是SES SDK,而是SMTP来发送邮件。所以 SES_KEY 和 SES_SECRET 不行。
我也在 laravel 中使用 'ses' MAIL_DRIVER
并且遇到了与 OP 完全相同的问题。对我来说,问题是我正在使用的 IAM 用户 - 我使用了 SES 向导为我创建的用户,该用户工作了一段时间,但随后停止了。我要做的就是修复它,创建一个新的 'Programmatic access' IAM 用户并获得 "ses:SendRawEmail"
权限,电子邮件开始流动。
1) 检查您的服务器或本地计算机的 "Date & time" 是否是最新的。
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
您不需要 SMTP username/password,只需使用 IAM 密钥和密码就可以让您在 Laravel 中登录 SES...
你好像在key和region里加了必要的引号,应该是:
SES_KEY=AKIA------DZQ5TYQ
SES_SECRET=AhN8d----------------ZbBq7TNBmhNnosfYbasg6Q
SES_REGION=us-west-2
如果不是这种情况,请确保您的 IAM 用户具有 SES 写入 权限:
对我来说,我必须在 .env 文件中指定与在 Amazon SES 中验证的相同的电子邮件地址。