Pythonのimapclientでメールを取得・削除する方法

この記事では、Pythonのimapclientライブラリを使い、IMAP(Internet Message Access Protocol)サーバーに接続してメールを検索・取得し、内容を解析、そして不要なメールを削除する基本的な方法を解説します。


目次

1. 準備:ライブラリのインストールとアプリパスワード

imapclientはサードパーティ製のライブラリなので、使用する前にインストールが必要です。

pip install imapclient

また、Gmailなどの現代的なメールサービスでは、セキュリティ上の理由から、プログラムからのアクセスには通常のログインパスワードではなくアプリパスワードの使用が求められます。事前にGoogleアカウントのセキュリティ設定で2段階認証を有効にし、アプリパスワードを生成してください。


2. IMAPサーバーへの接続とログイン

imapclient.IMAPClientオブジェクトを生成し、IMAPサーバー(Gmailの場合はimap.gmail.com)に接続します。SSLによる暗号化接続が一般的です。その後、.login()メソッドでメールアドレスと生成したアプリパスワードを使ってログインします。

import imapclient
import ssl

# SSLコンテキストを作成(より安全な接続のため)
ssl_context = ssl.create_default_context()

# IMAPサーバーに接続
try:
    server = imapclient.IMAPClient('imap.gmail.com', ssl=True, ssl_context=ssl_context)
    # ログイン
    server.login('your_email@gmail.com', 'your_16_character_app_password')
    print("IMAPサーバーに正常にログインしました。")
    # server.logout() # 処理が終わったらログアウト
except Exception as e:
    print(f"エラー: ログインに失敗しました - {e}")


3. メールの検索と取得

ログイン後、.select_folder()で処理対象のメールフォルダ(例: 'INBOX')を選択します。メールを閲覧するだけの場合はreadonly=Trueとします。

.search()メソッドを使うと、特定の条件に一致するメールのUID(ユニークID)をリストとして取得できます。例えば'UNSEEN'(未読)や'FROM user@example.com'(特定の送信者)などの条件が指定できます。

取得したUIDを.fetch()メソッドに渡すことで、メールの本文('BODY[]')などの具体的な内容を取得できます。

# 'INBOX'フォルダを読み取り専用で選択
# server.select_folder('INBOX', readonly=True)

# 未読メールを検索
# uids = server.search(['UNSEEN'])
# print(f"{len(uids)}件の未読メールが見つかりました。")

# if uids:
#     # 最初の未読メールの内容を取得
#     raw_messages = server.fetch(uids[0], ['BODY[]'])

4. メールの内容を解析する

.fetch()で取得したデータは生のバイトデータなので、人間が読める形式に変換(パース)する必要があります。これには、Pythonの標準ライブラリであるemailモジュールを使うのが便利です。

import email
from email.header import decode_header

# raw_messagesはfetch()の戻り値と仮定
# raw_message = raw_messages[uids[0]][b'BODY[]']
# msg = email.message_from_bytes(raw_message)

# # 件名(Subject)を取得
# subject, encoding = decode_header(msg['Subject'])[0]
# if isinstance(subject, bytes):
#     subject = subject.decode(encoding if encoding else 'utf-8')
# print(f"件名: {subject}")

# # 送信者(From)を取得
# print(f"送信者: {msg['From']}")

# # 本文を取得
# if msg.is_multipart():
#     for part in msg.walk():
#         if part.get_content_type() == 'text/plain':
#             body = part.get_payload(decode=True).decode()
#             print(f"本文:\n{body}")
# else:
#     body = msg.get_payload(decode=True).decode()
#     print(f"本文:\n{body}")

メールの件名や本文はエンコードされていることが多いため、decode_header.decode()を使って適切にデコード処理を行う必要があります。


5. メールの削除

メールを削除するには、readonly=Falseでフォルダを選択し直す必要があります。削除は2段階のプロセスで行われます。

  1. .delete_messages()で、指定したUIDのメールに削除フラグを立てる。
  2. .expunge()で、削除フラグが立てられたメールをフォルダから完全に除去する。
# フォルダを書き込み可能モードで選択
# server.select_folder('INBOX', readonly=False)
# 削除したいメールのUIDを指定
# server.delete_messages([uid_to_delete])
# 削除を実行
# server.expunge()

まとめ

imapclientは、IMAPプロトコルを通じてメールサーバーと対話するための高レベルなインターフェースを提供します。サーバーへの接続、ログイン、メールの検索と取得、そして削除といった一連の操作が可能です。取得したメールデータは、標準のemailモジュールを使って件名、送信者、本文などの要素に解析するのが一般的です。これらの機能を組み合わせることで、メールの自動整理や特定情報の抽出といったタスクを自動化できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次