【问题标题】:How to format incoming email text for HTML display如何为 HTML 显示格式化传入的电子邮件文本
【发布时间】:2010-07-16 15:07:53
【问题描述】:

我设置了一个脚本来处理收到的电子邮件并在 Blogger 上创建博客条目。我正在使用 PEAR 的 Mail_Mime 库(现在)来阅读传入的消息。邮件中通常包含浏览器无法读取的字符——这种情况最常发生在人们使用 Outlook 或从 MS Word 剪切/粘贴时。

所以另一端的输出是这样的:

这是一个带有“引号”和“撇号”的测试帖子——值得一提的是,它还有破折号——以及从 MS Word 中剪切和粘贴的其他奇怪格式。

你也可以在野外see the output

修复任何特定实例并不难,但每个客户端(hotmail、gmail、outlook 等)的处理方式似乎略有不同。 Mail_Mime 似乎只处理输出,如果我关闭 Mail_Mime 的解析并尝试自己使用 mb_convert_encoding 或对此进行一些手动模拟来翻译编码字符,那就更糟了。

请注意,选择正确的编码类型并使用解码/编码/转换功能无法解决此问题。传入的格式从 Windows-1252 到 UTF8 到邮件客户端可以想到的任何其他格式。

在此之前有没有人编写过这个脚本,可以通过提供最佳方法的示例或建议来节省我一些时间?我已经尝试了所有简单的答案并进行了大量实验,因此请不要打扰回复,除非您已成功处理过类似问题或对编码问题有深入了解。

【问题讨论】:

  • 电子邮件信息必须按照标题中的规定进行解释(请参阅 Content-Type 字段中的 charset 参数)。如果缺少,RFC 5322 暗示 US-ASCII。
  • 这是由 Mail_Mime 自动完成的。这个问题比简单地理解协议要复杂得多。
  • 这篇文章有一些有趣的想法:stackoverflow.com/questions/2686515/… 不过,我不知道它如何适用于我的问题。

标签: php email character-encoding


【解决方案1】:

做到这一点的唯一方法是按照规范来做,我害怕拉入“Content-Type”mime 标题,拿起字符集(它看起来像Content-Type: text/plain; charset="us-ascii")然后转换转为 UTF-8,当然还要确保您在网络上的输出以带有正确标头的 UTF-8 格式发送。

【讨论】:

  • Mail_Mime 库已经提取了字符集并进行了相应的转换。一些符号,尤其是从 Word 复制的符号,仍然会被修改。这不是不知道该怎么做的问题,而是他们不遵守他们声称要发送的字符集的问题。
【解决方案2】:

为了解决这个问题,并将我的消息转换为可从浏览器读取的有效 UTF-8,我找到了这个 PHP 库 ConvertCharset by Mikolaj Jedrzejak,它几乎适用于所有东西。从 Windows-1252 或 iso-8859-1 转换时,特定符号 (=A0) 仍然存在问题。所以我在设置代码松散之前手动转换了这个字符。

这是它的整体外观:

// decode using Mail_Mime
require 'Mail.php';
require 'Mail/mime.php';
require 'Mail/mimeDecode.php';
$params['include_bodies'] = true;
$params['decode_bodies']  = true; // this decodes it!
$params['decode_headers'] = true;
$decoder = new Mail_mimeDecode($input);
$mime = $decoder->decode($params);

// too much work to put in this example
$charset = ...; //do some magic with $mime->parts to get the character set
$text = ...; //do some magic with $mime->parts to get the text

// fix the =A0 control character; it's already been decoded 
// by Mail_Mime, so we need the actual byte code now
// this has to be done before trying to convert to UTF-8
$char = chr(hexdec(substr('A0',1)));
$text = str_replace($char, '', $text);

// convert to UTF-8 using ConvertCharset
require 'ConvertCharset.class.php';
if( strtolower($charset) != 'utf-8' ) {
  $converter = new ConvertCharset($charset, 'utf-8', false);
}
$text = $converter->Convert($text);

然后一切都很漂亮。它甚至可以进行臭名昭著的 Iñtërnâtiônàlizætiøn 转换,以及直接从 MS Word 接受法语、西班牙语和粘贴 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多