developerAPIIMAPwebhooksemail

APIを介してメールを受信する方法:Webhooks、IMAP、およびポーリング

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

September 22, 2025·7分で読める·Reusable.Email
APIを介してメールを受信する方法:Webhooks、IMAP、およびポーリング

あなたのアプリケーションはメール到着時に反応する必要があります。もしかして自動化されたテストで検証コード解析。もしかして顧客メール支援チケットシステムへルート。もしかってパートナーからインバウンドデータ処理メール経由で通信する。

どのような使用事例のために、「プログラム的に受信メール」は3つのアプローチに煮つめられます:IMAPポーリング、webhooks、おおおよびAPIポーリング。各異なったトレードオフ遅延、複雑性、インフラストラクチャ要件を持ちます。

アプローチ1:IMAPポーリング

IMAPはサーバーからメール読むための標準プロトコル。あなたはIMAPサーバーへ接続、メッセージ検索、おおおよび彼ら取得。すべてのメールクライアント — Thunderbird、Outlook、Apple Mail — フードの下IMAPを使用。

プログラムアクセスのため、あなた同じもの実行コード内:接続、検索、フェッチ、解析。

動作方法

  1. メールサーバーへのIMAP接続を開く
  2. インボックス選択(またはフォルダ特定)
  3. 条件にマッチするメッセージを検索(未読、件名含む X、から Y)
  4. マッチするメッセージ取得
  5. コンテンツを解析(ヘッダ、ボディ、添付)
  6. 間隔で繰り返す

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要求プッシュ新規メッセージ到着時。あなたのアプリケーションはポーリングしない — それはリッスン。

動作方法

  1. WebhookURLはメールプロバイダーに登録する
  2. メール到着時、プロバイダーはHTTP POSTをあなたのURLへ送信
  3. POSTボディはメッセージデータを含む(送信者、件名、ボディ、添付)
  4. あなたのエンドポイントはデータを処理およお200応答を返す
  5. あなたのエンドポイントがダウンの場合、プロバイダーが再試行(バックオフ付き)

アーキテクチャ

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リクエストを作成します。

動作方法

  1. プロバイダーのAPIへのHTTP要求を作成(例:GET /inboxes/{id}/messages
  2. JSON応答を解析
  3. 新規メッセージを処理
  4. 間隔で繰り返す

長所と短所

長所:

  • シンプルな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 →