Non*_*-da 7 python email message payload
我的应用程序是用python编写的.我正在做的是我在postfix收到的每封电子邮件上运行一个脚本,并对电子邮件内容做一些事情.Procmail负责运行以电子邮件作为输入的脚本.当我将输入消息(可能是文本)转换为email_message对象(因为后者派上用场)时,问题就出现了.我正在使用email.message_from_string(其中email是默认的电子邮件模块,随python一起提供).
import email
message = email.message_from_string(original_mail_content)
message_body = message.get_payload()
这个message_body有时返回一个列表[email.message.Message实例,email.message.Message实例],有时返回一个字符串(传入电子邮件的实际正文内容).为什么.甚至我发现了另外一个观察.当我浏览email.message.Message.get_payload()文档字符串时,我发现这个..
"""有效负载将是列表对象或字符串.如果您改变列表对象,则修改消息的有效负载地点....."""
那么如何通过python获取电子邮件正文的通用方法呢?请帮帮我.
Ali*_*har 13
好吧,答案是正确的,你应该阅读文档,但是对于一个通用方法的例子:
def get_first_text_part(msg):
maintype = msg.get_content_maintype()
if maintype == 'multipart':
for part in msg.get_payload():
if part.get_content_maintype() == 'text':
return part.get_payload()
elif maintype == 'text':
return msg.get_payload()
Run Code Online (Sandbox Code Playgroud)
这很容易发生一些灾难,因为可以想象部件本身可能有多个部件,它实际上只返回第一个文本部分,所以这也可能是错误的,但你可以使用它.
tim*_*mbo 10
使用walk()迭代消息内容,而不是简单地查找子部分
def walkMsg(msg):
for part in msg.walk():
if part.get_content_type() == "multipart/alternative":
continue
yield part.get_payload(decode=1)
Run Code Online (Sandbox Code Playgroud)
walk()方法返回一个可以循环的迭代器(即它是一个生成器).如果消息不是部分的容器(即没有附件或替代),则walk()方法将返回带有单个元素的迭代器 - 消息本身.
你想跳过任何"多部件"部件,因为它们只是粘合剂.
上述方法返回所有可读部分.如果文本部分包含您要查找的信息,则可能需要将其展开以简单地返回文本部分.
请注意,从Python 2.5开始,方法get_type(),get_main_type()和get_subtype()已被删除 - > http://docs.python.org/library/email.message.html#email.message.Message.walk
| 归档时间: |
|
| 查看次数: |
11613 次 |
| 最近记录: |