【问题标题】:Get body text of an email using python imap and email package使用 python imap 和电子邮件包获取电子邮件的正文
【发布时间】:2013-04-30 23:22:09
【问题描述】:

我想使用 python imap 和电子邮件包检索电子邮件的正文(仅文本)。

根据SO thread,我正在使用以下代码:

mail = email.message_from_string(email_body)
bodytext = mail.get_payload()[ 0 ].get_payload()

虽然它在某些情况下工作正常,但有时我得到类似于以下响应

[<email.message.Message instance at 0x0206DCD8>, <email.message.Message instance at 0x0206D508>]

【问题讨论】:

标签: python email python-2.7


【解决方案1】:

您假设消息具有统一的结构,具有一个明确定义的“主要部分”。事实并非如此;消息可能包含单个部分而不是文本部分(只是二进制文件的“附件”,仅此而已),或者它可以是包含多个文本部分的多部分(或者,同样,根本没有),甚至如果只有一个,则不必是第一部分。此外,还有嵌套的多部分(一个或多个部分是另一个 MIME 消息,递归地)。

总之,您必须检查 MIME 结构,然后决定哪些部分与您的应用程序相关。如果您只收到来自相当静态的一小部分客户端的消息,您可能能够偷工减料(至少在 Microsoft Plague 的下一次升级之前),但总的来说,根本没有任何类型的层次结构,只是一组(不一定总是直接相关的)同样重要的部分。

【讨论】:

【解决方案2】:

我的主要问题是回复或转发的消息在正文中显示为消息实例。

使用以下代码解决了我的问题:

bodytext=mail.get_payload()[0].get_payload();
if type(bodytext) is list:
    bodytext=','.join(str(v) for v in bodytext)

【讨论】:

  • 在返回列表时加入内容的想法对我有帮助,谢谢。
【解决方案3】:

也许this post(我的)可以提供帮助。我收到一份时事通讯,上面有美国不同种类石油的价格。我在 gmail 中获取具有给定标题模式的电子邮件,然后使用正则表达式提取邮件正文中的价格。所以我必须访问标题遵守给定模式的最后 n 封电子邮件的邮件正文。

我也在使用email.message_from_string()msg = email.message_from_string(response_part[1])

所以也许它会给你一个具体的例子来说明如何在这个 python 库中使用方法。

【讨论】:

    【解决方案4】:

    外部库:https://github.com/ikvk/imap_tools

    from imap_tools import MailBox 
    
    # get list of email texts from INBOX folder
    with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX') as mailbox:
        data = [msg.text for msg in mailbox.fetch()]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多