我在找与地址匹配的邮件。我看过这个答案,但它对我不起作用。
以下是相关代码:
import imaplib
conn = imaplib.IMAP4_SSL(IMAPserver)
conn.login(IMAPuserName, IMAPpassword)
retVal, data = conn.select("INBOX")
if retVal != "OK":
<PRINT SOME ERROR MESSAGE>
sys.exit(1)
所有这些都有效。以下是一些不起作用的搜索命令的变体:
retVal, data = conn.search(None, 'UNSEEN HEADER FROM "foo@example.com"')
retVal, data = conn.search(None, 'UNSEEN FROM "foo@example.com"')
retVal, data = conn.search(None, 'FROM "foo@example.com"')
retVal, data = conn.search(None, 'HEADER FROM "foo@example.com"')
所有这些都会导致这样的错误:
imaplib.error: SEARCH command error: BAD ['Error in IMAP command SEARCH:
Unexpected string as search key: FROM "foo@example.com"']
我已经参考了IMAP v4 RFC的相关部分,但我不知道我到底做错了什么。任何帮助都将不胜感激。
发布于 2016-11-28 13:46:12
我设法从管理IMAP服务器的人那里获得了信息。这是一个服务器问题,与代码无关。
所讨论的IMAP服务器是Dovecot的定制版本。它实际上索引所有邮箱,以使搜索等更快。在这种情况下,我邮箱的索引已经损坏。重新编制索引解决了这个问题。
发布于 2016-11-21 17:13:10
如文档处理中的示例所示,IMAP.search()
期望搜索参数为单独的位置参数,而不是单个字符串:
conn.search(None, 'UNSEEN', 'HEADER', 'FROM', 'foo@example.com')
conn.search(None, 'UNSEEN', 'FROM', 'foo@example.com')
conn.search(None, 'FROM', 'foo@example.com')
conn.search(None, 'HEADER', 'FROM', 'foo@example.com')
如果您传递一个参数,imaplib
将把它作为一个引用的参数传递给SEARCH
命令。
但是,您也不能依赖这一点,因为引用只发生在Python2.x imaplib
上。Python3.x imaplib
不为您和那个特定的错误仍然是开放的引用。
有一种方法--正如文档中所述--是将论点作为一个列表“预先引用”:
conn.search(None, '(UNSEEN HEADER FROM foo@example.com)')
conn.search(None, '(UNSEEN FROM foo@example.com)')
conn.search(None, '(FROM foo@example.com)')
conn.search(None, '(HEADER FROM foo@example.com)')
但是,正如@Max所指出的,某些IMAP服务器不支持这一点。
https://stackoverflow.com/questions/40725315
复制相似问题