PHPMailer SMTP基础配置必须设全Host、Port、SMTPAuth、Username、Password这5项,缺一不可;Host须匹配邮箱服务商(如smtp.qq.com),Port与SMTPSecure需配对(465配SSL、587配TLS),Password为授权码而非登录密码。

PHPMailer 的 SMTP 基础配置必须设这 5 个参数
不填全这 5 项,$mail->isSMTP() 就是摆设,连接直接失败。它们是:Host、Port、SMTPAuth、Username、Password。
常见错误现象:报错 SMTP Error: Could not authenticate 或 Connection refused,多数是因为漏了 SMTPAuth = true 却仍传了账号密码,或端口与加密方式不匹配。
-
Host必须写对——QQ 邮箱是smtp.qq.com,Gmail 是smtp.gmail.com,阿里云邮件推送是smtpdm.aliyun.com -
Port和SMTPSecure要配对:465对应PHPMailer::ENCRYPTION_SMTPS(SSL),587对应PHPMailer::ENCRYPTION_STARTTLS(TLS) -
Password不是邮箱登录密码,而是「授权码」或「应用专用密码」——QQ 邮箱在账户设置里开 SMTP 时生成,Gmail 需开启两步验证后在「App passwords」里生成 -
Username必须和发信邮箱完全一致,包括大小写;部分服务商(如网易邮箱)要求用户名不含@domain后缀,得单独试
中文乱码、HTML 不渲染?查 CharSet 和 isHTML()
发出去的邮件标题/正文显示问号、方框,或 HTML 标签原样输出,不是内容没写对,而是编码和格式开关没打开。
关键点就两个:$mail->CharSet 默认是 ISO-8859-1,必须显式设为 UTF-8;$mail->isHTML(true) 必须在设置 Body 前调用,否则 <b> 就是纯文本。
立即学习“PHP免费学习笔记(深入)”;
- 漏设
CharSet:中文主题变成=?ISO-8859-1?B?...编码,部分客户端无法解码 -
isHTML(true)放在$mail->Body = '...'之后——无效,HTML 会被当纯文本处理 - 如果用
msgHTML()替代Body,它会自动处理内联图片和基础编码,但依然依赖CharSet全局设置
为什么 mail() 函数发不出去,又不想用 PHPMailer?
直接调用 mail() 成功率极低,不是代码写错了,而是它根本不走远程 SMTP,只依赖本地 sendmail/postfix 服务。绝大多数共享主机、Docker 容器、Windows 环境默认没装也没配。
典型表现:mail() 返回 true,但收件箱永远没邮件;或者报错 sendmail_from not set in php.ini。这不是 PHP 问题,是服务器缺失基础设施。
- Linux 上需确认
sendmail_path在php.ini中指向有效路径(如/usr/sbin/sendmail -t -i) - Windows 下几乎不可能跑通,因为原生无 sendmail,强行配 msmtp 或 ssmtpproxy 属于高维护成本方案
- 即使配通,
mail()也不支持认证、无错误详情、无法 debug 连接过程,出问题只能靠猜
调试 SMTP 连接失败,优先开 SMTPDebug 而不是改代码
别一上来就换端口、换加密方式、重装库。先让 PHPMailer 把底层通信过程打出来,90% 的配置问题一眼就能定位。
只需加一行:$mail->SMTPDebug = SMTP::DEBUG_SERVER;(注意不是数字 2,新版用常量)。输出会包含 DNS 查询结果、TCP 握手状态、AUTH 命令响应、服务器返回的完整错误码(比如 535 5.7.8 Error: authentication failed)。
- 看到
Connection: Failed但没更多日志?说明网络层不通——检查防火墙、云服务器安全组是否放行对应端口 - 卡在
Auth: Trying LOGIN后断开?大概率是账号密码错,或服务商禁用了该认证机制(如 Gmail 已弃用 LOGIN) - 返回
554 5.7.1 Service unavailable?可能是 IP 被拉黑,或域名未配 SPF/DKIM,此时改代码没用,得查邮件服务商后台



















