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

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)

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


unw*_*ind 10

尽管看起来很疯狂,但文档给出了有时字符串,有时是列表语义的原因.基本上,多部分消息作为列表返回.


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