ThinkPHP邮件通知需严格配置config/mail.php:host填'smtp.qq.com'等、QQ用587端口、163用465、username为完整邮箱、password为SMTP授权码、from含address和name;必须异步发送,推荐think-mailer扩展,并开放云服务器SMTP端口。

直接上结论:ThinkPHP 邮件通知不是配个 config/mail.php 就能发出去的,90% 的失败都卡在配置键名错、端口/加密方式不匹配、或没用授权码——尤其是 QQ/163 邮箱,必须用 SMTP 授权码,不是登录密码。
config/mail.php 的 key 名必须严格匹配框架约定
TP6 不读 .env 里的 MAIL_HOST 这类变量,只认 config/mail.php 中特定 key。写错一个字母(比如 smtp_host 写成 host)就会静默失败,日志里只显示 Connection could not be established with host smtp.qq.com。
-
host:填'smtp.qq.com',不要带ssl://前缀 -
port:QQ 邮箱用587(STARTTLS),163 邮箱用465(SSL),不能混 -
username:必须是完整邮箱地址,如'alert@example.com' -
password:填 SMTP 授权码,不是邮箱登录密码 -
from:必须是数组,含address和name两个子键,缺一不可
同步发送会阻塞 HTTP 请求,必须异步
在 ExceptionHandler::report() 或控制器里直接调用 \think\facade\Mail::send(),一旦 SMTP 超时(比如网络抖动),用户要等满 30 秒才看到 500 页面。生产环境严禁这么做。
- 用
think-queue+ Redis/Database 驱动,把发信封装成 Job - Job 内部用
try/catch包住Mail::send(),失败只记日志,不抛异常 - 设置
maxTries = 1,避免重复投递导致收多封告警邮件 - 别在
report()里发信——调试模式下它可能被调两次
用 think-mailer 扩展比手搭 PHPMailer 更省事
虽然可以自己放 PHPMailer 文件进 extend/ 并加命名空间,但容易因大小写、路径、use 顺序出问题。官方维护的 think-mailer 已预置适配逻辑,推荐优先使用。
立即学习“PHP免费学习笔记(深入)”;
- 执行
composer require topthink/think-mailer - 复制
vendor/topthink/think-mailer/src/config/mail.php到项目config/mail.php - 发信时用
Mail::to($to)->subject($sub)->html($content)->send(),不用手动 new 实例 - 模板支持
view('mail/welcome', ['name' => $user->name]),自动渲染并设为 HTML 正文
最常被忽略的一点:云服务器(阿里云、腾讯云)默认封掉 25/465/587 端口,必须去安全组和实例防火墙里手动放开 outbound 规则;本地开发用 Docker 也得确认容器网络能通外网 SMTP。没连上,再对的配置也没用。



















