(注意:这个问题与编码无关,阅读时应该清楚。忽略上面的建议。)
我正在学习Python并想出一个很好的工具,可以通过MIME获取一些电子邮件并显示给定的标题。以下基本上是我的脚本:
#!/usr/bin/env python3
from imaplib import IMAP4_SSL
from netrc import netrc
from email import message_from_bytes
conn = IMAP4_SSL('imap.gmail.com')
auth = netrc().hosts['imap.gmail.com']
conn.login(auth[0], auth[2])
conn.select()
typ, data = conn.search(None, 'ALL')
i = 0
for num in reversed(data[0].split()):
i += 1
typ, data = conn.fetch(num, '(RFC822)')
email = message_from_bytes(data[0][1])
print("%i: %s" % (int(num), email.get('subject')))
if i == 5:
break
conn.close()
conn.logout()
令人沮丧的是头部折回;从而显示出来 基础电子邮件字符串,而不是标题内的实际值。
如何获取正确展开的标头值?我喜欢 坚持核心python3的东西,但如果我必须,我可以向外部代表开放。
答案 0 :(得分:0)
TL; DR:剥离换行符
如果有一个简单的答案,我会喜欢它,所以如果你有一个更好的人可以随意添加它。与此同时,这种贫民窟解决方案非常有效:
#!/usr/bin/env python3
from imaplib import IMAP4_SSL
from netrc import netrc
from email import message_from_bytes
import re
conn = IMAP4_SSL('imap.gmail.com')
auth = netrc().hosts['imap.gmail.com']
conn.login(auth[0], auth[2])
conn.select()
typ, data = conn.search(None, 'ALL')
i = 0
for num in reversed(data[0].split()):
i += 1
typ, data = conn.fetch(num, '(RFC822)')
email = message_from_bytes(data[0][1])
raw_header = email.get('subject')
header = re.sub('[\r\n]', '', header)
print("%i: %s" % (int(num), header))
if i == 5:
break
conn.close()
conn.logout()
答案 1 :(得分:0)
使用 Policy Objects 在 Python 电子邮件包中启用展开。在您的脚本中,您必须添加:
from email.policy import SMTPUTF8
导入策略 SMTPUTF8,然后在调用 message_from_bytes 时使用它:
email = message_from_bytes(data[0][1], policy=SMTPUTF8)
我用 Python 3.9.5 尝试了你的脚本,实际上除了 compat32(当参数 policy 不存在时使用)之外的所有策略都启用了展开。