new PHPMailer()报Class not found主因是ThinkPHP5 extend/目录不兼容vendor中大写命名空间,须手动放文件并统一小写重命名、添加namespace phpmailer;,且host/port/smtp_secure/password四项配置必须严格匹配邮箱服务商要求。

直接用 PHPMailer 就行,但必须绕过 ThinkPHP5 的自动加载陷阱、禁用 OpenSSL 报错干扰、且 SMTP 配置项不能写错 —— 否则 90% 的失败都卡在这三步。
为什么 new PHPMailer() 会报 Class not found?
ThinkPHP5 的 extend/ 目录默认只扫描小写命名的类文件,且要求有明确命名空间。直接 composer require phpmailer/phpmailer 安装后,vendor/ 下的类路径含大写字母(如 PHPMailer\PHPMailer\PHPMailer),框架无法自动加载。
实操建议:
- 删掉
vendor/phpmailer/phpmailer,改用「手动放文件 + 命名空间修正」方式 - 下载 PHPMailer v6.9+ 源码,提取
src/PHPMailer.php、src/SMTP.php、src/Exception.php - 全小写重命名并放入
extend/phpmailer/:即phpmailer.php、smtp.php、exception.php - 每个文件首行加
namespace phpmailer;,否则use phpmailer\phpmailer;会失败
SMTP 配置项哪些不能写错?
host、port、smtp_secure 必须严格匹配邮箱服务商要求,写错一个就连接超时或认证拒绝。163 和 QQ 邮箱最常踩坑:
立即学习“PHP免费学习笔记(深入)”;
-
host:163 是smtp.163.com,QQ 是smtp.qq.com,别写成mail.163.com或漏掉smtp. -
port:SSL 模式下必须用465(不是994或25),TLS 模式才用587 -
smtp_secure:值只能是'ssl'或'tls'(字符串,不是布尔值),填'SSL'或ssl会静默失效 -
password:必须是「客户端授权码」,不是邮箱登录密码;163 授权码在「设置 → POP3/SMTP/IMAP → 客户端授权码」里生成
附件发不出、中文乱码、Debug 不出错怎么办?
常见现象是邮件发出去了但没附件、主题/正文显示问号、$mail->ErrorInfo 为空 —— 这往往不是代码问题,而是环境或路径细节被忽略:
- 附件路径必须是绝对路径,且用英文命名:
/var/www/html/runtime/mail/notice.pdf可行,/var/www/html/运行日志.pdf极大概率失败 - 中文乱码主因是
CharSet和Subject编码不一致:统一设为utf-8,且调用$mail->Subject = mb_encode_mimeheader($subject, 'UTF-8', 'B');处理主题 - Debug 没输出?确认
SMTPDebug设为2(不是1或true),且Debugoutput设为'html'或'echo',否则错误只写日志不显示 - OpenSSL 扩展必须启用:检查
phpinfo()中openssl是否已加载,未启用时SMTPSecure = 'ssl'会直接跳过加密握手
真正卡住人的从来不是“怎么写”,而是「路径权限不对」「授权码输错一次就被锁」「配置键名大小写混用」「附件用了相对路径却没 chdir()」——这些细节不验证一遍,光看文档永远发不出第一封。



















