我正在使用 Mail_mimeDecode从收到的电子邮件中提取附件。一段时间以来一切正常,直到我开始收到文件名编码为 KOI8 的附件。 ,带有这样的节标题:
Content-Disposition: attachment; filename="=?KOI8-R?B?8NLJzM/Wxc7JxSAudHh0?="
mimeDecode 做了一件非常合理的事情并返回 KOI8 中的文件名:
$attachmentNameInKOI8 = $part->d_parameters['filename'];
问题是我需要它在 UTF-8 中。在这个具体示例中,我可以运行以下命令来进行转换:
$attachmentNameInUTF8 = iconv('KOI8', 'UTF-8', $attachmentNameInKOI8);
但如果不尝试手动解析消息,我不知道该名称何时在 KOI8 中,何时不在。我还担心其他一些编码很快就会出现,所以我需要一种方法来处理可能遇到的任何问题。
我读过 mb_detect_encoding不可靠,事实上我无法将字符串检测为 KOI8。
有没有办法告诉 mimeDecode 为我做翻译?我查看了 mimeDecode.php:_decodeHeader() 的源代码我可以看到它解析了编码但随后什么也不做,这似乎是在浪费机会。
更新:明确地说,这只是 header 的问题,而不是正文的问题,因为 mimeDecode 公开了正文的字符集,因此您自己运行 iconv 非常容易,如下所示:
$bodyutf = iconv($textpart->ctype_parameters['charset'], 'UTF-8', $textpart->body);
最佳答案
在替换之前向 _decodeHeader() 添加一行似乎可以解决问题:
$text = iconv($charset, 'UTF-8', $text);
$input = str_replace($encoded, $text, $input);
他们没有在原始类中构建这样的选项似乎很奇怪,不是吗?
注意:我注意到主题行和其他 header 也可以像文件名一样编码 (RFC2047)。似乎将 iconv 行添加到 _decodeHeader 可以解决所有这些情况。
奇怪的是,mimeDecode 中还没有内置这样的功能——这不是一个罕见的问题。
编辑:我现在明白 mimeDecode 具有 decode_headers=false 选项的意义在于获取原始值,以便您可以自己解码它们。这似乎是一种浪费,因为如果您不相信它会返回预期字符集中的字符串,那么让 mimeDecode ever 解码您的 header 是没有意义的(它更有意义接受一个字符集作为要解码的参数;或者 null 表示不解码......我觉得他们不太可能为我改变它。)所以关键是你需要自己解码。不幸的是,它不像直接调用 imap_utf8() 或 imap_mime_header_decode() 那样简单。您可以从 mimeDecode 中获取 _decodeHeader() 函数并修改它,或者使用类似这样的方法:
http://www.php.net/manual/en/function.imap-mime-header-decode.php#71762
编辑 #2:令人难以置信的是,mimeDecode 人员已经将我的建议纳入了他们最新的 svn:
https://pear.php.net/bugs/bug.php?id=18876
在该版本上,您现在可以设置 decode_headers='UTF-8',mimeDecode 将为您完成所有工作。哇!
关于php - 如何自动将电子邮件附件文件名转换为 UTF-8(使用 Mail_mimeDecode),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7559111/