繁体   English   中英

如何在Python的imaplib的Gmail IMAP搜索中添加聊天记录?

[英]How do I include chats in a Gmail IMAP search from Python's imaplib?

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

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

但如果我在那个标签上有一些聊天,它们就不会被退回,所以它们对IMAP是不可见的。 我已经阅读了使用Imaplib在Python中访问聊天文件夹 ,虽然这是用于在Chats标签中搜索,而不是在另一个标签中找到聊天,并且它似乎不能使这个案例起作用。

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

Gmail 标签公开为顶级邮箱 ,而不是相反。 要搜索多个邮箱,您需要执行多个查询,从而在相应的邮箱上执行select() ,然后执行search命令(或者在您的情况下使用uid )。

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

您提供的链接: 在Python中访问聊天文件夹使用Imaplib仍然非常相关,因为用户需要允许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版本中存储邮箱名称和标签。 除非你使用普通的us-ascii否则你不能在gmail中使用这样的直接标签。 IMAPClient知道如何使用大多数IMAP服务器使用的修改后的utf7编码进行编码/解码。 一个针对imaplib的错误,因此您可能需要使用imapclient.imap_utf7模块对邮箱名称和/或标签进行编码,直到imaplib开始支持修改后的utf-7编码为止。 我在网上找到的其他东西:虽然你可能能够使用特定的编码成功STORE标签,但是你很难为它们SEARCH (当涉及到xoauth时),除非你使用修改后的utf-7编码或指示字符集。 其他项目已经完成了gmail的大部分工作,例如支持imap-utf7的BaGoMa( 备份谷歌邮件 )。 到目前为止,我已经能够通过UI使用latin-1字符创建标签,并使用utf-8字符集为其创建SEARCH

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

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.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'), ')'])

未记录的界面:

imaplib能够使用文字 ,这在使用不同的编码时特别有用。 这通过在运行命令之前设置IMAP4.literal属性来工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM