APIを介してメールを受信する方法:Webhooks、IMAP、およびポーリング
Webhooks、IMAPポーリング、およびAPIポーリング — 3つのアプローチをコード例とアーキテクチャガイダンスでプログラムメール受け取る。

あなたのアプリケーションはメール到着時に反応する必要があります。もしかして自動化されたテストで検証コード解析。もしかして顧客メール支援チケットシステムへルート。もしかってパートナーからインバウンドデータ処理メール経由で通信する。
どのような使用事例のために、「プログラム的に受信メール」は3つのアプローチに煮つめられます:IMAPポーリング、webhooks、おおおよびAPIポーリング。各異なったトレードオフ遅延、複雑性、インフラストラクチャ要件を持ちます。
アプローチ1:IMAPポーリング
IMAPはサーバーからメール読むための標準プロトコル。あなたはIMAPサーバーへ接続、メッセージ検索、おおおよび彼ら取得。すべてのメールクライアント — Thunderbird、Outlook、Apple Mail — フードの下IMAPを使用。
プログラムアクセスのため、あなた同じもの実行コード内:接続、検索、フェッチ、解析。
動作方法
- メールサーバーへのIMAP接続を開く
- インボックス選択(またはフォルダ特定)
- 条件にマッチするメッセージを検索(未読、件名含む X、から Y)
- マッチするメッセージ取得
- コンテンツを解析(ヘッダ、ボディ、添付)
- 間隔で繰り返す
Python例
import imaplib
import email
import time
from email.header import decode_header
def poll_inbox(host, port, user, password, interval=5):
"""Continuously poll for new emails via IMAP."""
imap = imaplib.IMAP4_SSL(host, port)
imap.login(user, password)
while True:
imap.select("INBOX")
status, messages = imap.search(None, "UNSEEN")
for msg_id in messages[0].split():
status, msg_data = imap.fetch(msg_id, "(RFC822)")
raw = msg_data[0][1]
msg = email.message_from_bytes(raw)
subject = decode_header(msg["Subject"])[0][0]
if isinstance(subject, bytes):
subject = subject.decode()
sender = msg.get("From")
print(f"New email from {sender}: {subject}")
# Process the email here — extract codes, route to app logic, etc.
time.sleep(interval)
# Connect to a Reusable.Email managed inbox
poll_inbox(
host="imap.reusable.email",
port=993,
user="[email protected]",
password="your-password",
interval=10,
)
長所と短所
長所:
- 標準プロトコル — あらゆるメールサーバー、あらゆる言語で動作
- 公開エンドポイント必須なし(コード接続開始)
- すべてのメッセージ、フォルダ、メタデータへのフルアクセス
- すべてのReusable.Email管理インボックスで働く($3ワンタイム)
短所:
- ポーリング遅延追加(秒から分間隔に応じて)
- 永続的接続管理が必要(タイムアウト、再接続)
- 多くのインボックスへのスケーリングは接続プーリング必須
IMAP IDLE:遅延を減らす
ほとんどのIMAPサーバーはIDLEコマンドサポート、開いたままの接続を保持おおおび新規メール到着時にプッシュ通知。これはあなたのポーリング間隔から遅延削減リアルタイムへほぼ。
# Using imapclient for IDLE support
from imapclient import IMAPClient
client = IMAPClient("imap.reusable.email", ssl=True)
client.login("[email protected]", "your-password")
client.select_folder("INBOX")
# Start IDLE mode — server will notify us of new messages
client.idle()
responses = client.idle_check(timeout=300) # Wait up to 5 minutes
client.idle_done()
# Process any new messages indicated by responses
アプローチ2:Webhooks
Webhooksを持つ、メールサーバーはあなたのエンドポイントへのHTTP要求プッシュ新規メッセージ到着時。あなたのアプリケーションはポーリングしない — それはリッスン。
動作方法
- WebhookURLはメールプロバイダーに登録する
- メール到着時、プロバイダーはHTTP POSTをあなたのURLへ送信
- POSTボディはメッセージデータを含む(送信者、件名、ボディ、添付)
- あなたのエンドポイントはデータを処理およお200応答を返す
- あなたのエンドポイントがダウンの場合、プロバイダーが再試行(バックオフ付き)
アーキテクチャ
Email arrives → Reusable.Email → HTTP POST → Your endpoint → Application logic
これはイベント駆動。ポーリングループなし、永続的接続なし、空のインボックスチェック浪費サイクルなし。
考慮事項
あなたは公開エンドポイントが必要。 あなたのWebhook URLはインターネットから到達可能である必要があります。開発では、ngrokのようなツールはローカルサーバーを公開できます。本番では、これはあなたの通常のAPIインフラストラクチャ。
再試行を扱う。 あなたのエンドポイント非200応答を返す場合、プロバイダーが再試行します。あなたの処理ロジックべき冪である必要があります — 同じメール処理が2回問題を起こさない。
セキュリティ。 Webhookリクエストが本当にあなたのメールプロバイダーから来ることを検証。署名チェック、ソースIPを検証、またはWebhookシークレットを使用。
Webhookを使用する場合
Webhooksはアプローチが正しい:
- あなたが必要とするリアルタイム処理(ポーリング遅延なし)
- あなたがビルドされた製品メールがコアインプット(サポートチケット、インバウンドパース)
- あなたが既に実行していたWebサーバーがHTTP要求を受信できる
- あなたはReusable.Emailのwhitelabel層にいて、メールイベントのwebhookをサポート
Whitelabel層($30/月)webhookサポート、REST API、おおおよび無制限管理インボックスを含みます。完全な内訳のため、On-Demand SMTP & IMAP認証情報参照。
アプローチ3:APIポーリング
いくつかのメールプロバイダーはインボックスをチェックするためのREST APIを公開。IMAPを介して接続する代わりに、メッセージはJSONとして返すAPIエンドポイントにHTTP GETリクエストを作成します。
動作方法
- プロバイダーのAPIへのHTTP要求を作成(例:
GET /inboxes/{id}/messages) - JSON応答を解析
- 新規メッセージを処理
- 間隔で繰り返す
長所と短所
長所:
- シンプルなHTTP呼び出し — IMAPライブラリ必須なし
- JSON応答は解析しやすい
- 最新Webフレームワークおおおよびサーバーレス機能で動作しやすい
短所:
- ポーリングがまだ(IMAPポーリングと同じ遅延トレードオフ)
- プロバイダー固有API — ベンダーロックイン
- APIコールはレート制限される
- 標準プロトコルではない
APIポーリングを使用する場合
APIポーリングは軽量統合で動作してもIMAPライブラリ追加重量感じる — サーバーレス機能、シンプルスクリプト、またはプロトタイプ。本番グレード何か、IMAPまたはwebhooksが頑丈。
正しいアプローチを選択
| ファクタ | IMAPポーリング | Webhooks | APIポーリング |
|---|---|---|---|
| 遅延 | 秒(構成可能) | リアルタイム | 秒(構成可能) |
| 公開エンドポイント必須 | いいえ | はい | いいえ |
| 標準プロトコル | はい(IMAP) | いいえ(HTTP、しかし普遍的) | いいえ(プロバイダー固有) |
| あらゆるメールサーバーで動作 | はい | プロバイダー依存 | プロバイダー依存 |
| 複雑性 | 中 | 低(セットアップ後) | 低 |
| 最適 | テスト、バッチ処理 | リアルタイム製品 | シンプルスクリプト |
Reusable.Emailがどう対応するか
すべての管理インボックス($3ワンタイム)IMAP サポート。imap.reusable.email:993へ接続 SSL/TLSで、あらゆるIMAPライブラリを使用、おおおよびプログラムメール読む。これはテスト、CI/CDパイプライン、ポーリング遅延を許容できるアプリケーションのために動作。
Whitelabel層($30/月)webhooksを追加。メールが到着するとあなたのドメイン下のインボックスへ、Reusable.EmailはあなたのエンドポイントへHTTP POSTを送信完全メッセージデータで。これはアプローチは製品がリアルタイムメール処理を必要とします。
どちらのアプローチも同じ基本インボックスを使用。あなたは開発中IMAPポーリングで開始でき、アップグレードおおおよびwebhooks本当にリアルタイム配信が必要な場合。
共通パターン
テストでメール待つ
def wait_for_email(imap, subject_match, timeout=30):
start = time.time()
while time.time() - start < timeout:
imap.select("INBOX")
_, msgs = imap.search(None, "UNSEEN")
for mid in msgs[0].split():
_, data = imap.fetch(mid, "(RFC822)")
msg = email.message_from_bytes(data[0][1])
if subject_match in msg["Subject"]:
return msg
time.sleep(2)
raise TimeoutError(f"No email matching '{subject_match}'")
検証コード抽出
import re
def extract_code(msg):
body = msg.get_payload(decode=True).decode()
match = re.search(r"\b(\d{4,8})\b", body)
return match.group(1) if match else None
ルートメールへのアプリケーションロジック
# Webhook handler (Flask example)
@app.route("/webhook/email", methods=["POST"])
def handle_email():
data = request.json
sender = data["from"]
subject = data["subject"]
body = data["text"]
if "support" in data["to"]:
create_support_ticket(sender, subject, body)
elif "billing" in data["to"]:
process_billing_email(sender, subject, body)
return "", 200
エラーハンドリングおおおよび信頼性
どのアプローチあなたが選択するものであれ、メール受け取り失敗を優美に扱う必要があります。
IMAP接続ドロップ。 ネットワーク中断はあなたのIMAP接続を殺します。あなたのポーリングループを再接続ハンドラーで包む認証を再度して位置から再開。メッセージ上のUNSEENフラグはあなたが既にメール処理し直さないことを確認。
Webhookエンドポイントダウンタイム。 あなたのWebhookエンドポイントが到達不可能な場合、メールプロバイダーが再試行指数バックオフ。あなたのハンドラーをべき等にデザイン — 同じメール処理が2回同じ結果を生成、重複エントリを彼のデータベースでない。
不正なメール。 すべてのメールが完璧にRFC標準に従うわけではありません。あなたの解析コードは欠落ヘッダ、無効エンコーディング、おおおよび予期しないMIME構造をクラッシュなく扱う必要があります。メール解析周囲の試す/除外ブロックを使用おおおよび調査のための失敗をログ。
レート制限。 IMAPサーバーは並行接続またはミニットあたりの操作数を制限できます。高ボリュームシナリオ(多くインボックス、頻繁ポーリング)、接続プーリングを使用おおおよびサーバー制限を尊重。
# Robust IMAP polling with reconnection
def robust_poll(host, port, user, password, callback, interval=10):
while True:
try:
imap = imaplib.IMAP4_SSL(host, port)
imap.login(user, password)
while True:
imap.select("INBOX")
_, msgs = imap.search(None, "UNSEEN")
for mid in msgs[0].split():
try:
_, data = imap.fetch(mid, "(RFC822)")
msg = email.message_from_bytes(data[0][1])
callback(msg)
except Exception as e:
print(f"Error processing message {mid}: {e}")
time.sleep(interval)
except (imaplib.IMAP4.error, ConnectionError, OSError) as e:
print(f"Connection lost: {e}. Reconnecting...")
time.sleep(5)
次は何か
メール開発完全ガイドのため — テスト、ステージング、ユーザーあたりのインボックス、おおおびメール製品構築 — 開発者向けメールAPI参照。テスト環境構築使用事例特定のため、読む破棄可能メールAPIでメールテスト環境を構築する方法。
Try it free
Get a disposable inbox in seconds
No sign-up required. Just visit an address and it's live. Works with any domain on reusable.email.
Open your inbox →

