【问题标题】:Reliably Clean Email Message Body Encoding可靠干净的电子邮件消息正文编码
【发布时间】:2013-08-22 11:23:44
【问题描述】:

我正在用 php 编写一个小软件,它连接到 IMAP 邮箱并将其中包含的消息存储在 MySQL DB 中以供以后处理和其他好处。

我注意到,在测试过程中,当我尝试将邮件正文保存为原始时,邮件正文中出现了一些奇怪的字符。我正在使用 imap_fetchbody() 来提取消息正文。

我注意到,当我使用quoted_printable_decode() 来清理邮件正文时,这很有帮助!然而,在进行大量研究时,我也了解到这并不总是有帮助,应该使用其他方法,如 utf8_encode() 和 base64_decode() 来清理消息体。

那么,我的问题是:用 php 可靠地清理电子邮件正文以涵盖所有编码场景的最佳方法是什么?

【问题讨论】:

    标签: php encoding imap


    【解决方案1】:

    如今,“电子邮件正文”实际上是由单个 MIME 部分组成的树。有时只有其中之一,例如text/plain 邮件。有时有一个multipart/alternative,它在其中包含消息的两个“等效”副本,一个为text/plain,另一个为text/html。有时结构要复杂得多,有很多层次的嵌套。很常见的是,其中一些部分实际上是二进制内容,例如图像、附加的 ZIP 文件等等。

    这些单独的 MIME 部分中的每一个都可以编码以进行传输;这些在相应 MIME 部分的 Content-Transfer-Encoding 标头中指定。您绝对必须支持互操作的两种编码方案是quoted-printablebase64。一个重要的观察结果是,这种编码对每个部分都是单独进行的,即,将 multipart/alternativetext/plain 编码为 quoted-printable 和另一部分 text/html 编码在 base64 中是完全合法的。

    当您解码此传输编码后,您仍然需要将文本从其字符编码解码为 Unicode,即将字节流转换为 Unicode 文本。您需要查阅Content-Type MIME 标头的encoding 参数(同样,部分标头,而不是整个消息标头,除非消息本身只有一部分)。

    您需要了解的所有详细信息都在 RFC 2045、RFC 2046、RFC 2047 和 RFC 2048(及其相应的更新)中。

    最后,还有一个有趣的问题是电子邮件的“主要部分”是什么。假设你有这样的东西:

    1个多部分/混合 + 1.1 text/plain:“嗨,我正在转发 Jeff 的消息……” + 1.2 消息/rfc822 + 1.2.1 多部分/替代 + 1.2.1.1 text/plain “嗨,同事们,我正在从……发送会议记录” + 1.2.1.2 text/html "

    各位同事,..."

    即这发生在 Fred 将 Jeff 的消息转发给您时。这里的“主要部分”是什么?

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2021-02-06
      • 2015-01-15
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多