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(); }
请问我的配置中遗漏了什么?
问题排查与解决
核心配置冲突
你的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', ],代码语法错误
示例代码中setFrom(Yii::$app->params['adminEmail')缺少闭合的方括号],正确写法应为:->setFrom(Yii::$app->params['adminEmail'])虽然你提到
send()返回true,但这个语法错误可能导致邮件构建异常,建议检查实际运行代码是否存在该问题。AWS SES环境验证
- 确认SMTP用户名和密码正确,对应的IAM用户拥有
AmazonSESFullAccess或相关发送权限 - 如果你的AWS SES处于沙盒模式,发件人和收件人邮箱都需要在SES控制台完成验证;若已升级到生产模式,则无需验证收件人
- 检查AWS SES的发送配额是否用尽,是否有被封禁的情况
- 确认SMTP用户名和密码正确,对应的IAM用户拥有
启用日志排查
可以开启邮件日志功能,查看发送细节:
在mailer配置中添加'enableSwiftMailerLogging' => true,或者查看Symfony Mailer的日志文件,确认邮件是否成功提交到SES服务器。
内容的提问来源于stack exchange,提问作者MIK
相关产品推荐
相关产品推荐

