5

我在 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 过滤器)。

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

我究竟做错了什么?

4

2 回答 2

2

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

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

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

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

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

于 2012-11-29T14:55:52.880 回答
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
于 2013-02-26T22:38:09.043 回答