You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入邮件XML至MySQL TEXT字段出现异常字符问题求助

解决方案:邮件XML内容中的奇怪字符问题

你看到的=3D、=0D=0A是Quoted-Printable编码的转义字符,和UTF-8/UTF-16编码无关。Quoted-Printable是邮件系统常用的编码方式:

  • =3D是等号(=)的转义(等号的ASCII码十六进制为3D)
  • =0D=0A是回车换行符(\r\n)的转义

你的脚本直接读取了编码后的原始内容,没有解码,所以这些转义字符被直接存入了数据库。以下是具体解决步骤:


1. 基础修复:解码Quoted-Printable内容

PHP自带quoted_printable_decode()函数,专门处理这种编码。在你获取到$message变量后,直接添加解码逻辑:

// 原代码中获取完$message后,添加解码
$message = quoted_printable_decode($message);

2. 严谨处理:根据邮件头判断编码类型

不是所有邮件都用Quoted-Printable,建议先从邮件头中提取传输编码,再针对性处理:

// 在解析邮件头的循环中,新增获取传输编码的逻辑
$transfer_encoding = '';
if (preg_match("/^Content-Transfer-Encoding: (.*)/i", $lines[$i], $matches)) {
    $transfer_encoding = strtolower(trim($matches[1]));
}

// 解析完内容后根据编码处理
if ($transfer_encoding === 'quoted-printable') {
    $message = quoted_printable_decode($message);
} elseif ($transfer_encoding === 'base64') {
    // 处理Base64编码的邮件内容
    $message = base64_decode($message);
}

3. 统一编码:转成UTF-8存入数据库

即使解码后,邮件内容可能使用其他编码(比如GBK),需要统一转成UTF-8:

// 在解析邮件头时,提取内容编码
$charset = 'UTF-8'; // 默认UTF-8
if (preg_match("/^Content-Type:.*charset=([^\s;]+)/i", $lines[$i], $matches)) {
    $charset = strtoupper(trim($matches[1]));
}

// 将内容转码为UTF-8
if ($charset !== 'UTF-8' && mb_check_encoding($message, $charset)) {
    $message = mb_convert_encoding($message, 'UTF-8', $charset);
}

4. 数据库端配置

  • 连接数据库时执行SET NAMES utf8mb4;,确保连接字符集为utf8mb4(支持所有Unicode字符)
  • 存储XML的字段(TEXT/LONGTEXT)设置字符集为utf8mb4,避免编码不匹配导致的乱码

内容的提问来源于stack exchange,提问作者CJ Broersma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:15:39