Python imaplib搜索'NOT'关键字
我最近在学习使用Python的imaplib库来做一个项目,但遇到了一些让我困惑的情况。当我尝试用'NOT FROM'进行搜索时,结果和'FROM'是一样的,感觉'NOT'根本没有起作用。我猜可能是我输入命令的方式不对,但我查了几个例子,发现大家都是这么做的。
import imaplib
mail = imaplib.IMAP4_SSL(host)
mail.login(email, pw)
mail.select(mailbox)
# The following two work as expeceted
# and give different results
mail.uid('search', None, '(NOT NEW)')
mail.uid('search', None, '(NEW)')
# However the following two give the same
mail.uid('search', None, '(FROM gmail)')
mail.uid('search', None, '(NOT FROM gmail)')
我试过各种输入方式,但都没有成功。我还查看了RFC2060,这个imaplib说是基于的标准,还有一些更新的标准。
$ python --version
Python 2.7.5+
有没有人能告诉我我哪里出错了,或者也遇到过这个问题?关于这个特定库的信息似乎很少。
编辑:我进一步调查了一下,发现这个问题似乎是我连接的imap服务器特有的。在尝试通过openssl连接时,
$ openssl s_client -connect imap.mail.yahoo.com:993 -crlf
登录后再试
UID SEARCH FROM "gmail"
UID SEARCH NOT FROM "gmail"
结果还是一样。
不过,当我连接到一个gmail账户时,
$ openssl s_client -connect imap.gmail.com:993 -crlf
再尝试
UID SEARCH FROM "gmail"
UID SEARCH NOT FROM "gmail"
就得到了预期的结果。
看来这个问题算是“解决”了。
2 个回答
0
NOT FROM gmail
在Gmail的imap中运行得很好,但在Yahoo上就不行。
你可以试试:
import imaplib
## connect to imap server
mail = imaplib.IMAP4_SSL('imap.mail.yahoo.com')
mail.login('username','password')
mail.select('inbox')
## search all mails
all_mail = mail.search(None,'ALL')
## search all gmails
all_gmail = mail.search(None,'(FROM "gmail")')
## make them as list of int
all_mail = [x for x in all_mail[1][0].split() if x != ""]
all_gmail = [x for x in all_gmail[1][0].split() if x != ""]
not_gmail = [x for x in all_mail if x not in all_gmail]
#not_gmail = set(all_mail) - set(all_gmail)
## get the output
print "all mail: " + str(all_mail)
print "all gmail: " + str(all_gmail)
print "all not gmail: " + str(not_gmail)
虽然有点慢,但运行得不错。
如果想了解更多规范,可以看看:
https://www.rfc-editor.org/rfc/rfc3501.html
https://datatracker.ietf.org/doc/html/draft-ietf-imapext-regex-00
0
我进一步调查了一下,发现这个问题似乎是我连接的imap服务器特有的。通过openssl尝试连接后,
$ openssl s_client -connect imap.mail.yahoo.com:993 -crlf
我登录并尝试
UID SEARCH FROM "gmail"
UID SEARCH NOT FROM "gmail"
结果还是一样。
不过,当我连接到一个gmail账户时,
$ openssl s_client -connect imap.gmail.com:993 -crlf
并尝试
UID SEARCH FROM "gmail"
UID SEARCH NOT FROM "gmail"
就得到了预期的结果。
所以我想这个问题算是“解决”了。