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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Python中执行IMAP搜索(使用Gmail和imaplib)?相关的知识,希望对你有一定的参考价值。

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

我想使用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的字符串时,也可以使用与上面链接的RFC中的“9. Formal Syntax”。

r'(HasNoChildren) "/"'是根邮箱/上的邮箱标志。参见“7.2.6。标志响应”。

祝好运!

另一答案
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"')
另一答案

据谷歌称,Labels are accessed exactly like IMAP folders

另一答案

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

过程如下:

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

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中使用的相同搜索语法。

search命令将返回命令的状态以及与gmail_search匹配的所有消息的id。

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

for id in data[0].split():
    status, data = gmail.fetch(id, '(BODY[TEXT])')
另一答案

我很惊讶imaplib没有做很多响应解析。并且看起来响应很难解析。

FWIW,回答我自己的问题:c。搜索(无,'GM')

(我不知道'( HasNoChildren)'/''部分是什么。)

以上是关于如何在Python中执行IMAP搜索(使用Gmail和imaplib)?的主要内容,如果未能解决你的问题,请参考以下文章

Python IMAP 从或到指定的电子邮件地址搜索

我无法使用 Python 在 Gmail 中搜索已发送的电子邮件

一次获取多条 IMAP 消息

使用 Python IMAP 阅读 Gmail 邮件

如何使用 Python imaplib 为 IMAP (Gmail) 启用推送通知?

Python:如何通过 IMAP 将带有密件抄送收件人的草稿电子邮件存储到 Exchange Server?