下の例は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を使用します。
処理の流れは以下のようになります。
- ログイン (login)
- メールボックス選択 (select)
- メール検索 (search)
- メール取得 (fetch)
- 取得したメールのデコード
- コンソール出力
- 検索結果分4~6を繰り返す
searchメソッドの条件によって、未読や件名で絞り込む事が可能です。
その後、取得したIDのメールをfetchメソッドで受信します。
受信したメールはデコードする必要があります。