解析转发的电子邮件

11 投票
4 回答
6927 浏览
提问于 2025-04-15 18:40

我正在写一些代码来解析转发的电子邮件。不过,我不太确定是否有一些Python库、某个RFC标准,或者其他资源可以帮助我自动化这个任务。

具体来说,我不清楚转发邮件的“格式”是否有某种标准或推荐,还是说这些格式只是随着时间的发展而演变,现在大多数邮件客户端在文本部分输出的内容都差不多:

    Begin forwarded message: 

    > From: Me <me@me.me>
    > Date: January 30, 2010 18:26:33 PM GMT+02:00
    > To: Other Me <other-me@me.me>
    > Subject: Unwise question

-- 还有附件的部分(以及可能存在的其他MIME部分)。

如果这还不够清楚,我可以再解释一下,只是我不太确定该问什么(RFC、Python库、约定或者其他什么)。

4 个回答

2

正如其他回答所说的:没有统一的标准,你的程序可能不会完美无缺。

你可以看看邮件的头部信息,特别是 User-Agent 这个字段,来了解使用了什么样的客户端,然后针对最常见的客户端进行编程。

想知道你应该支持哪些客户端,可以参考这个受欢迎程度的研究。各种版本的Outlook、Yahoo!、Hotmail、Mail.app、iPhone邮件、Gmail和Lotus Notes都排名靠前。大约有11%的邮件被归类为“无法检测”,但通过查看转发邮件的头部信息,你可能能做得更好。需要注意的是,这些统计数据是通过在邮件中放置一张图片来收集的,所以结果可能会有偏差。

另一个问题是HTML邮件,它可能包含也可能不包含纯文本版本。我不太确定不同客户端在这方面的常见行为。

6

跟很多人说的不同,其实转发邮件是有一个标准的,这个标准叫做 RFC 2046,它是关于“多用途互联网邮件扩展(MIME)第二部分:媒体类型”的,已经有十多年了。特别是它的第5.2节,讲的是“消息媒体类型”。

RFC 2046 的基本思想是把一条消息放进另一条消息的 MIME 部分里,这种类型叫做 message/rfc822(虽然这个名字有点奇怪)。记住,MIME 是可以嵌套的。Python 的 MIME 库 可以很好地处理这个。

我没有给其他回答点踩,因为它们在某种程度上是对的:并不是所有的邮件客户端都遵循这个标准。比如,mutt 邮件客户端可以以 RFC 2046 格式转发邮件,但也可以用其他自定义格式。所以在实际操作中,一个邮件客户端可能不能只处理 RFC 2046,还得能解析各种其他格式和不太明确的语法。

2

根据我的经验,几乎每个邮件客户端在转发或回复邮件时的方式都不一样。通常,你会在邮件的底部看到一个纯文本版本和一个用HTML编码的版本。邮件的头部确实有一个标准(RFC),你可以在这里查看:http://www.faqs.org/rfcs/rfc2822.html "2822",但遗憾的是,邮件内容的具体格式并不在这个标准的范围内。

不仅要考虑不同邮件客户端的差异,还要考虑用户的个人偏好。例如:Lotus Notes会把回复放在顶部,而Thunderbird则把回复放在底部。所以,当一个Thunderbird用户回复一个Lotus Notes用户的邮件时,他们可能会把自己的回复放在顶部,而把签名留在底部。

另一个可能遇到的问题是处理回复链的换行问题。

>>>> 外部回复超出了限制,被中间回复的邮件客户端换行了
中间回复的消息内容
> 之前的回复
最新的回复

我不会去解析这些邮件内容,而是让用户自己在脑海中理解。如果需要,我会借用其他项目的代码来处理。

撰写回答