如何在Python的imaplib中的Gmail IMAP搜索中包含聊天?

如何在Python的imaplib中的Gmail IMAP搜索中包含聊天?,python,gmail-imap,imaplib,Python,Gmail Imap,Imaplib,我很高兴使用imaplib获取特定标签中的消息ID: connection.select("MyLabel") connection.uid('SEARCH', None, 'ALL')) 但如果我在该标签中有一些聊天记录,它们不会被返回,因此它们对IMAP是不可见的。我已经读过了,虽然这是为了在聊天标签中搜索,而不是在另一个标签中查找聊天,但它似乎不能使这个案例起作用 我也许可以在聊天室中再次搜索标有MyLabel的邮件,但这是一个额外的查询,需要我的应用程序用户进行大量设置。Gmail标签

我很高兴使用imaplib获取特定标签中的消息ID:

connection.select("MyLabel")
connection.uid('SEARCH', None, 'ALL'))
但如果我在该标签中有一些聊天记录,它们不会被返回,因此它们对IMAP是不可见的。我已经读过了,虽然这是为了在聊天标签中搜索,而不是在另一个标签中查找聊天,但它似乎不能使这个案例起作用

我也许可以在聊天室中再次搜索标有MyLabel的邮件,但这是一个额外的查询,需要我的应用程序用户进行大量设置。

Gmail标签以顶级邮箱的形式公开,而不是相反。要搜索多个邮箱,您需要执行多个查询,从而对相应的邮箱执行select,然后在您的案例中执行search命令或uid

配置您的gmail帐户以通过IMAP访问聊天: 您提供的链接:仍然非常相关,因为用户需要允许IMAP访问他们的聊天日志。您还可以检查,带有X-GM-RAW和X-GM-LABERS的说明

如果你是在用Gmail做生意,我不确定它是否有效,因为我没有帐户要验证,但是这个链接:可以帮助你查看是否有扩展

修改的utf-7编码: 大多数imap服务器在utf-7的修改版本中存储邮箱名称和标签。你不能像gmail那样直接使用标签,除非你使用的是纯美国ascii码。知道如何使用大多数IMAP服务器使用的修改的utf7编码进行编码/解码。因此,您可能希望使用imapclient.imap_utf7模块对邮箱名称和/或标签进行编码,直到imaplib开始支持修改后的utf-7编码。我在网上发现的另一件事是:虽然您可以使用特定的编码成功地存储标签,但除非您使用的是修改后的utf-7编码或指示字符集,否则您也可以。其他项目已经完成了gmail的大部分工作,例如BaGoMa,它附带了imap-utf7支持。到目前为止,我已经能够通过UI创建一个带有拉丁-1字符的标签,并使用utf-8字符集进行搜索

以下是如何对标签进行编码:

from imapclient import imap_utf7
label = imap_utf7.encode(u'yourlabel')
另见这个问题:

您可以使用以下工具检查标签:

>>>> sock.select("[Gmail]/Chats", True)
>>>> sock.uid('FETCH', '1:*', 'X-GM-LABELS')
这对于检查标签和调试编码问题非常有用

例子: 在我的机器上测试

>>> test()
Password: 
('OK', [('1 (UID 14 BODY[HEADER] {398}', 'MIME-Version: 1.0\r\nReceived: by 10.XXX.XXX.XXX with HTTP; Thu, 11 Jul 2013 09:54:32 -0700 (PDT)\r\nDate: Thu, 11 Jul 2013 09:54:32 -0700\r\nDelivered-To: XXXXXXXX@gmail.com\r\nMessage-ID: <XXXXXXXX@mail.gmail.com>\r\nSubject: test email\r\nFrom: Damien <XXXXXXXX@gmail.com>\r\nTo: Damien <XXXXXXXX@gmail.com>\r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\n'), ')'])
('OK', [('1 (UID 1 BODY[HEADER] {47}', 'From: Damien XXXXXXXX <XXXXXXXX@gmail.com>\r\n\r\n'), ')'])
('OK', [('2 (UID 2 BODY[HEADER] {46}', 'From: Vincent XXXXXXXX <XXXXXXXX@gmail.com>\r\n\r\n'), ')'])

谢谢你的详细回复,虽然这对我不起作用。你确定你可以将聊天与特定的标签匹配,而不是普通的电子邮件?在您的示例中,第二个sock.uid未设置为resp,data,因此这些仍然是正常搜索中的旧变量,因此可以解释误报。如果我在Gmail中搜索label:foo is:chat,我会得到一个匹配项,但是执行select[Gmail]/Chats,然后执行uidSEARCH,X-GM-RAW,label:foo不会返回任何结果。做uidSEARCH,X-GM-RAW,显示了很多,所以我似乎总的来说可以访问聊天室。谢谢你的任何想法!谢谢,但看看你的线袜。uid'SEARCH','X-GM-LABELS',label。这需要是resp,data=sock.uid'SEARCH','X-GM-LABELS',label。目前,您只是在重复使用旧的resp和数据,而不是实际查看带有chat内标签的查询。顺便说一句,我的只是一个普通的ascii标签,但这是一个好主意。:]那么,当第二个收益率实际显示正确的resp和数据变量时,它对您仍然有效吗?如果是这样,我真的很好奇我的设置会有什么不同。谢谢你的帮助!我使用的是OAUTH2,所以我使用的不是sock.login,而是sock.authenticateXOAUTH2,token\u callable。谢谢,我的标签只是一个简单的字母标签,但由于我失去了任何一种方式的赏金,你肯定值得你所有的努力研究,我相信这将是有用的给别人!请添加sock的输出。选择[Gmail]/Chats,True,后跟sock.uid'FETCH',1:',X-GM-LABELS'检查您得到的标签?您还可以尝试sock.debug=4从imaplib获取调试语句。
>>> test()
Password: 
('OK', [('1 (UID 14 BODY[HEADER] {398}', 'MIME-Version: 1.0\r\nReceived: by 10.XXX.XXX.XXX with HTTP; Thu, 11 Jul 2013 09:54:32 -0700 (PDT)\r\nDate: Thu, 11 Jul 2013 09:54:32 -0700\r\nDelivered-To: XXXXXXXX@gmail.com\r\nMessage-ID: <XXXXXXXX@mail.gmail.com>\r\nSubject: test email\r\nFrom: Damien <XXXXXXXX@gmail.com>\r\nTo: Damien <XXXXXXXX@gmail.com>\r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\n'), ')'])
('OK', [('1 (UID 1 BODY[HEADER] {47}', 'From: Damien XXXXXXXX <XXXXXXXX@gmail.com>\r\n\r\n'), ')'])
('OK', [('2 (UID 2 BODY[HEADER] {46}', 'From: Vincent XXXXXXXX <XXXXXXXX@gmail.com>\r\n\r\n'), ')'])
sock.literal = label
resp, data = sock.uid('SEARCH', 'CHARSET', 'UTF-8', 'X-GM-LABELS')