电子邮件正文有时是一个字符串,有时也是列表。为什么?

时间:2009-02-27 12:24:40

标签: 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()docstring时,我发现了这个...
“”” 有效负载将是列表对象或字符串。如果您发生变异 在列表对象中,您可以修改消息的有效负载.....“”“

那么如何通过python获取电子邮件正文的通用方法呢?请帮帮我。

4 个答案:

答案 0 :(得分: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()

这很容易发生一些灾难,因为可以想象部件本身可能有多部件,而且它实际上只返回第一个文本部分,所以这也可能是错误的,但你可以使用它。

答案 1 :(得分:10)

看起来很疯狂,有时字符串,有时是列表语义的原因是given in the documentation。基本上,多部分消息作为列表返回。

答案 2 :(得分:10)

使用walk()迭代消息内容

,而不是简单地查找子部分
def walkMsg(msg):
  for part in msg.walk():
    if part.get_content_type() == "multipart/alternative":
      continue
    yield part.get_payload(decode=1)

walk()方法返回一个可以循环的迭代器(即它是一个生成器)。如果消息不是部分容器(即没有附件或替代),则walk()方法将返回带有单个元素的迭代器 - 消息本身。

你想跳过任何“多部分”部分,因为它们只是粘合剂。

上述方法返回所有可读部分。如果文本部分包含您正在寻找的信息,您可能需要将其展开以简单地返回文本部分。

请注意,从Python 2.5开始,方法get_type(),get_main_type()和get_subtype()已被删除 - > http://docs.python.org/library/email.message.html#email.message.Message.walk

答案 3 :(得分:0)