yii2.0.55配置smtp需安装yii2-swiftmailer扩展、正确注册mailer组件并严格匹配host/port/encryption,qq邮箱须用授权码且开启smtp服务,调试时可通过日志定位swift_transportexception错误。

Yii2.0.55项目中配置SMTP发送邮件时,常见错误是直接复用Yii1的CPhpMailer或未正确注册SwiftMailer组件,导致调用Yii::$app->mailer->send()时报Class 'yii\swiftmailer\Mailer' not found或Connection refused——这说明框架未加载邮件扩展或配置未生效。
确认已安装并启用swiftmailer扩展
进入项目根目录,执行composer show yiisoft/yii2-swiftmailer;若无输出,运行composer require --prefer-dist yiisoft/yii2-swiftmailer;该包是Yii2官方维护的SMTP适配层,不可用第三方fork替代。
检查config/web.php或config/main.php中components数组是否包含'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', ];若缺失此段,即使装了扩展也完全不生效。
【必须确保vendor/yiisoft/yii2-swiftmailer目录真实存在且非空】,某些CI流程会跳过dev依赖,导致生产环境漏装。
配置SMTP连接参数(以QQ邮箱为例)
在config/mail.php(或直接写入main.php的components)中添加完整配置:
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@app/mail',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.qq.com',
'username' => 'your@qq.com',
'password' => 'your_app_password',
'port' => 587,
'encryption' => 'tls'
],
],
注意:QQ邮箱必须使用「授权码」而非登录密码,且需在邮箱设置中开启POP3/SMTP服务;163、Gmail同理,禁用普通密码直连。
若用阿里云企业邮箱,host填smtp.mxhichina.com,port为465,encryption设为'ssl'——端口与加密方式必须严格匹配,错配会导致连接超时而非报错。
验证邮件能否真正发出
第一步:在任意控制器中写测试代码:
use yii\helpers\Html;
$result = Yii::$app->mailer->compose()
->setTo('test@example.com')
->setFrom(['no-reply@yourdomain.com' => 'Your Site'])
->setSubject('Yii2 SMTP Test')
->setTextBody('Plain text content')
->setHtmlBody('HTML content')
->send();
var_dump($result);
第二步:执行后若返回false,立即查看runtime/logs/app.log,搜索“Swift_TransportException”——90%的失败源于DNS解析失败(host域名无法解析)、防火墙拦截587端口、或TLS握手被中间设备终止。
第三步:临时关闭SSL验证(仅调试用):在transport配置中加一行'tls' => false,但上线前必须删掉;【启用tls=false会暴露密码明文传输,生产环境严禁保留】。











