我在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上的|安全过滤器)。
我认为可能会发生类似电子邮件有效负载到字符串或类似内容的不正确转换,但我检查了所有内容,但无法找出可能出错的内容。
我做错了什么?
答案 0 :(得分:1)
问题是您只使用电子邮件正文的第一个文本块。请尝试以下操作,看看它是否有效。这不是Django问题。
body = email_message.get_payload()[1].get_payload()
尝试更改索引并测试以查看是否看到了html。
基于此,您必须修改功能以获取电子邮件的正文。
编辑: 我在这里假设您正在查看多部分消息
答案 1 :(得分:0)
要提取文本版本,您可以使用下面的代码。如果您希望电子邮件的html版本juist将!= '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