0

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

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

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

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

4

1 回答 1

1

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

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

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

您需要了解的所有详细信息都在 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 "<p>各位同事,..."

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

于 2013-08-23T09:35:13.607 回答