以HTML、imaplib和Django格式获取文本
我正在使用Python/Django中的imaplib获取电子邮件 我的目标是阅读纯文本和HTML电子邮件 我正在使用:以HTML、imaplib和Django格式获取文本,django,imaplib,Django,Imaplib,我正在使用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:",ema
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_块(从web获取)的代码:
现在,问题是,文本看起来没有格式化。明确地:
如果是纯文本电子邮件,则文本将显示为一个大的合并字符串,而不是在行间有分隔符、段落和空行
如果是HTML文本,HTML根本不会显示,而是显示为明文,其中包含HTML片段(甚至使用Django上的|安全过滤器)
我想可能会发生类似将电子邮件有效负载不正确地转换为字符串或类似的情况,但我检查了所有内容,无法找出可能的错误
我做错了什么?问题是您只使用了电子邮件正文的第一个文本块。试试下面的方法,看看是否有效。这不是Django的问题
body = email_message.get_payload()[1].get_payload()
尝试更改索引并测试以查看是否看到html
基于此,您必须修改函数以获取电子邮件的正文
编辑:
我在这里假设您正在查看多部分消息以提取您可以使用下面代码的文本版本。如果您想要电子邮件的html版本,请替换
!='普通的“
by!=”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
用另一种方法解决了这个问题,但考虑到这是唯一的答案,我将奖励所做的努力。谢谢你能分享一下你用了什么方法吗?我将来可能会使用此选项,因此了解以下内容会有所帮助:)
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