【问题标题】:Parsing email text body with imaplib使用 imaplib 解析电子邮件文本正文
【发布时间】:2013-11-03 14:38:48
【问题描述】:

我只想从 Gmail(通常是 imap 服务器)获取电子邮件文本正文,而无需下载整个邮件。

如果我获取 RC822,我可以得到一切都很好:

mail_box.fetch(message_ids, '(RFC822)')

但问题是,如果我有太多的邮件和附件,这会花费很多时间。

我可以得到我需要的标题和正文:

mail_box.fetch(message_ids, '(RFC822.HEADER BODY.PEEK[1])')

但是这样我无法解析文本正文,它的格式很奇怪:

'\r\n------=_NextPart_001_0011_01CB63DF.D39BA1C0\r\nContent-Type: text/plain;\r\n\tcharset="iso-8859-1"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nRafael, ...other content like html tags and css...------=_NextPart_001_0011_01CB63DF.D39BA1C0--\r\n'

尝试使用 email.message_from_string 和 quopri 模块对其进行解析,但到目前为止没有运气。

有可能吗?要获取格式如 RFC822 但不下载附件的消息?

【问题讨论】:

  • ------=_NextPart_001_0011_01CB63DF.D39BA1C0 提示消息是带有标题字段Content-Type: multipart/....; boundary=----=_NextPart... 的多部分消息。也许您必须将 Content-Type 标头传递给解码主体的函数,以便它知道如何处理 NextPart 事物。一些附加信息:en.wikipedia.org/wiki/MIME#Multipart_messages
  • 要么获取并解析 BODYSTRUCTURE,你可以只获取你需要的部分,或者获取 MIME 部分标头以配合 1。MIME 消息非常复杂,IMAP 中没有办法说“只需给出正文”(哪一个?HTML?文本?RTF?PDF?),所以您可以猜测,或者您下载 BODYSTRUCTURE 并确定您真正想要的部分并获取它,例如 1.1 或 1.1.1。 ...
  • 我做到了,我获取了第一个 BODYSTRUCTURE 并发现纯文本消息为 1(这就是我获取 BODY.PEEK[1] 的原因)。但是获取这个,它在文本字符串上带有这个奇怪的标题。我正在使用切片和子字符串手动解析,只是想知道我是否有更好的方法。

标签: python email imap imaplib


【解决方案1】:

正确的做法是请求消息的BODYSTRUCTURE,只取相关部分。

在 cmets 中,您建议您已经获取了 BODYSTRUCTURE 并且 1 部分对应于 text/plain MIME 部分。请向我们展示完整的、未处理的BODYSTRUCTURE;没有它,就无法判断您使用的 IMAP 服务器是否有问题,或者您对BODYSTRUCTURE 的理解是否错误。

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 2013-09-22
    • 2012-12-11
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多