必须配置 transport 且 usefiletransport 设为 false,否则邮件只存文件不发送;transport 类为 swift_smtptransport,host、port、encryption 需匹配邮箱服务商要求,username 为完整邮箱,password 为 smtp 授权码。

直接说结论:必须配 transport,且 useFileTransport 得设为 false,否则邮件根本不会发出去,只在 runtime/mail/ 下生成文件。
mailer 组件必须配置 transport 才能发真实邮件
Yii2 的 yii\swiftmailer\Mailer 类本身不带传输能力,transport 是强制依赖项。不配它,调用 send() 会静默失败或抛出 Swift_TransportException。
-
class固定填Swift_SmtpTransport(别写错大小写) -
host要按邮箱服务商给的来:QQ 是smtp.qq.com,163 是smtp.163.com,Gmail 是smtp.gmail.com -
port和encryption必须匹配:587 +tls、465 +ssl,混搭会连不上 -
username是完整邮箱地址,password不是登录密码,而是邮箱后台开启 SMTP 后生成的「授权码」(QQ/163/Gmail 都一样)
useFileTransport => false 是开关,不是可选项
默认值是 true,意味着所有 send() 调用都只是把邮件内容写进 runtime/mail/ 目录下,完全不走网络。开发时容易误以为“发成功了”,上线后才发现一封没到。
- 务必显式设为
false,哪怕只在main-local.php中临时启用 - 如果想保留本地存档功能,得自己扩展
Mailer类,不能靠这个开关 - 测试阶段建议先设
true看生成的邮件内容是否正确,确认无误再切false
常见错误:535 Authentication failed 或连接超时
这类报错基本都指向配置层,和代码逻辑无关:
-
Expected response code 250 but got code "535"→ 授权码填错、用户名格式不对(漏 @ 域名)、SMTP 服务未开启 -
Connection could not be established with host smtp.xxx.com→host拼错、端口被防火墙拦截、encryption和端口不匹配 - QQ 邮箱提示“请开启 IMAP/SMTP 服务” → 必须手动进邮箱设置页开启,并复制弹窗里的授权码,不是 QQ 密码
- 163 邮箱提示“密码错误” → 用的是 POP3/SMTP 授权码,不是网页登录密码,且需确认是否已绑定手机
发件人信息建议统一收口在 messageConfig
避免每次调用都重复写 setFrom(),尤其多人协作时容易不一致:
- 在 mailer 配置里加
messageConfig块:'from' => ['admin@example.com' => '系统通知'] - 这样
compose()默认就带发件人,不用再setFrom() -
charset设成UTF-8防止中文主题/正文乱码 - 如果业务需要动态发件人(比如用户注册用本人邮箱),那就别配
messageConfig.from,改在代码里 set
真正卡住人的地方往往不是语法,而是授权码没开、端口配反、useFileTransport 忘关——这些细节不验证一遍,光看 send() 返回 true 也没用。











