在Gmail中,我有一堆标记的邮件。
我想使用IMAP客户端来获取这些消息,但我不确定搜索咒语是什么。
c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...])
c.search(???)
我没有找到很多这方面的例子。
答案 0 :(得分:9)
imaplib
故意是IMAP协议的一个薄包装器,我假设允许更大程度的用户灵活性和更大的适应IMAP规范变化的能力。因此,它不会为您的搜索查询提供任何结构,并且需要您熟悉IMAP specification。
正如您将在“6.4.4.SOPARCH命令”一节中看到的那样,您可以为搜索条件指定许多内容。请注意,您必须先SELECT
一个邮箱(文件夹的IMAP名称),然后才能搜索任何内容。 (根据我的理解,同时搜索多个文件夹需要多个IMAP连接。)IMAP4.list
将帮助您确定邮箱标识符的内容。
在制定传递给imaplib
的字符串时,另外有用的是来自RFC链接到上面的“9. Formal Syntax”。
r'(\HasNoChildren) "/"'
是根邮箱/
上的邮箱标志。参见“7.2.6。标志响应”。
答案 1 :(得分:8)
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"')
答案 2 :(得分:5)
答案 3 :(得分:1)
将imaplib与Gmail配合使用的最简单方法是使用Gmail Imap Extensions page中所述的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_search
中,您可以使用gmail advanced search中使用的相同搜索语法。
搜索命令将返回命令的状态以及与您的gmail_search匹配的所有邮件的ID。
在此之后,您可以通过ID获取每条消息:
for id in data[0].split():
status, data = gmail.fetch(id, '(BODY[TEXT])')
答案 4 :(得分:0)
我很惊讶imaplib没有做很多响应解析。并且似乎反应很难解析。
FWIW,回答我自己的问题: c.search(无,'GM')
(我不知道'(\ HasNoChildren)'/''部分是什么。)