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

Yii2迁移至Symfony Mailer后无法通过AWS SES发送邮件

Yii2迁移Symfony Mailer后AWS SES邮件发送异常排查

因Yii官方弃用通知,我将项目的邮件组件从Swiftmailer迁移至Symfony Mailer。此前通过AWS SES的SMTP服务发送邮件一切正常,但迁移后,send()函数返回true却无法收到邮件。我按照官方组件文档完成了安装,相关代码如下:

配置文件(config/main-local.php)

$password = 'MY_AWS_SES_PASSWORD';
$password = urlencode($password);
'mailer' => [
        'class' => \yii\symfonymailer\Mailer::class,
        'transport' => [
            'scheme' => 'smtps',
            'host' => 'email-smtp.ap-south-1.amazonaws.com',
            'username' => 'MY_AWS_SES_USERNAME',
            'password' => $password,
            'port' => '465',
            'dsn' => 'sendmail://default',
        ],
        'viewPath' => '@common/mail',
        // send all mails to a file by default. You have to set
        // 'useFileTransport' to false and configure transport
        // for the mailer to send real emails.
        'useFileTransport' => false,
    ],  

邮件发送示例代码

public function actionMail()
{
    return Yii::$app
        ->mailer
        ->compose()
        ->setFrom(Yii::$app->params['adminEmail')
        ->setTo($model->to_email)
        ->setSubject('Account registration at ' . Yii::$app->name)
        ->setTextBody($messages)
        ->send();
}

请问我的配置中遗漏了什么?


问题排查与解决

  1. 核心配置冲突
    你的transport配置中同时存在SMTP参数和dsn项,Symfony Mailer会优先使用dsn配置。你设置的dsn: sendmail://default意味着邮件会通过本地sendmail服务发送,而非AWS SES的SMTP服务器,这就是为什么send()返回true但收不到邮件的原因——邮件根本没走SES通道。

    解决方法:移除transport中的dsn配置项,让组件使用你定义的SMTP参数。修正后的transport配置如下:

    'transport' => [
        'scheme' => 'smtps',
        'host' => 'email-smtp.ap-south-1.amazonaws.com',
        'username' => 'MY_AWS_SES_USERNAME',
        'password' => $password,
        'port' => '465',
    ],
    
  2. 代码语法错误
    示例代码中setFrom(Yii::$app->params['adminEmail')缺少闭合的方括号],正确写法应为:

    ->setFrom(Yii::$app->params['adminEmail'])
    

    虽然你提到send()返回true,但这个语法错误可能导致邮件构建异常,建议检查实际运行代码是否存在该问题。

  3. AWS SES环境验证

    • 确认SMTP用户名和密码正确,对应的IAM用户拥有AmazonSESFullAccess或相关发送权限
    • 如果你的AWS SES处于沙盒模式,发件人和收件人邮箱都需要在SES控制台完成验证;若已升级到生产模式,则无需验证收件人
    • 检查AWS SES的发送配额是否用尽,是否有被封禁的情况
  4. 启用日志排查
    可以开启邮件日志功能,查看发送细节:
    在mailer配置中添加'enableSwiftMailerLogging' => true,或者查看Symfony Mailer的日志文件,确认邮件是否成功提交到SES服务器。


内容的提问来源于stack exchange,提问作者MIK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:27:04