我正在尝试使用 AWS SES 在我的 Laravel 项目中发送电子邮件。
错误消息不是很有帮助。
在 AWS SES 中,我验证了我的域的身份以及我在测试中用作发件人的电子邮件地址。
在 AWS IAM Manager 中,我生成了一个密钥对。
我相信这部分工作正常,因为我使用它在同一 EC2 服务器中使用 PHPMailer 在以前的 PHP 应用程序中发送邮件。
在服务器端,一个运行 Ubuntu 的 EC2 实例,我根据 Laravel 手册安装了软件包:
composer require aws/aws-sdk-php
<?php
return [
'default' => env('MAIL_MAILER', 'smtp'),
'mailers' => [
'ses' => [
'transport' => ‘ses',
'host' => env('MAIL_HOST'),
'key' => env('SES_ACCESS_KEY_ID'),
'secret' => env('SES_SECRET_ACCESS_KEY'),
'region' => env('SES_DEFAULT_REGION', 'us-east-1'),
'encryption' => 'tls',
'port' => 587,
],
],
'from' => [
'address' => env('MAIL_FROM_ADDRESS', '[email protected]'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
];
在config/services.php中:
<?php
return [
'ses' => [
'key' => env('SES_ACCESS_KEY_ID'),
'secret' => env('SES_SECRET_ACCESS_KEY'),
'region' => env('SES_DEFAULT_REGION', 'us-east-1'),
],
];
在.env中:
MAIL_MAILER=ses
MAIL_HOST="email-smtp.sa-east-1.amazonaws.com"
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"
MAIL_EHLO_DOMAIN="my-verified-domain.com"
SES_DEFAULT_REGION=sa-east-1
SES_ACCESS_KEY_ID=”MY-KEY-ID, TRIED QUOTED AND NOT QUOTED”
SES_SECRET_ACCESS_KEY= “MY-SAK, TRIED QUOTED AND NOT QUOTED”
设置完成后,我运行:
php artisan config:clear
(即使我的项目没有缓存配置)php artisan tinker
Mail::raw("TEST BODY", function($msg){ $msg->to("[email protected]")->subject("TEST SUBJECT"); });
对 AWS SES API 的异常请求失败。原因:我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档..
出于调试目的,我运行了:
dd(config('mail'));
array:4 [ // vendor/psy/psysh/src/ExecutionLoopClosure.php(53) : eval()'d code:1
"default" => "ses"
"mailers" => array:1 [
"ses" => array:7 [
"transport" => "ses"
"host" => "email-smtp.sa-east-1.amazonaws.com"
"key" => " MY-KEY-ID"
"secret" => "MY-SECRET"
"region" => "sa-east-1"
"encryption" => "tls"
"port" => 587
]
]
"from" => array:2 [
"address" => "[email protected]"
"name" => " LARAVEL_APP "
]
"contact" => array:1 [
"address" => "LARAVEL_APP"
]
]
我不知道它是否有任何帮助,但我会添加一些我已经尝试过的额外测试:
如果我将 Transport 更改为“smtp”,错误是:
Symfony\Component\Mailer\Exception\TransportException 预期响应代码“250”,但得到代码“530”,并显示消息“530 需要身份验证”。
正如我之前所说,SES 凭证在同一 EC2 服务器中的另一个应用程序(不是 Laravel 应用程序)中工作正常。即便如此,我也尝试创建新的,面临同样的错误。
最后,我尝试了邮件程序数组的不同组合,删除了键:“主机”、“区域”、“加密”和“端口”。
我在这里做错了什么?!
可能的原因