Python中字符串格式的邮件有效载荷

1 投票
2 回答
4817 浏览
提问于 2025-04-17 08:36

我用 get_payload() 方法得到了一个字符串形式的负载(payload)。但是我想把这个负载处理成可以逐字访问的方式。

我尝试了好几种方法,比如 as_string() 方法、flatten() 方法和 get_charset() 方法,但每次都遇到了一些问题。

我用以下代码得到了我的负载:

import email
from email import *
f=open('mail.txt','r')
obj=email.parser.Parser()
fp=obj.parse(f)
payload=fp.get_payload()

2 个回答

0

我得到了一个字符串作为我的数据,因为我的数据不是多部分的。如果是多部分的话,它会返回一个字符串列表。所以现在我可以直接使用以下代码。

payload=fp.get_payload()
abc=payload.split(" ")

运行后,它给我的输出是这样的:

['good', 'day\nhttp://72.167.116.186/image/bdfedx.php?iqunin=3D41\n\n', '', '', '', '', '', '', '', '', '', '', '', 'Sun,', '18', 'Dec', '2011', '10:53:43\n_________________\n"She', 'wiped', 'him', 'dry', 'with', 'soft', 'flannel,', 'and', 'gave', 'him', 'some', 'clean,', 'dry', 'clothes,=\n', 'and', 'made', 'him', 'very', 'comfortable', 'again."', '(c)', 'Lyrica', 'wa946758\n']

感谢 jdi :)
附注:昨天没法把它发成答案,因为有一些积分的限制。

3

我刚刚用我自己的一些原始邮件测试了你的代码片段,运行得很好……

get_payload() 这个函数会返回一个列表或者字符串,所以你需要先检查这一点。

if isinstance(payload, list):
    for m in payload:
        print str(m).split()

else:
    print str(m).split()

编辑

根据我们的讨论,你的问题是没有在 fp 对象上检查 is_multipart(),而 fp 实际上是一个消息实例。如果 fp.is_multipart() 返回 True,那么 get_payload() 会返回一个消息实例的列表。在你的例子中,根据你提供的邮件内容,它并不是多部分的,fp 实际上就是你想要的那个对象。

撰写回答