SMTPSecure和Port必须严格配对:465端口对应PHPMailer::ENCRYPTION_SMTPS(或'ssl'),587端口对应PHPMailer::ENCRYPTION_STARTTLS(或'tls');混搭必导致连接失败。

SMTPSecure 和 Port 必须严格配对,错一个就连接失败
PHPMailer 的 SMTPSecure 和 Port 不是随便填的两个参数,它们代表了底层网络连接协议类型。填错组合,SMTP connect() failed 就会直接报出来,而且不给具体原因。
-
Port = 465→ 必须用SMTPSecure = PHPMailer::ENCRYPTION_SMTPS(或旧写法'ssl') -
Port = 587→ 必须用SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS(或旧写法'tls') -
Port = 25基本别碰:多数服务商已屏蔽未加密的 25 端口,即使开了 STARTTLS,成功率也极低 - 混搭(比如 465 +
'tls')会导致握手阶段卡死,超时后直接抛异常,不是认证失败,是连不上
密码不是登录密码,而是应用专用密码
Gmail、QQ、Outlook、163 等主流邮箱,只要启用了两步验证(现在基本都强制了),就不再接受账户原始密码用于 SMTP 认证。你填的 $mail->Password 必须是对应平台生成的「应用专用密码」。
- Gmail:进 Google 账户 → 安全 → 两步验证已开启 → 应用专用密码(选「邮件」→「其他」,生成 16 位码)
- QQ 邮箱:设置 → 账户 → 「POP3/IMAP/SMTP...」→ 开启 SMTP → 生成授权码(16 位)
- 163/126 邮箱:设置 → POP3/SMTP/IMAP → 开启 SMTP → 设置客户端授权码
- OVH 自建邮箱例外:用的是邮箱在 OVH 控制台设置的原始登录密码,不是授权码
setFrom() 地址必须和 Username 完全一致
很多开发者以为发件人显示名可以随便设,但 SMTP 服务器(尤其是 Gmail、QQ、企业邮箱)会在认证后校验 setFrom() 的邮箱地址是否与 Username 完全相同。不一致 → 535 Authentication failed 或静默拒信。
- 正确:
$mail->Username = 'contact@yourdomain.com'; $mail->setFrom('contact@yourdomain.com', 'My Site'); - 错误:
$mail->Username = 'contact@yourdomain.com'; $mail->setFrom('noreply@yourdomain.com', 'My Site');(即使同域名,也不行) - 如果要用别名发信,得在邮箱服务商后台把该别名加为「已验证发件地址」,再在
Username中使用它
本地开发环境常被忽略的 OpenSSL 和调试陷阱
在 XAMPP/MAMP/WAMP 或 Docker 里跑 PHPMailer,最容易栽在两个看似无关的地方:OpenSSL 扩展没开,或者 SMTPDebug 没关。
立即学习“PHP免费学习笔记(深入)”;
- 确认
extension=openssl在php.ini中已启用(Windows 下注意路径,Linux 下常需apt install php-openssl) -
$mail->SMTPDebug = 0是生产环境硬性要求:设成 2 会输出原始 SMTP 流,可能破坏 HTTP 响应头,导致页面空白或 headers already sent 错误 - 本地测试时可临时设为
SMTP::DEBUG_SERVER(即 2),但上线前必须删掉或设为 0 - 某些共享主机禁用
fsockopen或限制出站连接,此时即使配置全对,也会卡在 connect 阶段 —— 这类问题只能联系主机商确认是否放行 SMTP 出口



















