
PHPMailer设置isHTML(true)后邮件仍以纯文本形式显示,通常是因PHP 8+环境下换行符(CRLF)处理异常导致MIME结构解析失败,需手动修正PHPMailer源码或升级至兼容版本。
phpmailer设置ishtml(true)后邮件仍以纯文本形式显示,通常是因php 8+环境下换行符(crlf)处理异常导致mime结构解析失败,需手动修正phpmailer源码或升级至兼容版本。
在使用 PHPMailer 发送 HTML 邮件时,若已明确调用 $mail->isHTML(true) 并设置了 结构的 $mail->Body,但收件端(如 Gmail、Outlook)仍将其渲染为纯文本(甚至显示原始 HTML 标签),这往往并非配置错误,而是底层 MIME 封装异常所致——尤其在 PHP 8.0 及更高版本中尤为常见。
? 根本原因:CRLF 换行符兼容性问题
PHPMailer 依赖标准的 \r\n(CRLF)作为邮件头与多部分边界(MIME boundary)的分隔符。然而,自 PHP 8.0 起,某些系统环境(特别是启用了 output_buffering 或特定 SAPI 模式)下,PHPMailer::CRLF 常量或内部 $LE(Line Ending)属性可能被意外替换为 \n(LF),导致:
- MIME 头部格式不合规(如缺少
\r\n结束); - 多部分边界(
--b1_...)未被正确识别; - 邮件客户端降级为
text/plain解析,忽略Content-Type: text/html声明。
该问题已在 PHP 官方 Bug Tracker 中确认(Bug #81158),影响 PHPMailer v6.5.x 及更早版本。
✅ 推荐解决方案(按优先级排序)
✅ 方案一:升级 PHPMailer(首选)
确保使用 PHPMailer ≥ v6.9.0(2024年发布),该版本已彻底修复 PHP 8.0+ 的换行符兼容性问题,并默认适配现代 PHP 环境:
立即学习“PHP免费学习笔记(深入)”;
composer update phpmailer/phpmailer
验证版本:
使用 Puppeteer + Chrome 将 HTML 渲染为中文 PDF,自动处理图表等待、Tab 展开、动画、测高、白边消除、防分页,适用于看板、报表、网页和交互图表转 PDF。
echo \PHPMailer\PHPMailer\PHPMailer::VERSION; // 应输出 6.9.0 或更高
✅ 方案二:临时修复(适用于无法升级的旧版)
若必须使用 v6.5–v6.8,可手动修补 vendor/phpmailer/phpmailer/src/PHPMailer.php:
// 找到以下两行(通常在类常量或静态属性定义处): // const CRLF = "\r\n"; // protected static $LE = "\r\n"; // 替换为(强制使用 Windows 风格 CRLF): const CRLF = "\r\n"; protected static $LE = "\r\n";
⚠️ 注意:此修改需在每次 composer install/update 后重新应用,建议配合 Composer Patches 自动化。
✅ 方案三:显式设置 CharSet 与 AltBody(增强兼容性)
即使 HTML 渲染正常,也应始终提供备用纯文本内容,避免部分客户端(如纯文本邮箱)完全不可读:
$mail->isHTML(true); $mail->CharSet = 'UTF-8'; // 必须在 isHTML() 后设置 $mail->Body = '<h2>Клиент выполнил оценку проекта.</h2><p>Имя: <b>sdfsdf</b></p>'; $mail->AltBody = "Клиент выполнил оценку проекта.\nИмя: sdfsdf"; // 纯文本降级内容
? 验证是否修复成功
发送后检查原始邮件(Gmail → 点击右上角「⋮」→「显示原始邮件」),确认:
- 邮件头部包含
Content-Type: multipart/alternative;; - HTML 部分明确声明
Content-Type: text/html; charset=UTF-8; - 边界字符串(如
--b1_kMw0lvaLD8a9kzvOpaPvFScTz5hnroHb3FHDBNGivk)前后均有完整\r\n。
⚠️ 其他关键注意事项
-
不要混用
msgHTML()和直接赋值$mail->Body:msgHTML()会自动设置AltBody并处理内嵌图片,若手动设置Body,请同步维护AltBody; -
俄文/中文等非 ASCII 字符务必设
CharSet = 'UTF-8',且 HTML<meta charset="UTF-8">非必需(邮件头优先); -
禁用
SMTPDebug = 2仅用于开发:生产环境开启调试可能导致敏感信息泄露; -
批量发送时启用
addAddress()循环而非单次传入数组,确保每个收件人独立记录。
PHPMailer 是经过 20 余年实战检验的工业级邮件库,其稳定性远超 PHP 内置 mail() 函数。面对 HTML 渲染异常,优先排查环境兼容性而非业务逻辑——一次正确的版本升级或换行符修复,即可永久规避此类“看似配置错误”的深层陷阱。


















