【问题标题】:Python imaplib can't search by from addressPython imaplib 无法从地址搜索
【发布时间】:2017-04-05 03:38:34
【问题描述】:

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

【问题讨论】:

  • 我认为您的服务器可能有糟糕/未实现的搜索。一些非品牌服务器就是不支持字符串搜索。 (例如,mail.ru 似乎就是其中之一)。您尝试连接到什么服务和/或服务器软件?这些命令在我看来没问题。
  • 谢谢,@Max。这种可能性确实发生在我身上,但有点难以验证。这是一个私人公司电子邮件服务器,我没有太多控制或洞察力。

标签: python python-2.7 imaplib


【解决方案1】:

我设法从管理 IMAP 服务器的人那里获得了信息。这是服务器问题,与代码无关。

有问题的 IMAP 服务器是 Dovecot 的定制版本。它实际上indexes所有邮箱使搜索等更快。在这种特殊情况下,我邮箱的索引已损坏。重新索引解决了这个问题。

【讨论】:

    【解决方案2】:

    如文档中的示例所示,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 服务器不支持此功能。

    【讨论】:

    • 你的第一组命令和他的一样。 imaplib 只是将各种子字符串与空格连接起来。第二组可能会混淆一些不期望 () 在顶层的服务器。
    • @Max 我可以非常肯定地确认至少 Cyrus IMAP 在imap.search(None, 'FROM "localpart@domain"') 上发牢骚,而它很乐意接受imap.search(None, 'FROM', 'localpart@domain')。如果您不传递单个参数,您将把整个字符串作为一个带引号的参数传递给 IMAP 服务器(通过IMAP._quote())。
    • 啊,我用的是 3.0 imaplib(和分叉)
    • 有趣的是,这就是我在我的 OP 中写之前所做的事情: conn.search(None, 'FROM', 'foo@example.com')无论实际的 FROM 标头如何,邮箱中的每条消息。这是@Max 上面建议的服务器端 SEARCH 实现问题吗?
    • 服务器功能列表是否有助于诊断问题? * CAPABILITY IMAP4rev1 Literal+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND 取消选择子命名空间 UIDPLUS 列表扩展 I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT 搜索在上下文=搜索列表状态-使用配额
    猜你喜欢
    • 2016-03-07
    • 2011-10-03
    • 2013-08-05
    • 1970-01-01
    • 2015-08-04
    • 2015-09-25
    • 2016-08-15
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多