【发布时间】:2012-09-22 19:54:29
【问题描述】:
我最近一直在实现一些基于 PHP/IMAP 的电子邮件处理功能,并且除了消息正文解码(在某些情况下)之外,大多数功能都运行良好。
我认为,到目前为止,我已经记住了一半的 RFC 2822(“Internet 消息格式”文档指南),阅读了六个开源 CMS 的电子邮件处理代码,并阅读了大量论坛帖子、博客文章等处理用 PHP 处理电子邮件。
我还分叉并完全重写了一个用于 PHP 的类 Imap,并且该类可以很好地处理电子邮件——我有一些有用的方法来检测自动回复(用于不在办公室、旧地址等) ,解码base64和8bit消息等
但是,我根本无法可靠地工作的一件事(或者,有时,根本无法)是当带有 Content-Transfer-Encoding: 7bit 的消息进入时。
似乎不同的电子邮件客户端/服务将7BIT 解释为不同的东西。我收到了一些据称是7BIT 的电子邮件,实际上 Base64 编码。我得到了一些实际上引用-可打印编码。还有一些没有以任何方式编码。还有一些是 HTML,但未指示为 HTML,它们也被列为 7BIT...
以下是使用 7 位编码接收的消息正文的一些示例(片段):
1:
A random message=20
Sent from my iPhone
2:
PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwi
IHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9m
3:
tangerine apricot pepper.=0A=C2=A0=0ALet me know if you have any availabili=
ty over the next month or so. =0A=C2=A0=0AThank you,=0ANames Withheld=0A908=
-319-5916=0A=C2=A0=0A=C2=A0=0A=C2=A0=0A=0A=0A______________________________=
__=0AFrom: Names Witheld =0ATo: Names Withheld=
这些都是全部以“7Bit”编码发送的(嗯,至少根据 PHP/imap_*),但它们显然需要更多解码才能将它们传递为纯文本。有什么方法可以可靠地将所有采用 7Bit 编码的消息转换为纯文本?
【问题讨论】:
-
如果每个人都只是发送纯文本电子邮件,并使用一个漂亮、简单的客户端,如 iOS 版 Mail 或命令行上的
mail,世界会变得更美好:) -
这些是损坏的消息。 7 位表示纯 ascii:消息中的所有字符都应该是纯 US-ASCII,没有额外的编码。有些东西在骗你。您当然可以尝试进行启发式检测。
-
另外,您应该使用 Thunderbird 之类的客户端下载原始 MIME 消息并查看它,以确保 PHP 中的某些内容不会欺骗您。