无法在Python中提取电子邮件文件的正文内容

11

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

    # 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


什么是错误信息? - Fabien
属性错误:'Message' 对象没有 'get_body' 属性。 - Sumanth
似乎该方法不存在。你有检查文档吗? - Fabien
参考此文档链接 https://docs.python.org/3/library/email.message.html#email.message.EmailMessage.get_body - Sumanth
1
这指的是EmailMessage而不是Message,你需要在对象内部再往下一层。你要找的是class email.message.EmailMessage - Fabien
显示剩余2条评论
2个回答

32

3.6版本的电子邮件库默认使用与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
啊,谢谢!我刚刚花了很长时间想知道为什么库和文档不匹配。 - Ville Laurikari
5
这应该是被接受的答案。在Python 3.7中仍然有效。 - Asotos

17

更新

如果你遇到了AttributeError: 'Message' object has no attribute 'get_body'错误,你可能想要阅读接下来的内容。

我进行了一些测试,似乎文档与当前库实现(2017年7月)确实存在差异。

你可能在寻找的是实际上是函数get_payload(),它似乎可以达成你想要实现的功能:

  

EmailMessage对象提供的概念模型是一个有序字典和表示消息RFC 5322正文的有效载荷,可能是子EmailMessage对象的列表

get_payload()在当前的2017年7月文档中没有被提到,但是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且消息不是多部分时,如果此标头的值为'quoted-printable'或'base64',则将解码负载。如果使用其他编码,或者标头丢失,或者负载具有虚假数据(即虚假的base64或uuencoded数据),则原样返回负载。

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


给我以下信息:msgBody=msg.EmailMessage.get_body('text/plain') AttributeError: 'Message'对象没有属性'EmailMessage' - Sumanth
感谢Fabien提供详细的答案,相信大多数人都会从中受益。 - Sumanth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接