You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel集成AWS SES发送邮件失败,请求排查解决

Laravel 集成 AWS SES 发信故障排查方案

1. 优先修复密钥配置的空格问题

你已经发现key值前存在空格,这是导致签名不匹配的直接原因:

  • 打开服务器上的.env文件,找到AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,删除变量值开头的所有空格。
  • 执行以下命令彻底清除配置缓存,避免旧配置残留:
    php artisan config:clear
    php artisan cache:clear
    
    注意:仅执行config: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配置:
    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=<已验证的发件邮箱>
    
    不要用IAM密钥作为SMTP的用户名/密码,二者不兼容。

4. 验证IAM用户权限

虽然你的IAM密钥在PHPMailer中可用,但仍需确认该用户拥有SES发信权限:

  • 登录AWS IAM控制台,找到对应的用户,附加以下权限策略:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ses:SendEmail",
                    "ses:SendRawEmail"
                ],
                "Resource": "*"
            }
        ]
    }
    
    确保没有IP限制或其他条件阻止该密钥调用SES API。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:37:02