Laravel集成AWS SES发送邮件失败,请求排查解决
Laravel 集成 AWS SES 发信故障排查方案
1. 优先修复密钥配置的空格问题
你已经发现key值前存在空格,这是导致签名不匹配的直接原因:
- 打开服务器上的
.env文件,找到AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,删除变量值开头的所有空格。 - 执行以下命令彻底清除配置缓存,避免旧配置残留:
注意:仅执行php artisan config:clear php artisan cache:clearconfig:clear可能不够,缓存系统可能保留旧数据。
2. 确认Laravel SES驱动的核心配置
检查以下两个配置文件的正确性:
config/services.php
确保ses配置指向正确的环境变量,且区域与你的AWS SES实例一致:
'ses' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), // 替换为你的SES区域,比如us-west-2 'version' => 'latest', ],
config/mail.php
确保默认邮件驱动设置为ses,且mailer配置正确:
'default' => env('MAIL_MAILER', 'ses'), 'mailers' => [ // ... 其他驱动配置 'ses' => [ 'transport' => 'ses', ], ],
3. SMTP模式的530认证问题解决
如果你切换到SMTP模式出现530 Authentication required,注意SES SMTP凭证≠IAM密钥:
- 登录AWS SES控制台,进入「SMTP设置」页面,点击「创建我的SMTP凭证」,生成专门的SMTP用户名和密码。
- 更新
.env的SMTP配置:
不要用IAM密钥作为SMTP的用户名/密码,二者不兼容。MAIL_MAILER=smtp MAIL_HOST=email-smtp.<你的SES区域>.amazonaws.com MAIL_PORT=587 MAIL_USERNAME=<SES生成的SMTP用户名> MAIL_PASSWORD=<SES生成的SMTP密码> MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=<已验证的发件邮箱>
4. 验证IAM用户权限
虽然你的IAM密钥在PHPMailer中可用,但仍需确认该用户拥有SES发信权限:
- 登录AWS IAM控制台,找到对应的用户,附加以下权限策略:
确保没有IP限制或其他条件阻止该密钥调用SES API。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail" ], "Resource": "*" } ] }
5. 更高效的测试方式
避免使用php artisan tinker测试,建议新增一个测试路由获取详细错误:
// 在routes/web.php中添加 Route::get('/test-ses-email', function () { try { \Illuminate\Support\Facades\Mail::raw('Laravel SES测试邮件内容', function ($message) { $message->to('你的测试收件邮箱') ->from('已验证的发件邮箱') ->subject('SES发信测试'); }); return '邮件发送成功'; } catch (\Exception $e) { return '发送失败:' . $e->getMessage() . ' ' . $e->getTraceAsString(); } });
访问该路由后,能获取完整的错误堆栈,帮助定位深层问题。
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

