ThinkPHP 6 官方不内置邮件组件,必须手动集成 PHPMailer v6.9+:删尽旧 autoload 文件,通过 Composer 安装并确保 vendor/autoload.php 正确引入;QQ 邮箱需用授权码+ssl+465,163 邮箱用授权码+tls+587,云服务器须放行对应出站端口。

ThinkPHP 6 没有内置可靠的邮件发送类,直接用 think-mail 扩展会报错 —— 它只兼容 TP5,TP6 已废弃。必须手动集成原生 PHPMailer,否则连 Class 'PHPMailer\PHPMailer\PHPMailer' 都找不到。
为什么 Composer require phpmailer/phpmailer 后还是 Class not found?
常见原因是残留旧加载逻辑和命名空间冲突。TP6 依赖 Composer 自动加载,但很多老项目还留着手写的 PHPMailerAutoload.php 或 class.phpmailer.php,这两类文件会覆盖 Composer 的自动加载规则。
- 删掉项目中所有手动引入 PHPMailer 的
.php文件,尤其是Vendor/或extend/下的旧版类库 - 确认入口文件(如
public/index.php)里已执行require __DIR__.'/../vendor/autoload.php';(TP6 默认已有,但宝塔子目录部署或二次迁移时可能被注释掉) - 运行
composer dump-autoload -o强制刷新自动加载映射 - 检查
vendor/phpmailer/phpmailer/src/PHPMailer.php是否真实存在,路径不对也会触发该错误
QQ 邮箱 / 163 邮箱 SMTP 怎么填才不连不上?
90% 的连接失败不是代码问题,而是平台策略或端口配置错。QQ 邮箱必须用 ssl + 端口 465;163 / Gmail 推荐用 tls + 端口 587。填反了,SMTP connect() failed 是必然结果。
- QQ 邮箱:开启「POP3/SMTP 服务」后,密码字段必须填「授权码」,不是登录密码;
host填smtp.qq.com,encryption填ssl,port填465 - 163 邮箱:
host填smtp.163.com,encryption填tls,port填587,同样用授权码 - 阿里云/腾讯云轻量服务器默认封禁
25端口,别试;465和587也要在安全组里放行 outbound 出站规则 - 国内直连 Gmail / Outlook SMTP 容易被限流或 DNS 解析超时,优先换用腾讯企业邮(
smtp.exmail.qq.com)或网易邮箱大师
怎么用 view 渲染 HTML 邮件模板又不被客户端乱码?
邮件客户端对 CSS 支持极差,外链样式表、 标签基本失效,必须内联。同时 UTF-8 字符集和 base64 编码是底线,否则中文收件人看到一堆问号。
- 模板文件放在
view/email/verify.html,用$this->fetch('email/verify', ['code' => $code])渲染后赋给$mail->Body - 所有 CSS 必须用
style=""写在标签上,不要用 class 或外部引用 - 设置
$mail->CharSet = 'UTF-8'; $mail->Encoding = 'base64';,缺一不可 - 避免使用 Flex/Grid 布局,用 table 做基础结构更稳妥;图片用绝对 URL,且加
alt属性
发邮件卡住或超时,是不是得加队列?
是。同步调用 $mail->send() 在 Web 请求中执行,一旦 SMTP 延迟或网络抖动,整个 HTTP 响应就卡住,用户等十几秒没反应,日志里全是 Connection timed out。异步不是“可选优化”,是生产环境刚需。
- 用
think-queue+redis将发送任务推入队列,控制器只负责 dispatch,后台 worker 进程单独处理 - 队列任务类里 new
PHPMailer实例,再 setFrom / addAddress / send,别复用单例 —— 实例状态不可靠 - 临时排查时可关掉框架日志:
'log_level' => 0,排除 TP6 自身 Cache/Log 组件拖慢请求的干扰 - Docker 容器里 DNS 解析失败、时区不一致导致证书校验失败,这些不会报 PHP 错误,但会让
send()静默 hang 住 —— 要进容器nslookup smtp.qq.com和date看实际环境
真正难调的不是配不通,而是配通后在特定部署环境(比如宝塔子目录 + Nginx + Redis 队列)里,DNS、时区、SSL 证书、防火墙四层叠加出问题。这时候看错误日志没用,得进服务器抓包或进容器验证基础网络连通性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











