phpmailer 发送失败但无报错,需开启 $mail->smtpdebug = 2 并调用 $mail->issmtp() 才能暴露真实问题;qq/163 邮箱须用授权码、587端口+tls;addaddress() 不支持数组;中文需设 charset = 'utf-8' 和 encoding = 'base64'。

PHPMailer 发送失败但没报错?检查 SMTPDebug 和 isSMTP()
默认情况下 PHPMailer 安静失败,连连接超时都不提示。必须显式开启调试和 SMTP 模式才能看到真实问题。
-
$mail->SMTPDebug = 2(不是1或4),只输出关键通信日志,避免干扰 - 必须调用
$mail->isSMTP(),否则即使设置了Host和Port,它仍走本地mail()函数,而大多数现代服务器已禁用该函数 - 常见现象:代码返回
true,但邮件没收到——八成是没调isSMTP(),或SMTPDebug关着,误以为成功
QQ 邮箱 / 163 邮箱发信失败?认证方式和端口不能硬套文档
这些邮箱强制要求 SMTP 专用密码(非登录密码),且端口、加密方式有隐性规则。
- QQ 邮箱:用
smtp.qq.com,Port必须是587(不是 465),SMTPSecure设为tls;设ssl会卡在 STARTTLS 阶段 - 163 邮箱:同样用
587+tls,但需在邮箱设置里开启「SMTP服务」并生成「客户端授权码」,用主密码会直接被拒 - 错误信息常见:
SMTP Error: Could not authenticate.或Connection timed out——先确认授权码是否启用,再核对端口与加密组合
addAddress() 多收件人失效?别用数组传参
addAddress() 只接受单个邮箱字符串,不支持数组。很多人误写成 $mail->addAddress(['a@x.com', 'b@x.com']),结果只发给第一个。
- 正确做法:循环调用,如
foreach ($to as $addr) { $mail->addAddress($addr); } - 批量发送时注意:所有收件人会互相看到彼此邮箱。如需隐私,改用
addBCC(),或拆成多次独立发送 - 别混用
addAddress()和setFrom()的别名逻辑——setFrom()只能设一个发件人,重复调用会覆盖
中文主题/正文乱码?CharSet 和 Encoding 得配对设
只设 UTF-8 字符集不够,内容编码方式也得匹配,否则 Outlook 或手机邮箱显示为问号或方块。
立即学习“PHP免费学习笔记(深入)”;
- 必须同时设置:
$mail->CharSet = 'UTF-8'和$mail->Encoding = 'base64' -
Encoding不能设quoted-printable(PHPMailer 默认值),它对中文兼容差,尤其含 emoji 时易截断 - 主题乱码还常因没用
mb_encode_mimeheader()包装,但 PHPMailer 内部已处理,只要CharSet正确,直接赋值字符串即可










