4

从另一个帐户,我给自己发了一封主题为 的电子邮件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,使用已应用编码的主题搜索电子邮件的正确方法是什么?

谢谢

4

2 回答 2

9

与 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")
于 2011-05-11T20:34:42.573 回答
0

此代码在 2021-2022 年有效。尝试计算其他 SUBJECT 的电子邮件。如果您需要电子邮件内容,请使用 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()
于 2021-12-29T12:13:17.913 回答