Python imaplib无法从地址搜索

时间:2016-11-21 16:51:01

标签: python python-2.7 imaplib

我试图找到与特定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的相关部分,但我无法弄清楚我究竟做错了什么。任何帮助将不胜感激。

2 个答案:

答案 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服务器不支持此功能。