在 Gmail 中,我有一堆带标签的邮件。
我想使用 IMAP 客户端来获取这些消息,但我不确定搜索咒语是什么。
c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...])
c.search(???)
我没有找到很多这类事情的例子。
imaplib
是有意对 IMAP 协议进行精简包装,我假设允许更大程度的用户灵活性和更大的适应 IMAP 规范变化的能力。因此,它并没有真正为您的搜索查询提供任何结构,并且需要您熟悉IMAP 规范。
正如您将在“6.4.4. SEARCH 命令”一节中看到的,您可以为搜索条件指定许多内容。请注意,您必须先找到SELECT
邮箱(文件夹的 IMAP 名称),然后才能搜索任何内容。(据我了解,同时搜索多个文件夹需要多个 IMAP 连接。)IMAP4.list
将帮助您弄清楚邮箱标识符是什么。
在制定您传递给的字符串时也很有用的imaplib
是上面链接的 RFC 中的“9.正式语法”。
r'(\HasNoChildren) "/"'
是根邮箱上的邮箱标志,/
. 请参阅“7.2.6. FLAGS 响应”。
祝你好运!
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"')
将 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])')
我很惊讶 imaplib 没有做很多响应解析。似乎响应被精心设计为难以解析。
FWIW,回答我自己的问题:c.search(None, 'GM')
(我不知道 '(\HasNoChildren) "/"' 部分是关于什么的。)