我正在阅读存储在我的机器中的电子邮件文件,能够提取电子邮件的标题,但无法提取正文。
# 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
答案 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
。