[英]Python imaplib: can't find a message with .search, but works if I hardcode the search
[英]Python imaplib can't search by from address
我正在嘗試查找與特定發件人地址匹配的郵件。 我已經看了這個答案,但對我來說不起作用。
以下是相關代碼:
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的相關部分,但是我無法弄清楚我到底在做什么錯。 任何幫助將不勝感激。
我設法從管理IMAP服務器的人員那里獲取信息。 這是服務器問題,與代碼無關。
有問題的IMAP服務器是Dovecot的自定義版本。 它實際上索引所有郵箱,以加快搜索等速度。 在這種情況下,我郵箱的索引已損壞。 重新索引解決了該問題。
如文檔中的示例所示, 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
不會為您提供報價,並且該特定錯誤仍處於打開狀態 。
如文檔所述,一種解決方法是將參數“加引號”為列表:
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服務器不支持此功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.