使用ISO-8859-1编码的主题进行Python IMAP搜索
我用另一个账号给自己发了一封邮件,主题是 Test de réception en local
。现在我想通过 IMAP 查找这封邮件,方法是根据主题来搜索。
当我进行 ALL
搜索时,在结果中找到了这封邮件,我看到的主题是:
Subject: =?ISO-8859-1?Q?Test_de_r=E9ception_en_local?=
所以现在,我在用 IMAP 搜索时尝试:
M = imaplib.IMAP4_SSL('imap.gmail.com', 993)
M.login('user@gmail.com', 'password')
M.select('[Gmail]/All Mail')
subject = Header(email_model.subject, 'iso-8859-1').encode() #email_model.subject is in unicode, utf-8 encoded
typ, data = M.search('iso-8859-1', '(SUBJECT "%s")' % subject)
for num in data[0].split():
typ, data = M.fetch(num, '(RFC822)')
print 'Message %s\n%s\n' % (num, data[0][1])
M.close()
M.logout()
print 'Fin'
如果你打印出 subject
,你会发现结果和我之前更广泛搜索时从 IMAP 服务器得到的结果一模一样。但是,当我进行更具体的搜索时,它似乎没有匹配上。
为了搜索,我尝试了我能想到的所有方法:
typ, data = M.search('iso-8859-1', '(HEADER subject "%s")' % subject)
typ, data = M.search('iso-8859-1', 'ALL (SUBJECT "%s")' % subject)
还有一些我现在想不起来的方法,但都没有成功。
我可以搜索(并匹配)那些主题只使用 ASCII 字符的邮件,但对于任何有编码的主题就不行了。所以……
在 IMAP 中,使用有编码的主题搜索邮件的正确方法是什么?
谢谢
2 个回答
0
这段代码在2021到2022年期间是有效的。你可以尝试统计其他主题的邮件数量。如果你需要邮件的内容,可以使用mails_list。
import imaplib
import mailbox
user = 'your@email.com'
password = 'secure_password'
imap_url = 'imap.gmail.com'
M = imaplib.IMAP4_SSL(imap_url)
M.login(user, password)
M.select()
term = u"Test results".encode("utf-8")
M.literal = term
typ, data = M.search("utf-8", "SUBJECT")
mails_list = data[0].split() # get all email's in list
print(len(mails_list)) # get mails quantity for search query
# close connection
M.close()
M.logout()
10
在与IMAP服务器交流时,可以参考一下IMAP的标准文档。
你需要去掉多余的引号,而且不要对字符串进行编码。此外,字符集(charset)是用来指定搜索查询的字符集,而不是消息头的字符集。这样做应该是有效的(对我来说是有效的):
M.search("utf-8", "(SUBJECT %s)" % u"réception".encode("utf-8"))
# this also works:
M.search("iso8859-1", "(SUBJECT %s)" % u"réception".encode("iso8859-1"))
补充:
显然,有些服务器(至少是2013年8月的gmail)只支持以字面量形式发送的utf-8字符串。Python的imaplib对字面量参数的支持非常有限,能做到的最好方式大概是这样的:
term = u"réception".encode("utf-8")
M.literal = term
M.search("utf-8", "SUBJECT")