无法在python中提取电子邮件文件的正文

时间:2017-07-16 01:25:53

标签: python

我正在阅读存储在我的机器中的电子邮件文件,能够提取电子邮件的标题,但无法提取正文。

    # The following part is working , opening a file and reading the header .

    import email
    from email.parser import HeaderParser
    with open(passedArgument1+filename,"r",encoding="ISO-8859-1") as f:
        msg=email.message_from_file(f)
        print('message',msg.as_string())
        parser = HeaderParser()
        h = parser.parsestr(msg.as_string())
        print (h.keys())  

       # The following snippet gives error
        msgBody=msg.get_body('text/plain')

是否有任何正确的方法来仅提取正文消息。此时此刻。

作为参考,可以从

下载电子邮件文件

https://drive.google.com/file/d/0B3XlF206d5UrOW5xZ3FmV3M3Rzg/view

2 个答案:

答案 0 :(得分:12)

3.6电子邮件lib默认使用与Python 3.2兼容的API,这就是造成这个问题的原因。

请注意以下声明中的默认策略:

email.message_from_file(fp, _class=None, *, policy=policy.compat32)

如果您想使用在3.6文档中看到的“新”API,则必须使用不同的策略创建消息。

import email
from email import policy
...
msg=email.message_from_file(f, policy=policy.default)

会为您提供在文档中看到的新API,其中包含非常有用的内容:get_body()

答案 1 :(得分:10)

<强>更新

如果您遇到AttributeError: 'Message' object has no attribute 'get_body'错误,可能需要阅读以下内容。

我做了一些测试,与目前的图书馆实施(2017年7月)相比,似乎文档确实是错误的。

您可能正在寻找的实际上是get_payload()函数似乎可以实现您想要实现的目标:

  

EmailMessage对象提供的概念模型是   有序的字典,加上代表的有效载荷   消息的RFC 5322正文,可能是列表   sub-EmailMessage对象

get_payload()目前不在2017年7月Documentation,但help()表示以下内容:

get_payload(i=None, decode=False) method of email.message.Message instance
  Return a reference to the payload.
     

有效负载将是列表对象或字符串。如果你变异   在列表对象中,您可以修改消息的有效负载。可选的   i将该索引返回到有效负载中。

     

可选decode是一个标志,指示是否应根据Content-Transfer-Encoding解码有效负载   标头(默认为False)。

     

True且邮件不是多部分时,如果此标头的值是“引用的 - 可打印的”,则有效负载将被解码。或者&#39; base64&#39;。如果使用了某些其他编码,或者标头丢失,或者有效载荷有伪造数据(即伪造的base64或uuencoded数据),则按原样返回有效载荷。

     

如果消息是多部分且解码标志为True,则返回None