使用Iso-8859-1编码的主题进行Python IMAP搜索 [英] Python IMAP search using a subject encoded with iso-8859-1

查看:165
本文介绍了使用Iso-8859-1编码的主题进行Python IMAP搜索的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从另一个帐户给自己发送了一封电子邮件,主题为Test de réception en local.现在使用IMAP,我想找到按主题搜索的电子邮件.

From a different account, I sent myself an email with the subject Test de réception en local. Now using IMAP, I want to find that email searching by subject.

在搜索ALL并在输出中找到电子邮件时,我看到:
Subject: =?ISO-8859-1?Q?Test_de_r=E9ception_en_local?=

When doing a search for ALL and finding the email among the output, I see:
Subject: =?ISO-8859-1?Q?Test_de_r=E9ception_en_local?=

现在,我尝试使用imap进行搜索:

So now, searching with imap, I try:

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服务器获得的结果完全相同.但是,在进行这种更具体的搜索时似乎并没有找到匹配的结果.

If you print out subject, you see that the result appears just the same as what I'm getting from the IMAP server on my prior, more-broad search. Yet, it doesn't seem to make a match when doing this more specific search.

对于搜索,我尝试了所有我能想到的:

For the search, I have tried everything I can think of:

typ, data = M.search('iso-8859-1', '(HEADER subject "%s")' % subject)
typ, data = M.search('iso-8859-1', 'ALL (SUBJECT "%s")' % subject)

还有我目前不记得的其他人,都没有运气.

And others that I can't recall at the moment, all without any luck.

我可以搜索(并匹配)主题仅使用ASCII的电子邮件,但不适用于任何应用了编码的主题的电子邮件.所以...

I can search (and match) for emails that have subjects that only use ASCII, but it doesn't work with any subject that has an encoding applied. So...

使用IMAP,使用已应用编码的主题搜索电子邮件的正确方法是什么?

With IMAP, what is the proper way to search for an email using a subject that has an encoding applied?

谢谢

推荐答案

与IMAP服务器通信时,请使用 IMAP RFC .

When talking to IMAP servers, check with IMAP RFC.

您必须删除多余的引号,并且不得对字符串进行编码.另外,字符集指定搜索查询的字符集,而不是消息标题的字符集.这应该工作(对我有用):

You must remove extra quotes, and you must not encode the strings. Also, charset specifies the charset of the search query, not the charset of the message header. This should work (works for me):

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对文字参数的支持非常有限,最好的方法是:

Apparently some servers (at least gmail as of August 2013) support utf-8 strings only when sent as literals. Python imaplib has a very limited literal arguments support, the best one can do is something like:

term = u"réception".encode("utf-8")
M.literal = term
M.search("utf-8", "SUBJECT")

这篇关于使用Iso-8859-1编码的主题进行Python IMAP搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆