IMAP协议搜索命令的搜索条件

时间:2014-01-26 09:51:59

标签: python email imap

我从这里读到:

http://docs.python.org/2/library/imaplib.html
IMAP4.search(charset, criterion[, ...])

imaplib有搜索方法让我从邮箱中搜索邮件。

但我不明白可用的标准是什么,或者我可以输入任何标准吗?

我搜索了那个页面,但没有得到线索。

2 个答案:

答案 0 :(得分:9)

我不确定Python是如何期望标准的,但我认为它与普通的IMAP相同。请参阅SEARCH command documentation(如已建议的larsks)并根据您要检索的内容使用关键字组合。标准的例子:

SUBJECT Christmas

...检索主题行中包含“圣诞节”的消息。

SUBJECT "New York"

...检索主题行中包含“纽约”(不含引号)的邮件。

OR TO boss SUBJECT resignation

...将被视为(TO boss)或(SUBJECT辞职),并将检索在“收件人”字段中包含“boss”或在主题行中包含“辞职”的邮件。

正如您在上面所看到的,IMAP搜索在其标准中使用了prefix notation,这可能首先令人困惑。您可以使用括号来推理它们,或者以图形方式绘制标准树 - 在嵌套ANDOR时特别有用。

您可以使用相当多的不同标准。有关整个列表,请参阅RFC。

在花时间编码之前,手动(例如使用telnet)与IMAP交互以习惯SEARCH请求的结构可能会有所帮助。

答案 1 :(得分:0)

您可以使用imap_tools软件包: https://pypi.org/project/imap-tools/

实现了rfc3501中描述的搜索逻辑。

from imap_tools import Q, AND, OR, NOT
# base
mailbox.fetch('TEXT "hello"')  # str
mailbox.fetch(b'TEXT "\xd1\x8f"')  # bytes
mailbox.fetch(Q(subject='weather'))  # query, the str-like object
# AND
Q(text='hello', new=True)  # 'TEXT "hello" NEW'
# OR
OR(text='hello', date=datetime.date(2000, 3, 15))  # '(OR TEXT "hello" ON 15-Mar-2000)'
# NOT
NOT(text='hello', new=True)  # '(NOT TEXT "hello" NEW)'
# complex:
# 'TO "to@ya.ru" (OR FROM "from@ya.ru" TEXT "\\"the text\\"") (NOT (OR UNANSWERED NEW))')
Q(OR(from_='from@ya.ru', text='"the text"'), NOT(OR(Q(answered=False), Q(new=True))), to='to@ya.ru')
# encoding
mailbox.fetch(Q(subject='привет'), charset='utf8')  # 'привет' will be encoded by MailBox._criteria_encoder

有关详细信息,请参阅文档。