下の例は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メソッドで受信します。
受信したメールはデコードする必要があります。