php邮件中文乱码的解决关键是统一编码:设$mail->charset='utf-8',标题用"=?utf-8?b?".base64_encode("中文")."?=",正文确保utf-8字符串及html中,php文件保存为utf-8无bom。

要更改PHP源码中邮件发送的编码格式,关键不是修改PHP核心源码(不推荐也不必要),而是调整你调用邮件功能时所用的参数、函数配置和内容编码方式。乱码问题几乎都源于“编码声明”与“实际内容编码”不一致,而非PHP本身限制。
设置邮件主体和标题的字符集
使用 PHPMailer 时,必须显式指定字符集,并对中文标题做 MIME 编码:
- $mail->CharSet = "UTF-8"; —— 这行必须放在创建对象后、发送前,它影响正文、附件名等的默认编码
-
标题不能直接赋值中文字符串,需用 Base64 编码并加 MIME 前缀:
$mail->Subject = "=?UTF-8?B?" . base64_encode("订单确认") . "?="; - 正文如果是 HTML,确保在
中有<meta charset="UTF-8">,且内容本身是 UTF-8 编码的字符串
统一源文件与运行环境编码
邮件内容乱码常因 PHP 文件本身保存为 GBK 或含 BOM 的 UTF-8:
- 用 VS Code、Sublime Text 等编辑器将所有 PHP 文件另存为 UTF-8 无 BOM
- 检查
php.ini中是否设置了 default_charset = "UTF-8" - 脚本开头可加 header('Content-Type: text/html; charset=UTF-8');(仅限 Web 环境,不影响邮件发送但有助于调试)
改用 mb_send_mail() 并设置语言编码
如果你不用第三方库,而是用 PHP 内置的 mb_send_mail(),需配合 mb_language():
- 调用前设语言:mb_language('zh-cn'); 或 mb_language('neutral');
- 该设置会自动对
$subject和$message按对应规则(如 HZ 或 BASE64)编码 - 注意:
mb_send_mail()依赖 mbstring 扩展已启用,且mb_internal_encoding()最好也设为 UTF-8
处理已有非 UTF-8 字符串内容
若邮件内容来自数据库、文件或旧系统,原始编码可能是 GBK/GB2312,需转换后再发送:
- 用 mb_convert_encoding($str, 'UTF-8', 'GBK') 或 iconv('GBK', 'UTF-8//IGNORE', $str)
- 转换前先检测编码:mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true),避免误转
- 特别注意:数据库连接编码也要同步为 utf8mb4,否则读出来的字段即使转码也可能失真
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











