Import
import email
from email.header import decode_header
from email.parser import BytesParser
from email.utils import parseaddr
import imaplib
from imapclient import IMAPClient
設定
サイズ制限を適切にする
imaplib._MAXLINE = 10000000
接続
TLS
with IMAPClient(IMAPサーバー, ssl=True) as client:
切断
with文を抜けると自動で切断される
client.logout()
ログイン
client.login(メールアドレス, パスワード)
フォルダの選択
受信トレイ
client.select_folder('INBOX')
読み取り専用
client.select_folder('INBOX', readonly=True)
フォルダ指定
client.select_folder('フォルダ')
フォルダ名のリストを取得
folders = client.list_folders()
サーバーごとにフォルダ名が異なるので調べるのが確実
メールIDの取得
uid_list = client.search(検索キー)
uid_list = client.search([検索キー1, ...])
検索キー
すべて
デフォルトなので省略できる
'ALL'
キーワード
'TEXT', 'キーワード'
本文
'BODY', 'キーワード'
件名
'SUBJECT', 'キーワード'
最新のメール
uid_list = client.search(['ALL'])
最新のメールID = max(uids) if uids else None
未読メール
'UNSEEN'
日付でフィルタ
指定した日付
'ON', 'dd-月-yyyy'
以降
'SINCE', 'dd-月-yyyy'
[日付, )
前
'BERORE', 'dd-月-yyyy'
( , 日付)
月
3文字のアルファベット
先頭は大文字
FROM
'FROM', 'メールアドレス'
メールの取得
raw_messages = client.fetch(メールIDのリスト, ['BODY[]'])
raw_email = raw_messages[メールID][b'BODY[]']
メール = BytesParser().parsebytes(raw_email)
b'BODY[]'とは
b'BODY[]' = 'BODY[]'.encode('ascii') = bytes('BODY[]', 'ascii')
ヘッダーのみ
raw_messages = client.fetch(メールIDのリスト, ['BODY[HEADER]'])
raw_email = raw_messages[メールID][b'BODY[HEADER]']
値
件名
subject, encoding = decode_header(メール["Subject"])[0]
if isinstance(subject, bytes):
subject = subject.decode(encoding if encoding else "utf-8")
本文
text_contents = []
html_contents = []
for part in メール.walk():
# 添付ファイルをスキップ
content_disposition = part.get("Content-Disposition")
if content_disposition == "attachment":
continue
content_type = part.get_content_type()
content_encoding = part.get_content_charset() or "utf-8"
if content_type == "text/plain":
text_contents.append(part.get_payload(decode=True).decode(content_encoding, errors="replace"))
elif content_type == "text/html":
html_contents.append(part.get_payload(decode=True).decode(content_encoding, errors="replace"))
テキスト = "\n".join(text_contents)
HTML = "\n".join(html_contents)
From
ユーザ名, from_address = parseaddr(メール["From"])
_, from_address = parseaddr(メール["From"])
To
ユーザ名, to_address = parseaddr(メール["To"])
_, to_address = parseaddr(メール["To"])
cc
メール["Cc"]
bcc
メール["Bcc"]
チェック
メールがない
if not uid_list:
本文にテキストがあるか
if text_contents:
本文にHTMLがあるか
if html_contents:
Install
pip install imapclient