我试图找到与特定FROM地址匹配的邮件。我看过this answer,但它对我不起作用。
以下是相关代码:
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的相关部分,但我无法弄清楚我究竟做错了什么。任何帮助将不胜感激。
答案 0 :(得分:2)
我设法从管理IMAP服务器的人那里获取信息。这是一个服务器问题,与代码没有关系。
有问题的IMAP服务器是Dovecot的自定义版本。实际上indexes所有邮箱都可以更快地进行搜索等。在这种特殊情况下,我邮箱的索引已损坏。重新索引修复了问题。
答案 1 :(得分:1)
如文档中的示例所示,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
命令。
然而,再次,你不能依赖于此,因为只引用Python 2.x imaplib
。 Python 3.x imaplib
不会为您和that particular bug is still open进行引用。
一种解决方法 - 如文档所述 - 是将参数“预引用”为列表:
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服务器不支持此功能。