获取 HTML、imaplib 和 Django 格式的文本

Posted

技术标签:

【中文标题】获取 HTML、imaplib 和 Django 格式的文本【英文标题】:Obtain text as HTML, imaplib and Django 【发布时间】:2012-10-23 11:18:39 【问题描述】:

我在 Python/Django 中使用 imaplib 获取电子邮件。

我的目标是阅读纯文本和 html 电子邮件。

我正在使用:

mail.select('inbox', readonly=True)
result, data = mail.uid('fetch', email_uid, '(RFC822)')

raw_email = data[0][1]
email_message = email.message_from_string(raw_email)

#print "EMAIL:",email_message
#print "HEADERS",email_message.items()

subject = get_decoded_header(email_message['Subject'])
from_address = get_decoded_header(email_message['From'])

date = email_message['Date']
date = parse_date(date)

body = ''+get_first_text_block(email_message)

以及get_first_text_block的代码(来自网络):

def get_first_text_block(email_message_instance):
    maintype = email_message_instance.get_content_maintype()

    if maintype == 'multipart':
        for part in email_message_instance.get_payload():
            if part.get_content_maintype() == 'text':
                return part.get_payload()
    elif maintype == 'text':
        return email_message_instance.get_payload()

    # In cases of emails with empty body
    return ''

现在,问题在于,文本没有格式化。具体来说: 如果是纯文本电子邮件,则文本显示为一个大的合并字符串,而不是在行间有断点、段落和空行。

如果它是 HTML 文本,则根本不会显示 HTML,而是显示为带有 HTML 片段的纯文本(即使在 Django 上使用 |safe 过滤器)。

我想可能会发生诸如将电子邮件有效负载不正确地转换为字符串或类似的事情,但我检查了所有内容,但找不到可能出现的问题。

我做错了什么?

【问题讨论】:

【参考方案1】:

要提取文本版本,您可以使用下面的代码。如果您想要电子邮件 juist 的 html 版本,请将 != 'plain' 替换为 != 'html'

import email
resp, data = M.FETCH(1, '(RFC822)')
mail = email.message_from_string(data[0][1])

for part in mail.walk():
 print 'Content-Type:',part.get_content_type()
 print 'Main Content:',part.get_content_maintype()
 print 'Sub Content:',part.get_content_subtype()

for part in mail.walk():

  if part.get_content_maintype() == 'multipart':
    continue

  if part.get_content_subtype() != 'plain':
    continue

  payload = part.get_payload()
  print payload

【讨论】:

【参考方案2】:

问题是您只使用了电子邮件正文的第一个文本块。请尝试以下方法,看看它是否有效。这不是 Django 的问题。

body = email_message.get_payload()[1].get_payload()

尝试更改索引并测试您是否看到 html。

基于此,您必须修改函数以获取电子邮件的正文。

编辑: 我在这里假设您正在查看多部分消息

【讨论】:

用另一种方法解决了这个问题,但考虑到这是唯一的答案,我将奖励所付出的努力。谢谢 您能分享一下您使用的方法吗?我将来可能会使用它,所以知道会有所帮助:)

以上是关于获取 HTML、imaplib 和 Django 格式的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中执行IMAP搜索(使用Gmail和imaplib)?

只获取新的电子邮件 imaplib 和 python

使用 imaplib 和 oauth 连接 Gmail

使用 imaplib 和 oauth 连接 Gmail

Python/imaplib - 如何获取消息的标签?

python imaplib 获取 gmail 收件箱主题标题和发件人姓名