Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python 3处理电子邮件主题行中的国际字符_Python_Python 3.x_Email Headers - Fatal编程技术网

用Python 3处理电子邮件主题行中的国际字符

用Python 3处理电子邮件主题行中的国际字符,python,python-3.x,email-headers,Python,Python 3.x,Email Headers,我正在写一个脚本来阅读未读邮件的主题行。我的第一次尝试: from imaplib import IMAP4_SSL from email.parser import HeaderParser # username = # password = # server = # port = M = IMAP4_SSL(server, port) M.login(username, password) M.select() typ, data = M.search(None, '(UNSEE

我正在写一个脚本来阅读未读邮件的主题行。我的第一次尝试:

from imaplib import IMAP4_SSL
from email.parser import HeaderParser

# username = 
# password = 
# server = 
# port = 

M = IMAP4_SSL(server, port)
M.login(username, password)
M.select()
typ, data = M.search(None, '(UNSEEN)')

for num in data[0].split():
    rv, data = M.fetch(num, '(BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)])')
    header_data = data[0][1].decode('utf-8')
    parser = HeaderParser()
    msg = parser.parsestr(header_data)
    subject = msg['Subject']
    print(subject)
    print()
这适用于大多数电子邮件,但如果主题行中有非ascii字符,则会失败。输出如下所示:

=?UTF-8?Q?此电子邮件包含\u internati=C3=B2nal\u个字符=

所以看起来HeaderParser不处理编码(在RFC1342中指定)。查看文档,似乎我需要使用
decode\u header
make\u header
。我的第二次尝试:

# same setup code as before

from email.header import decode_header, make_header

for num in data[0].split():
    rv, data = M.fetch(num, '(BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)])')
    headers_encoded = data[0][1].decode('latin-1')
    #print(headers_encoded)
    header_code_pairs = decode_header(headers_encoded)
    #print(header_code_pairs)
    headers = make_header(header_code_pairs)
    parser = HeaderParser()
    msg = parser.parsestr(str(headers))
    subject = msg['Subject']
    print(subject)
    print()
输出如下所示:

此电子邮件只有ASCII码

此电子邮件包含以下国际字符:Tester Testee

出于某种原因,它将From字段连接到第二个字段。但它确实正确地解码了字符!两封电子邮件的标题顺序相同。当我取消注释
headers\u encoded
header\u code\u对
打印时,我得到以下结果:

主题:此电子邮件只有来自:Tester Testee的ASCII码

[('主题:此电子邮件只有ASCII码\r\n发件人:Tester Testee \r\n\r\n',无)]

主题:=?UTF-8?Q?此电子邮件包含\u internati=C3=B2nal\u个字符= 发件人:测试人员受试者

[(b'主题:',无),(b'此电子邮件有internati\xc3\xb2nal 字符“,”utf-8“,(b'来源:测试人员 “,无)]

因此,在我看来,这个问题似乎是由以下事实引起的:在国际示例中,
decode_header
遗漏了字段之间的CRFL。因此,当
make_header
读取它时,它只看到一个字段

我可以通过在解码前分离标题行来解决这个问题,但是我是否遗漏了什么?有更好的办法吗

我的示例中没有解决问题的答案,因此我将其作为我自己的问题发布,因为我的代码使用了
make_header
,这会产生不同的错误。如果希望在不使用真实邮箱的情况下再现错误,则应能够将以下块粘贴到文本编辑器中,并让其加载该块,而不是
数据[0][1]

Subject: =?UTF-8?Q?This_email_has_internati=C3=B2nal_characters?=
From: Tester Testee <ichaelmtest@gmail.com>
Subject:=?UTF-8?Q?此电子邮件有\u internati=C3=B2nal\u个字符=
发件人:测试人员受试者