8

我的应用程序是用 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 instance,email.message.Message instance],有时会返回一个字符串(传入电子邮件的实际正文内容)。为什么。甚至我还发现了另一个观察结果。当我浏览 email.message.Message.get_payload() 文档字符串时,我发现了这个..
""" 有效负载将是一个列表对象或字符串。如果你改变列表对象,你修改消息的有效负载地方.....”””

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

4

4 回答 4

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

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

于 2009-02-27T12:53:42.213 回答
10

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

于 2009-02-27T12:31:24.373 回答
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

于 2010-08-22T23:04:49.570 回答
0

它可能是MIME 多部分

请参阅http://docs.python.org/library/email.parser.html#additional-notes

于 2009-02-27T12:30:42.550 回答