必须将邮件组件命名为mailer且类为yii\swiftmailer\Mailer,否则Yii::$app->mailer为空;SMTP配置需匹配邮箱要求(如QQ邮箱用smtp.qq.com+587+tls及授权码),并关闭useFileTransport。

必须在 components 中注册名为 mailer 的组件,且类必须是 yii\swiftmailer\Mailer;用其他名字(比如 email)或直接 new Swift_SmtpTransport 都会导致 Yii::$app->mailer 拿不到实例,发不出邮件。
mailer 组件名和类名不能改
Yii 通过硬编码的 mailer 字符串查找组件,不是靠配置内容推断。即使你写个一模一样的 transport 配置但组件名叫 email,Yii::$app->mailer 就是 null。
-
'mailer'这个键名必须一字不差,大小写敏感 -
'class' => 'yii\swiftmailer\Mailer'不能简写、不能替换成Swift_Mailer或其他封装类 - 不要在控制器里手动 new
Swift_SmtpTransport:连接不复用、密码硬编码、环境切换时要改多处 - 开发/测试环境建议把
useFileTransport设为true,邮件会生成在@runtime/mail目录下,避免误发且方便调试原始 MIME 内容
SMTP 主机、端口、加密方式要匹配服务商要求
不同邮箱对 host/port/encryption 的组合有强约束,填错直接报 Expected response code 220 but got an empty response 或连接超时。
- QQ 邮箱:用
smtp.qq.com+587+tls,或465+ssl;密码必须是「SMTP 授权码」,不是登录密码 - 163 邮箱:常用
smtp.163.com+465+ssl;25+tls在某些网络下可能被拦截 - Gmail:必须用
smtp.gmail.com+587+tls,且账号需开启两步验证并生成「应用专用密码」 -
encryption值只能是null、'tls'或'ssl',写成'TLS'或'SSL'会静默失败
附件和模板路径容易出错的点
attach() 和邮件模板都依赖路径解析,而 Yii 的 alias(如 @app、@common)必须提前注册好,否则路径拼接错误导致文件找不到或模板加载失败。
-
viewPath必须指向真实存在的目录,例如'@app/mail',且该目录下要有layouts子目录和具体模板文件(如welcome.php) -
attach()只接受服务器可读的**绝对路径**,传相对路径(如'img/logo.png')大概率失败;推荐用Yii::getAlias('@webroot/img/logo.png') - 中文文件名附件会乱码,Swift Mailer 不原生支持 UTF-8 文件名;要么用英文名,要么先调
mb_convert_encoding($filename, 'GB2312', 'UTF-8')转码 -
compose('welcome', ['title' => 'Hi'])中的welcome是模板文件名(不含 .php),不是路由或视图别名
发件人和字符集必须显式声明
不设 from 或 charset,部分邮箱(特别是 Outlook、企业微信邮箱)会拒收或显示乱码,且无法在收件箱正确归类。
-
messageConfig必须包含'charset' => 'UTF-8',否则中文主题/正文可能变成问号 -
from要写成数组格式:['admin@example.com' => '系统通知'];只写字符串'admin@example.com'会导致发件人名称丢失 - 如果 SMTP 账号是
xxx@163.com,from地址也必须是这个邮箱,否则 163 会因 SPF 检查失败而退信 - 使用
setFrom()动态覆盖时,注意它只影响当前 message 实例,不影响全局messageConfig
最常被忽略的是 transport 配置嵌套层级和 useFileTransport 的开关逻辑——它不报错,但设成 true 后死活收不到邮件,开发者往往花几小时排查 SMTP 设置,其实只是忘了关这个开关。


















