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