解析转发的电子邮件

时间:2010-01-30 17:29:56

标签: python rfc

我正在为解析转发的电子邮件写一些代码。我不确定的是,是否有一些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部分)进行狂野处理。

如果它仍然不够精确,我会澄清它,只是我不是100%肯定要问什么(RFC,Python lib,惯例或其他)。

4 个答案:

答案 0 :(得分:5)

与许多其他人所说的不同, 是转发电子邮件的标准,RFC 2046,“多用途互联网邮件扩展(MIME)第二部分:媒体类型”,超过十年旧。具体请参见第5.2节“消息媒体类型”。

RFC 2046背后的基本思想是将一条消息封装到另一条消息的MIME部分中,类型名为(不幸的)message/rfc822(永远不要忘记MIME是递归的)。 MIME library of Python可以很好地处理它。

我没有对其他答案进行投票,因为它们在一个方面是正确的:每个邮件程序都没有遵循标准。例如,mutt邮件程序可以转发RFC 2046格式的邮件,但也可以转发格式。因此,在实践中,邮件程序可能无法仅处理RFC 2046,它还必须解析各种其他语法和未指定的语法。

答案 1 :(得分:2)

根据我的经验,电子邮件客户端转发/回复的方式不同。通常,您将在邮件包底部的mime中使用纯文本版本和html编码版本。邮件标题确实有一个RFC(http://www.faqs.org/rfcs/rfc2822.html "2822"),但不幸的是,邮件正文的内容超出了范围。

您不仅需要应对邮件客户端方差,还要处理用户首选项的差异。举个例子:Lotus Notes将回复放在顶部,Thunderbird回复在底部。因此,当Thunderbird用户回复Lotus Notes用户的回复时,他们可能会在顶部插入回复并将其签名保留在底部。

另一个陷阱可能是与回复链的自动换行相抗衡。

&GT;&GT;&GT;&GT;超出限制的外部回复,由单词包裹 中间回复者的邮件客户端\ n
&GT;&GT;中间回复的消息正文
&GT;上一个回复
最新回复

我不会解析该消息并将其留给用户解析。或者,我从其他项目借用代码。

答案 2 :(得分:2)

正如其他答案已经表明:没有标准,你的程序也不会完美无缺。

您可以查看标题,特别是User-Agent标题,以查看使用了哪种类型的客户端,以及专门针对最常见客户端的代码。

要了解您应该考虑支持的客户,请查看this popularity study。各种Outlook,Yahoo!,Hotmail,Mail.app,iPhone邮件,Gmail和Lotus Notes排名很高。大约11%的邮件被归类为“不可检测”,但使用转发电子邮件中的标题您可能会做得更好。请注意,通过在电子邮件中放置图像来收集统计信息,因此结果可能会有所偏差。

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

答案 3 :(得分:1)

回复/转发的标准是&gt;在每行之前预先嵌入邮件的次数,包括发送初始电子邮件的人由客户端进行整理。所以你需要在python中做的只是添加&gt;到每一行的开头。

imap Test <imap@gazler.com> Wrote:
>
>twice
>imap Test wrote:
>> nested
>>
>> imap@gazler.com wrote:
>>> test
>>>
>>> -- 
>>> Message sent via AHEM.
>>>   
>>
>

附件只需要附加到邮件上,或者当你把它变成“狂野”时。

我不熟悉python,但相信代码会是:

string = string.replace("\n","\n>")