簡體   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