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

Python 电子邮件正文有时是字符串,有时是列表。为什么?,python,email,message,payload,Python,Email,Message,Payload,我的应用程序是用python编写的。我所做的是在postfix收到的每封邮件上运行一个脚本,并对邮件内容做一些处理。Procmail负责以电子邮件作为输入运行脚本。当我将输入消息(可能是文本)转换为email_message对象(因为后者很方便)时,问题就出现了。我正在使用email.message_from_string(其中email是默认的电子邮件模块,由python提供) 导入电子邮件 message=email.message\u from\u字符串(原始邮件内容) message\

我的应用程序是用python编写的。我所做的是在postfix收到的每封邮件上运行一个脚本,并对邮件内容做一些处理。Procmail负责以电子邮件作为输入运行脚本。当我将输入消息(可能是文本)转换为email_message对象(因为后者很方便)时,问题就出现了。我正在使用email.message_from_string(其中email是默认的电子邮件模块,由python提供)


导入电子邮件
message=email.message\u from\u字符串(原始邮件内容)
message\u body=message.get\u有效负载()
此邮件正文有时返回列表[email.message.message实例,email.message.message实例],有时返回字符串(传入电子邮件的实际正文内容)。为什么呢。甚至我还发现了另一个观察结果。当我浏览email.message.message.get_payload()docstring时,我发现了这个..
""" 有效负载将是列表对象或字符串 在列表对象中,您可以就地修改消息的有效负载….“

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

可能是


请参见

尽管看起来很疯狂,但有时使用字符串,有时使用列表语义的原因如下。基本上,多部分消息以列表的形式返回。

答案是正确的,您应该阅读文档,但作为一个通用方法的示例:

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()

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

使用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()已被删除->

在我提到的消息列表中,我尝试在每个对象上运行get_payload()。两者都返回相同的内容。一个对象是另一个对象的克隆,因此,如果我在一个单独的部分上调用get_有效负载,就可以了???这取决于你被发送了什么。例如,您通常可能会得到相同内容的text/html和text/plain版本。您可以修改该函数以查找文本/普通内容类型而不是其他文本/类型。还请注意,消息没有“正确”的结构。不同的邮件客户端将以不同的结构对它们进行组织,并设置不同的标题。忽略某些邮件是HTML的事实-您需要一个HTML反解析器来使用所有可能的文本子类型。这是一个比OP,IMHO接受的答案好得多的答案。我认为if语句中的单个“=”应该是“=”