如何在Python中执行IMAP搜索(使用Gmail和imaplib)?

如何在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响应”。

祝你好运!

+1

这是不正确的。你不能做conn.select(“some-label-name”)。 – 2011-02-25 23:43:33

+2

@pyrony:是的,你可以。 Gmail **标签**公开为顶级IMAP **邮箱**。我不确定他们为什么决定这么做,而不是将它们作为IMAP关键字公开,但Gmail决定这么做。 – dkarp 2011-03-01 23:33:50

我一直很惊讶,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])')