【问题标题】:Parsing forwarded emails解析转发的电子邮件
【发布时间】:2010-01-30 17:29:56
【问题描述】:

我正在编写一些代码来解析转发的电子邮件。我不确定是否有一些 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 库、约定或其他)。

【问题讨论】:

标签: python rfc


【解决方案1】:

与许多其他人所说的不同,转发电子邮件的标准,RFC 2046,“多用途 Internet 邮件扩展 (MIME) 第 2 部分:媒体类型”,已有十多年的历史。请参阅其第 5.2 节“消息媒体类型”。

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

我没有否决其他答案,因为它们在一个方面是正确的:并非每个邮寄者都遵循该标准。例如,mutt 邮件程序可以转发 RFC 2046 格式的消息,也可以转发 adhoc 格式的消息。因此,在实践中,邮件程序可能不能只处理 RFC 2046,它还必须解析各种其他和未指定的语法。

【讨论】:

    【解决方案2】:

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

    您不仅要应对邮件客户端的差异,还要应对用户偏好的差异。例如:Lotus Notes 将回复放在顶部,Thunderbird 将回复放在底部。因此,当 Thunderbird 用户回复 Lotus Notes 用户的回复时,他们可能会在顶部插入自己的回复,并在底部留下签名。

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

    >>> 超出限制的外部回复由
    中间回复者的邮件客户端\n
    >> 中间回复的消息正文
    > 上一个回复
    最新回复

    我不会解析消息并将其留给用户在他们的脑海中解析。或者,我会从另一个项目中借用代码。

    【讨论】:

    • 谢谢。幸运的是,我可以对传入的转发电子邮件设置一些限制。无论如何,很遗憾没有“最佳实践代码”。
    • 邮件标头的 RFC 现在是 RFC 5322。
    【解决方案3】:

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

    您可以查看标头,尤其是 User-Agent 标头,了解使用了哪种客户端,以及专门针对最常见客户端的代码。

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

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

    【讨论】:

    • 正如我在另一条评论中所写的,我可以对我的脚本的用户设置一些限制(例如,让他们只使用一个受支持的电子邮件客户端),但 HTML 部分仍然很棘手,因为原始收到的电子邮件几乎可以包含任何内容。
    • 如果客户端将原始文件包装在&lt;div&gt; 或其他东西中,当它转发它时,HTML 可能实际上是最简单的部分。
    【解决方案4】:

    回复/转发的标准是 > 在每一行前面加上邮件嵌套的次数,包括谁发送了最初的电子邮件,由客户来整理。所以你需要在 python 中做的只是简单地将 > 添加到每一行的开头。

    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>")
    

    【讨论】:

    • 谢谢,但似乎我没有说出这个词:parse 在我的问题中 :) 现在已修复。
    • 啊,这完全改变了问题。 :) 答案仍然存在,没有标准,完全取决于客户。
    • 看看现实世界,看看是否有其他程序可以做出正确的推断,尽管缺乏标准。例如,如果您订阅了 tripit.com 并将您的航班行程转发至plans@tripit.com,您的帐户将显示正确的旅行详情。至少,Tripit.com 可以做正确的事。 OP 如何近似这种行为?
    • tripit.com 我假设使用了大量的汗水和肘部油脂。有几百个旅游提供商,几十个电子邮件程序。如果您有人员,则为每个人编写解析器。确保它是一个严格的解析器,当出现格式不正确的内容时,编写一个新的解析器来处理该更改。可能需要 6 个月或更长时间才能做好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2011-01-07
    • 2018-12-01
    相关资源
    最近更新 更多