pythonのimaplibでメールのAND/OR検索【cloudpack 大阪 BLOG】

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" SENTBEFORE "03-May-2016")'

検索条件についてはRFCを読みましたが、実際の表記形式がよく分からなかったので試行錯誤しました。また、検索方法には括弧を付与する方法と付与しない方法がありましたが、付与しない方法ではうまく検証できませんでした。

注意するポイント

  • 外側も括弧がないとエラーになるので括弧で囲ってください。
  • スペースの有無も重要。半角1文字分のスペースが必要でした。2文字以上空けるとエラーになるます。
  • 検索日付はUTCで(Gmailの場合)