Python imaplib搜索'NOT'关键字

1 投票
2 回答
1641 浏览
提问于 2025-04-18 04:58

我最近在学习使用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"

就得到了预期的结果。

所以我想这个问题算是“解决”了。

撰写回答