3

私は喜んで imaplib を使用して、特定のラベルのメッセージ ID を取得しています。

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

しかし、そのラベルにいくつかのチャットがある場合、それらは返されないため、IMAP には表示されません。Accessing Chat Folder in Python Using Imaplib を読みましたが、これは Chats ラベルで検索するためのものであり、別のラベルでチャットを見つけるためのものではなく、このケースを機能させるようには見えません。

「チャット」で「MyLabel」というラベルの付いたメッセージをもう一度検索することもできますが、これは余分なクエリであり、アプリケーションのユーザーにかなりの設定を求めています。

4

1 に答える 1

2

Gmailのラベルはトップレベルのメールボックスとして公開されますが、その逆ではありません。複数のメールボックスを検索するには、複数のクエリを実行する必要があるためselect()、適切なメールボックスで実行してからsearchコマンドを実行します (またはuidあなたの場合)。

Chats over IMAP にアクセスするための Gmail アカウントの設定:

あなたが提供したリンク: Accessing Chat Folder in Python Using Imaplibは、ユーザーがチャット ログへの IMAP アクセスを許可する必要があるため、依然として非常に関連性があります。また、Gmail で使用される imap 拡張機能X-GM-RAWを、およびの説明とともに確認することもできますX-GM-LABELS

ビジネスで Gmail を使用している場合、動作するかどうかはわかりませんが (確認するアカウントがありません)、次のリンク参照してください。拡張子が存在する場合。

変更された utf-7 エンコーディング:

ほとんどの imap サーバーは、メールボックスの名前とラベルを の修正版に保存しますutf-7。プレーンを使用していない限り、gmail にそのようなストレート ラベルを使用することはできませんus-asciiIMAPClientほとんどの IMAP サーバーで使用される変更された utf7 エンコーディングを使用してエンコード/デコードする方法を知っています。imaplib に対して未解決のバグがあるため、imapclient.imap_utf7モジュールを使用してメールボックス名やラベルをエンコードすることをお勧めします。imaplib変更されたutf-7エンコーディングが独自にサポートされるようになるまでは。STORE私がオンラインで見つけた他のこと:特定のエンコーディングで正常にラベル付けできるかもしれませんが、変更されたものを使用していない限り、(xoauthが関係している場合も)ラベル付けに失敗しますSEARCHutf-7文字セットをエンコードまたは示す。imap-utf7 をサポートして出荷されるBaGoMa ( backup google mail ) など、他のプロジェクトではすでに gmail のほとんどの作業が行われています。これまでのところ、文字を使用して UI を介してラベルを作成し、文字セットを使用してラベルを作成することができlatin-1ましSEARCHutf-8

ラベルをエンコードする方法は次のとおりです。

from imapclient import imap_utf7
label = imap_utf7.encode(u'yourlabel')

この質問も参照してください: IMAP folder path encoding (IMAP UTF-7) for Python

次の方法でラベルを検査できます。

>>>> 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')
于 2013-07-09T08:43:07.623 に答える