12

在 Gmail 中,我有一堆带标签的邮件。

我想使用 IMAP 客户端来获取这些消息,但我不确定搜索咒语是什么。

c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...])
c.search(???)

我没有找到很多这类事情的例子。

4

5 回答 5

11

imaplib是有意对 IMAP 协议进行精简包装,我假设允许更大程度的用户灵活性和更大的适应 IMAP 规范变化的能力。因此,它并没有真正为您的搜索查询提供任何结构,并且需要您熟悉IMAP 规范

正如您将在“6.4.4. SEARCH 命令”一节中看到的,您可以为搜索条件指定许多内容。请注意,您必须先找到SELECT邮箱(文件夹的 IMAP 名称),然后才能搜索任何内容。(据我了解,同时搜索多个文件夹需要多个 IMAP 连接。)IMAP4.list将帮助您弄清楚邮箱标识符是什么。

在制定您传递给的字符串时也很有用的imaplib是上面链接的 RFC 中的“9.正式语法”。

r'(\HasNoChildren) "/"'是根邮箱上的邮箱标志,/. 请参阅“7.2.6. FLAGS 响应”。

祝你好运!

于 2009-01-07T19:37:42.950 回答
9
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"')
于 2010-06-23T11:45:49.147 回答
5

据谷歌称,标签的访问方式与 IMAP 文件夹完全相同。

于 2008-10-07T16:42:21.920 回答
2

将 imaplib 与 Gmail 一起使用的最简单方法是使用 Gmail Imap扩展页面X-GM-RAW中描述的属性。

该过程将是这样的:

首先使用适当的电子邮件和密码连接到该帐户:

c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = 'eggs@spam'
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 高级搜索gmail_search中使用相同的搜索语法 。

搜索命令将返回命令的状态以及与您的 gmail_search 匹配的所有消息的 ID。

在此之后,您可以通过 id 获取每条消息:

for id in data[0].split():
    status, data = gmail.fetch(id, '(BODY[TEXT])')
于 2016-04-26T20:25:52.173 回答
0

我很惊讶 imaplib 没有做很多响应解析。似乎响应被精心设计为难以解析。

FWIW,回答我自己的问题:c.search(None, 'GM')

(我不知道 '(\HasNoChildren) "/"' 部分是关于什么的。)

于 2008-10-09T00:38:53.877 回答