2015/04/12

メールを受信する(IMAP編)

IMAPでのメール受信は以下のように行います。

下の例はGMailの場合ですが、GMailでIMAPを使用する場合には、設定の「メール転送とPOP/IMAP」タブよりIMAPアクセス:「IMAPを有効にする」に変更しておく必要があります。


import email
from imaplib import IMAP4_SSL
from email.header import decode_header

if __name__ == '__main__':
    adr = '<メールアドレス>'
    pwd = '<パスワード>'

    imap_host = 'imap.gmail.com'      # GMailの場合
    imap_port = 993                   # GMailの場合

    try:
        conn = IMAP4_SSL(imap_host, imap_port)
        conn.login(adr, pwd)

        num = conn.select(mailbox='INBOX', readonly=True)    # readonly=False で受信後に既読

        #typ, data = conn.search(None, 'ALL')     # 全メール
        typ, data = conn.search(None, '(UNSEEN HEADER TO %s)' % adr)    # 未読のみ
        ids = data[0].split()

        # Search from backwards
        for mid in ids[::-1]:
            typ, data = conn.fetch(mid, '(RFC822)')
            raw_email = data[0][1]
            msg = email.message_from_bytes(raw_email)

            header = decode_header(msg.get('Subject'))
            msg_subject  = header[0][0]
            msg_encoding = header[0][1] or 'iso-2022-jp'

            if msg.is_multipart() == False: # シングルパート
                byt  = bytearray(msg.get_payload(), msg_encoding)
                body = byt.decode(encoding=msg_encoding)

            else:   # マルチパート
                prt  = msg.get_payload()[0]
                byt  = prt.get_payload(decode=True)
                body = byt.decode(encoding=msg_encoding)

            print('from_address='+ str(msg.get('From')))
            print('to_addresses='+ str(msg.get('To')))
            print('cc_addresses='+ str(msg.get('CC')))
            print('bcc_addresses='+ str(msg.get('BCC')))
            print('date='+ str(msg.get('Date')))
            print('subject='+ str(msg_subject.decode(msg_encoding)))
            print('body='+ body )
            print('---------------------------------')

    except:
        raise

    finally:
        conn.close()
        conn.logout()


IMAP4プロトコルクライアントにIMAP4_SSLを使用します。
処理の流れは以下のようになります。

  1. ログイン (login)
  2. メールボックス選択 (select)
  3. メール検索 (search)
  4. メール取得 (fetch)
  5. 取得したメールのデコード
  6. コンソール出力
  7. 検索結果分4~6を繰り返す

searchメソッドの条件によって、未読や件名で絞り込む事が可能です。
その後、取得したIDのメールをfetchメソッドで受信します。
受信したメールはデコードする必要があります。