我从其他帐户发送了一封主题为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,使用已应用编码的主题搜索电子邮件的正确方法是什么?
由于
答案 0 :(得分:6)
与IMAP服务器通信时,请查看IMAP RFC。
您必须删除多余的引号,并且不得对字符串进行编码。此外,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")