MoeMail
ブログに戻る

Python でメールを受信する

Python でメールを読む昔ながらの方法は、実在のメールボックスに対して IMAP(imaplib)を使うことです。しかし自動化やテストには重すぎます。HTTP 越しの使い捨て受信トレイ API のほうがはるかに簡単です。開発者のためのメールテストの一部です。Node.js 版もご覧ください。

作成してポーリング(requests)

import os, time, requests

API = "https://moemail.app/api"
H = {"X-API-Key": os.environ["MAIL_KEY"]}

def create_inbox():
    return requests.post(API + "/emails/generate", headers=H).json()

def wait_for_email(inbox_id, timeout=30):
    end = time.time() + timeout
    while time.time() < end:
        msgs = requests.get(API + "/emails/" + inbox_id + "/messages", headers=H).json()["messages"]
        if msgs:
            return msgs[0]
        time.sleep(1.5)
    raise TimeoutError("no email arrived")

pytest でもスクリプトでも使えます。受信トレイを作り、メールを発火させてから wait_for_email を呼び、msg["text"] を読みます。

または webhook を受け取る(Flask)

from flask import Flask, request

app = Flask(__name__)

@app.post("/inbound")
def inbound():
    mail = request.get_json()  # verify the signature first in production
    print("got mail for", mail["to"], "-", mail["subject"])
    return "", 200  # respond fast; non-2xx triggers retries

これは Selenium メールテストと自然に組み合わさり、CI でも同じように動きます。

はじめましょう

OpenAPI ドキュメントを読み、メールボックスを作成して受信を始めましょう。