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



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

connection.select("MyLabel")
connection.uid('SEARCH', None, 'ALL'))

但是如果我在那个标签中有一些聊天记录,它们不会返回,所以它们对IMAP是不可见的。我已经阅读了使用Imaplib在Python中访问聊天文件夹,尽管这是用于在聊天标签中搜索,而不是在另一个标签中查找聊天,并且它似乎没有使这种情况起作用。

我也许可以在"聊天"中为标记为"MyLabel"的消息执行第二次搜索,但这是一个额外的查询,并且要求我的应用程序的用户进行相当多的设置。

Gmail 标签被暴露为顶层邮箱,而不是相反。要搜索多个邮箱,需要执行多个查询,因此在适当的邮箱上执行select(),然后执行search命令(在您的示例中是uid)。

配置您的gmail帐户通过IMAP访问聊天:

你给的链接:使用Imaplib在Python中访问聊天文件夹仍然是非常相关的,因为用户需要允许IMAP访问他们的聊天日志。您还可以检查Gmail使用的imap扩展,X-GM-RAWX-GM-LABELS的描述。

如果你是使用Gmail商务,我不确定它是否工作(我没有一个帐户验证),但这个链接:https://developers.google.com/gmail/imap_extensions#checking_for_the_presence_of_extensions可以帮助你看看是否扩展存在。

修改后的utf-7编码:

大多数imap服务器在utf-7的修改版本中存储邮箱名称和标签。你不能像gmail那样使用直接的标签,除非你使用纯us-asciiIMAPClient知道如何使用大多数IMAP服务器使用的修改后的utf7编码进行编码/解码。有一个针对imaplib的bug,所以您可能希望使用imapclient.imap_utf7模块来编码邮箱名称和/或标签,直到imaplib开始自己支持修改后的utf-7编码。我在网上发现的另一件事:虽然您可能能够使用特定编码成功地使用STORE标签,但除非您使用修改后的utf-7编码或指示字符集,否则您无法成功地使用SEARCH标签(也涉及xoauth)。其他项目已经为gmail做了大部分工作,例如BaGoMa(备份谷歌邮件),它支持imap-utf7。到目前为止,我已经能够通过使用utf-8字符集的latin-1字符和SEARCH的UI创建标签。

下面是如何编码你的标签:
from imapclient import imap_utf7
label = imap_utf7.encode(u'yourlabel')

参见这个问题:Python的IMAP文件夹路径编码(IMAP UTF-7)

你可以用:

检查你的标签
>>>> sock.select("[Gmail]/Chats", True)
>>>> sock.uid('FETCH', '1:*', 'X-GM-LABELS')

这对于检查您有哪些标签和调试编码问题很有用。

例子:

import imaplib
import getpass
import atexit
from imapclient import imap_utf7
def find_messages(sock, label):
    mailbox = imap_utf7.encode(label)
    label = imap_utf7.encode(label.encode('utf-8'))
    try:
        # process regular mailbox
        sock.select(mailbox)
    except sock.error:
        pass
    else:
        resp, data = sock.uid('SEARCH', None, '(ALL)')
        assert resp == 'OK'
        for uid in data[0].split():
            # because we do select, this uid will be valid.
            yield uid   
    try:
        # now process chats with that label
        sock.select("[Gmail]/Chats", True)
    except sock.error:
        # access to chats via IMAP is disabled most likely
        pass
    else:
        # resp, data = sock.uid('SEARCH', 'X-GM-RAW', 'label:%s' % label)
        sock.literal = label
        resp, data = sock.uid('SEARCH', 'CHARSET', 'UTF-8', 'X-GM-LABELS')
        assert resp == 'OK'
        for uid in data[0].split():
            # because we do select, this uid will be valid.
            yield uid
def test():
    email = "XXXXXXXX@gmail.com"
    label = u"français" # oui oui merci beaucoup.
    sock = imaplib.IMAP4_SSL("imap.gmail.com", 993)
    sock.login(email, getpass.getpass())
    for uid in find_messages(sock, label):
        # e.g.
        print sock.uid('FETCH', uid, '(BODY[HEADER])')
    sock.close()
    sock.logout()

在我的机器上测试!

>>> test()
Password: 
('OK', [('1 (UID 14 BODY[HEADER] {398}', 'MIME-Version: 1.0rnReceived: by 10.XXX.XXX.XXX with HTTP; Thu, 11 Jul 2013 09:54:32 -0700 (PDT)rnDate: Thu, 11 Jul 2013 09:54:32 -0700rnDelivered-To: XXXXXXXX@gmail.comrnMessage-ID: <XXXXXXXX@mail.gmail.com>rnSubject: test emailrnFrom: Damien <XXXXXXXX@gmail.com>rnTo: Damien <XXXXXXXX@gmail.com>rnContent-Type: text/plain; charset=ISO-8859-1rnrn'), ')'])
('OK', [('1 (UID 1 BODY[HEADER] {47}', 'From: Damien XXXXXXXX <XXXXXXXX@gmail.com>rnrn'), ')'])
('OK', [('2 (UID 2 BODY[HEADER] {46}', 'From: Vincent XXXXXXXX <XXXXXXXX@gmail.com>rnrn'), ')'])

无证接口:

imaplib能够使用字面值,这在使用不同的编码时特别有用。这可以通过在运行命令之前设置IMAP4.literal属性来实现。

sock.literal = label
resp, data = sock.uid('SEARCH', 'CHARSET', 'UTF-8', 'X-GM-LABELS')

相关内容

  • 没有找到相关文章

最新更新