受信

記事
IT・テクノロジー

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

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら