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

Yii2集成Symfony Amazon Mailer发送SES邮件报SMTP认证失败

问题描述

我的composer.json中引入了如下依赖:

"symfony/amazon-mailer": "^6.0",
"yiisoft/yii2-symfonymailer": "^2.0",

main.php配置文件中的mailer组件配置如下:

'mailer' => [
    'class' => \yii\symfonymailer\Mailer::class,
    'viewPath' => '@frontend/views/user/mail',
    'useFileTransport' => false,
    'transport' => [
        'dsn' => 'ses+smtp://XXXXXXXXXXX:'.urlencode('xxxxxxxxxxxxxxx').'@email-smtp.ap-southeast-1.amazonaws.com:587',
    ]
]

通过联系表单发送邮件时,日志输出如下报错:

2022-06-14 13:40:53 [][-][-][error][yii\symfonymailer\Mailer::sendMessage] Failed to authenticate on SMTP server with username "XXXXXXXXXXX" using the following authenticators: "LOGIN", "PLAIN". Authenticator "LOGIN" returned "Expected response code "235" but got code "535", with message "535 Authentication Credentials Invalid".". Authenticator "PLAIN" returned "Expected response code "235" but got code "535", with message "535 Authentication Credentials Invalid".".
2022-06-14 13:40:49 [][-][-][info][application] $_GET = []

已确认配置中填写的SMTP用户名和密码均正确,求问遗漏了什么配置?

附加环境信息

项目信息
Yii框架版本2.0.45
Yii SymfonyMailer扩展版本^2.0
SymfonyMailer版本v6.0.8
PHP版本8.1.6
操作系统Ubuntu
问题原因

核心问题是DSN协议前缀使用错误,和账号密码本身正确性无关:
安装symfony/amazon-mailer扩展后,ses+smtp://不是普通的SMTP协议标识,Symfony的Amazon SES桥接类会对这个前缀的DSN做特殊处理:它不会直接把你填写的用户名密码作为SMTP凭证发起认证,而是默认传入的是AWS IAM的AccessKey/SecretKey,会自动派生SES SMTP认证所需的凭证、自动匹配对应区域的SMTP端点。
你当前手动填写了SES控制台生成的SMTP专用用户名、密码、区域端点,桥接类会错误地把SMTP用户名识别为AK、SMTP密码识别为SK做派生计算,最终生成的认证凭证完全无效,自然返回535认证失败错误。

修复方案

二选一即可:

方案1:使用已有的SMTP专用凭证,改用普通SMTP前缀

如果你已经在SES控制台生成了对应区域的SMTP专用用户名和密码,直接把DSN前缀从ses+smtp://改成smtp://就行,此时Symfony会把它当作普通SMTP服务处理,直接使用你填写的账号、密码、端点信息发起认证,不会做额外的凭证转换:

'mailer' => [
    'class' => \yii\symfonymailer\Mailer::class,
    'viewPath' => '@frontend/views/user/mail',
    'useFileTransport' => false,
    'transport' => [
        // 仅修改前缀为smtp://,其余内容保持不变
        'dsn' => 'smtp://XXXXXXXXXXX:'.urlencode('你的SMTP专用密码').'@email-smtp.ap-southeast-1.amazonaws.com:587',
    ]
]

方案2:遵循ses+smtp桥接规范,用IAM AK/SK认证

如果不想手动生成SMTP专用凭证,可以直接使用有SES发送权限的IAM用户的AccessKey/SecretKey,按照桥接类要求的格式写DSN,不需要手动填SMTP端点和端口,桥接类会自动处理所有认证逻辑:

'mailer' => [
    'class' => \yii\symfonymailer\Mailer::class,
    'viewPath' => '@frontend/views/user/mail',
    'useFileTransport' => false,
    'transport' => [
        // 替换为对应IAM用户的AK、SK,以及你使用的SES区域
        'dsn' => 'ses+smtp://你的AWS_ACCESS_KEY:'.urlencode('你的AWS_SECRET_KEY').'@default?region=ap-southeast-1',
    ]
]

使用这个方案需要提前给对应IAM用户配置ses:SendRawEmail等邮件发送相关权限。

额外排查点
  • SES的SMTP专用凭证是和区域强绑定的,你当前用的是ap-southeast-1(新加坡)区域端点,必须使用同区域生成的SMTP用户名密码,跨区域生成的凭证无法通过认证
  • 如果SES账号还在沙箱模式下,发件人和所有收件人邮箱都必须提前在SES控制台完成验证,否则就算认证成功也发不出邮件
  • 确认服务器防火墙、安全组没有阻断对外587端口的连接,不过端口不通一般报连接超时,不会返回535错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:51:26