yii2.0.55中配置smtp邮件需显式声明mailer组件、使用swift_smtptransport驱动、正确设置tls/ssl加密及app专用密码,否则send()会静默失败或connection refused;须禁用usefiletransport、验证端口连通性,并通过返回值与日志排查问题。

Yii2.0.55项目中配置SMTP发送通知邮件,必须显式声明邮件组件、设置正确的PHPMailer底层驱动、启用TLS/SSL加密连接,并验证凭证与端口匹配,否则调用Yii::$app->mailer->compose()->send()会静默失败或抛出Connection refused异常。
配置mail组件并启用SMTP驱动
打开config/web.php(Web应用)或config/console.php(命令行任务),在'components'数组内添加或修改'mailer'项:
'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'viewPath' => '@app/mail', 'useFileTransport' => false, 'transport' => [ 'class' => 'Swift_SmtpTransport', 'host' => 'smtp.gmail.com', 'username' => 'yourname@gmail.com', 'password' => 'your-app-specific-password', 'port' => 587, 'encryption' => 'tls', ], ],
注意:不要使用邮箱登录密码,Gmail等服务商已强制要求App Password;若用QQ邮箱,host填smtp.qq.com,port为587(TLS)或465(SSL),encryption对应填tls或ssl。
验证SMTP连接是否可达
进入项目根目录,执行以下命令测试基础连通性:
telnet smtp.gmail.com 587
若返回Connected to smtp.gmail.com.说明网络层通畅;若超时或拒绝连接,检查服务器防火墙是否放行 outbound 587 端口,以及DNS能否解析smtp域名。
【继续保留useFileTransport => true会导致邮件不发出,仅保存到runtime/mail目录,无法验证真实SMTP链路】
编写并发送通知邮件
第一步:在@app/mail目录下创建notify.php视图文件,内容为纯HTML或混合PHP逻辑:
<h2>订单已确认</h2>
<p>您的订单 #= $orderNo ?> 已成功提交。</p>
第二步:在控制器或服务类中调用发送逻辑:
$sent = Yii::$app->mailer->compose('notify', ['orderNo' => '20260806001']) ->setFrom(['service@example.com' => '系统通知']) ->setTo('user@domain.com') ->setSubject('【订单确认】您的订单已生成') ->send();
第三步:检查返回值——$sent为true表示队列投递成功,但不保证送达;若为false,立即查看runtime/logs/app.log中Swift_TransportException详情,常见错误包括认证失败、发信配额超限、HELO域名被拒。











