如何在Python中执行IMAP搜索(使用Gmail和imaplib)?
在Gmail中,我有一堆贴有标签的消息。如何在Python中执行IMAP搜索(使用Gmail和imaplib)?
我想使用IMAP客户端来获取这些消息,但我不确定搜索咒语是什么。
c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...])
c.search(???)
我没有找到这种事情的很多例子。根据谷歌的说法,这个网站可能会出现这样的情况:
imaplib
有意为IMAP协议提供了一个简洁的包装,我认为它可以提供更大程度的用户灵活性和适应IMAP规范变化的更大能力。因此,它并没有真正为您的搜索查询提供任何结构,并且需要您熟悉IMAP specification。
正如您将在“6.4.4。SEARCH命令”一节中看到的,您可以为搜索条件指定许多事项。请注意,在搜索任何内容之前,您必须先邮箱SELECT
(IMAP的文件夹名称)。 (根据我的理解,同时搜索多个文件夹需要多个IMAP连接。)IMAP4.list
将帮助您找出邮箱标识符。
在制定你传递给imaplib
的字符串时,也有用的是“9. Formal Syntax”,它来自与上述相关的RFC。
r'(\HasNoChildren) "/"'
是根邮箱/
上的邮箱标志。请参阅“7.2.6。FLAGS响应”。
祝你好运!
我一直很惊讶,imaplib不做很多的响应解析。而且看起来答案很难解析。
FWIW,回答我的问题: c.search(无, 'GM')
(我不知道的 '(\ HasNoChildren) “/”' 部分是关于什么的。)
import imaplib
obj = imaplib.IMAP4_SSL('imap.gmail.com', 993)
obj.login('username', 'password')
obj.select('**label name**') # <-- the label in which u want to search message
obj.search(None, 'FROM', '"LDJ"')
到与Gmail使用imaplib最简单的方法是如在Gmail Imap Extensions page描述使用X-GM-RAW
属性。
的过程会是这样的:
首先连接到该帐户与适当的电子邮件地址和密码:
c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = '[email protected]'
password = 'spamspamspam'
c.login(email, password)
然后连接到文件夹/标签之一:
c.select("INBOX")
如有必要,您可以使用c.list()
列出所有可用的文件夹/标签。
最后,使用的搜索方法:
gmail_search = "has:attachment eggs OR spam"
status, data = c.search(None, 'X-GM-RAW', gmail_search)
在gmail_search
您可以使用gmail advanced search使用相同的搜索语法。
搜索命令将返回命令的状态以及与您的gmail_search匹配的所有消息的ID。
在此之后,你可以通过ID获取每个消息:
for id in data[0].split():
status, data = gmail.fetch(id, '(BODY[TEXT])')
这是不正确的。你不能做conn.select(“some-label-name”)。 – 2011-02-25 23:43:33
@pyrony:是的,你可以。 Gmail **标签**公开为顶级IMAP **邮箱**。我不确定他们为什么决定这么做,而不是将它们作为IMAP关键字公开,但Gmail决定这么做。 – dkarp 2011-03-01 23:33:50