如何在Python3中展示展开的电子邮件标头?

时间:2015-12-07 19:48:12

标签: python email python-3.x

注意:这个问题与编码无关,阅读时应该清楚。忽略上面的建议。

我正在学习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的东西,但如果我必须,我可以向外部代表开放。

2 个答案:

答案 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 不存在时使用)之外的所有策略都启用了展开。