可靠地清理电子邮件正文编码

时间:2013-08-22 11:23:44

标签: php encoding imap

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

我注意到在测试期间,当我尝试保存邮件正文时,我会在邮件正文中出现一些奇怪的字符。我使用imap_fetchbody()来提取邮件正文。

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

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

1 个答案:

答案 0 :(得分:1)

“电子邮件正文”现在实际上是各个MIME部分的树。有时只有其中一个,例如一封text/plain邮件。有时会有一个multipart/alternative在其中包含两个“等效”的邮件副本,一个作为text/plain,另一个作为text/html。有时候结构要复杂得多,嵌套程度也很高。这些部分中的一些实际上是二进制内容,例如图像,附加的ZIP文件以及其他内容,这是很常见的。

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

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

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

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

1 multipart/mixed
  + 1.1 text/plain: "Hi, I'm forwarding Jeff's message..."
  + 1.2 message/rfc822
    + 1.2.1 multipart/alternative
       + 1.2.1.1 text/plain "Hi coleagues, I'm sending the meeting notes from..."
       + 1.2.1.2 text/html "<p>Hi colleagues,..."

即。当弗雷德将杰夫的信息转发给你时,就会发生这种情况。这里的“主要部分”是什么?