python - 如何使用 Python 获取电子邮件文本内容?

标签 python email mime rfc822

给定 Python 2.6 中的 RFC822 消息,我如何才能获得 正确 文本/纯内容部分?基本上,我想要的算法是这样的:

message = email.message_from_string(raw_message)
if has_mime_part(message, "text/plain"):
    mime_part = get_mime_part(message, "text/plain")
    text_content = decode_mime_part(mime_part)
elif has_mime_part(message, "text/html"):
    mime_part = get_mime_part(message, "text/html")
    html = decode_mime_part(mime_part)
    text_content = render_html_to_plaintext(html)
else:
    # fallback
    text_content = str(message)
return text_content

在这些东西中,我有 get_mime_parthas_mime_part,但我不太确定如何从 MIME 部分获取解码后的文本。我可以使用 get_payload() 获取 encoded 文本,但如果我尝试使用 get_payload() 方法(参见 the doc )当我在 text/plain 部分调用它时出现错误:

File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
email/message.py", line 189, in get_payload
    raise TypeError('Expected list, got %s' % type(self._payload))
TypeError: Expected list, got <type 'str'>

另外,我不知道如何获取 HTML 并将其呈现为尽可能接近的文本。

最佳答案

在多部分电子邮件中,email.message.Message.get_payload() 返回一个列表,其中每个部分都有一个项目。最简单的方法是遍历消息并获取每个部分的有效负载:

import email
msg = email.message_from_string(raw_message)
for part in msg.walk():
    # each part is a either non-multipart, or another multipart message
    # that contains further parts... Message is organized like a tree
    if part.get_content_type() == 'text/plain':
        print part.get_payload() # prints the raw text

对于非多部分消息,无需进行所有遍历。无论 content_type 是什么,您都可以直接进入 get_payload()。

msg = email.message_from_string(raw_message)
msg.get_payload()

如果内容被编码,则需要将None作为第一个参数传递给get_payload(),然后是True(解码标志是第二个参数)。例如,假设我的电子邮件包含 MS Word 文档附件:

msg = email.message_from_string(raw_message)
for part in msg.walk():
    if part.get_content_type() == 'application/msword':
        name = part.get_param('name') or 'MyDoc.doc'
        f = open(name, 'wb')
        f.write(part.get_payload(None, True)) # You need None as the first param
                                              # because part.is_multipart() 
                                              # is False
        f.close()

至于获得 HTML 部分的合理纯文本近似值,我发现 html2text效果非常好。

关于python - 如何使用 Python 获取电子邮件文本内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1463074/

相关文章:

python - 在事件循环中共享队列

php - 如何将动态数据传递给sendgrid的电子邮件模板?

javascript - 无法解码 Firefox 媒体资源

java - 无法打开流式文件附件

c# - 什么 MIME 用于读取 .eml 文件?

Python:通过套接字在两台计算机之间发送数据

python - conda 4.9.2 是否报告假包冲突?

php - 跳过 Yii 模型的电子邮件 'Unique' 验证

python - BeautifulSoup - 处理自动关闭标签的正确方法

c# - 在 C# 中测试电子邮件是否从外部系统发送