Gmail には、ラベル付きのメッセージがたくさんあります。
これらのメッセージを取得するために IMAP クライアントを使用したいのですが、検索の呪文が何であるかわかりません。
c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...])
c.search(???)
この種の例はあまり見つかりません。
imaplib
は意図的に IMAP プロトコルの薄いラッパーであり、ユーザーの柔軟性を高め、IMAP 仕様の変更に適応する能力を高めることを想定しています。その結果、実際には検索クエリの構造が提供されず、IMAP 仕様に精通している必要があります。
「6.4.4. SEARCH コマンド」で説明したように、検索条件にはさまざまな項目を指定できます。SELECT
何かを検索する前に、メールボックス (フォルダーの IMAP 名) を検索する必要があることに注意してください。(私が理解しているように、複数のフォルダーを同時に検索するには、複数の IMAP 接続が必要です。)IMAP4.list
メールボックス識別子が何であるかを理解するのに役立ちます。
imaplib
上記にリンクされている RFC の「9. Formal Syntax」も、渡す文字列を定式化するのに役立ちます。
はr'(\HasNoChildren) "/"'
、ルート メールボックスのメールボックス フラグ/
です。「7.2.6. FLAGS レスポンス」を参照してください。
幸運を!
import imaplib
obj = imaplib.IMAP4_SSL('imap.gmail.com', 993)
obj.login('username', 'password')
obj.select('**label name**') # <-- the label in which u want to search message
obj.search(None, 'FROM', '"LDJ"')
Google によると、ラベルは IMAP フォルダとまったく同じようにアクセスされます。
Gmail で imaplib を使用する最も簡単な方法は、 Gmail の Imap 拡張ページX-GM-RAW
で説明されている属性を使用することです。
プロセスは次のようになります。
最初に、適切な電子メールとパスワードを使用してアカウントに接続します。
c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = 'eggs@spam'
password = 'spamspamspam'
c.login(email, password)
次に、フォルダー/ラベルのいずれかに接続します。
c.select("INBOX")
必要に応じて、使用可能なすべてのフォルダー/ラベルを で一覧表示できますc.list()
。
最後に、検索方法を使用します。
gmail_search = "has:attachment eggs OR spam"
status, data = c.search(None, 'X-GM-RAW', gmail_search)
では、gmail の高度な検索gmail_search
で使用されるものと同じ検索構文を使用できます 。
検索コマンドは、コマンドのステータスと、gmail_search に一致するすべてのメッセージの ID を返します。
この後、次のように ID で各メッセージを取得できます。
for id in data[0].split():
status, data = gmail.fetch(id, '(BODY[TEXT])')
私は、imaplib が多くの応答解析を行っていないことにかなり驚いています。そして、応答は解析しにくいように細工されているようです。
FWIW、私自身の質問に答えるために: c.search(None, 'GM')
('(\HasNoChildren) "/"' の部分が何なのかわかりません。)