pythonでimaplibを使ってGmailを取得しようとして対象メールの検索をしてみたのですが、AND検索やOR検索でうまく検索できずに少しハマりましたので備忘録として残しておきます。
事前設定
まずは対象のGmailアカウントで以下を参考にアプリパスワードを取得します。通常のパスワードではログインできません。また、imapを有効にしておく必要があります。
support.google.com
実行コード
今回実行するコードは以下
import imaplib,email,email.Header GMAIL_USER=YOUR_GMAIL_ACCOUNT GMAIL_APP_PASSWORD=YOUR_GMAIL_APP_PASSWORD #取得したアプリパスワード def decode(src): result = '' decodefrag = email.Header.decode_header(src) for frag, enc in decodefrag:↲ if enc: result += unicode(frag, enc) else: result += unicode(frag) return result if __name__ == "__main__": gmail = imaplib.IMAP4_SSL(host=HOST) gmail.login(GMAIL_USER, GMAIL_APP_PASSWORD) gmail.select(LABEL) search_option = 'ここに検索条件をセット' typ, data = gmail.search(None, search_option) for num in data[0].split(): typ, data = gmail.fetch(num, '(RFC822)') msg = email.message_from_string(data[0][1]) subject = decode(msg.get('Subject'))
検索条件
件名で検索
search_option = '(SUBJECT "testmail01")'
AND 検索
件名と日付のFROM-TOでAND検索
search_option = '(SUBJECT "testmail01" SENTSINCE "09-Apr-2016" SENTBEFORE "10-Apr-2016")'
OR 検索
件名とFromでOR検索
search_option = '(OR (SUBJECT "testmail01") (FROM "test@gmail.com"))'
AND・OR 検索
件名でOR検索し日付のFROM-TOでAND検索
search_option = '((OR (SUBJECT "testmail01") (FROM "test@gmail.com")) SENTSINCE "01-May-2016
検索条件についてはRFCを読みましたが、実際の表記形式がよく分からなかったので試行錯誤しました。また、検索方法には括弧を付与する方法と付与しない方法がありましたが、付与しない方法ではうまく検証できませんでした。
注意するポイント
- 外側も括弧がないとエラーになるので括弧で囲ってください。
- スペースの有無も重要。半角1文字分のスペースが必要でした。2文字以上空けるとエラーになるます。
- 検索日付はUTCで(Gmailの場合)
参考
RFC 3501 – INTERNET MESSAGE ACCESS PROTOCOL – VERSION 4rev1