Guide

IMAP なしでアプリにメール同期を追加する

メール同期を構築すると、多くの場合はメールボックスごとの永続的な IMAP IDLE 接続、OAuth 更新、大規模な再接続処理が必要になります。このガイドでは、それを置き換えるパターンとして、新着メール用の Webhook、バックフィル用のオンデマンド読み取り、そしてターミナルからのプロトタイプ作成を示します。

Written by Caleb Geene Director, Site Reliability Engineering

Reviewed by Qasim Muhammad

VerifiedCLI 3.1.17 · Gmail, Outlook, IMAP · last tested June 9, 2026

IMAP 同期インフラの構築はなぜ難しいのですか?

IMAP 同期が難しいのは、リアルタイム配信のために、各メールボックスごとに永続的な IDLE 接続を開いたままにする必要があるためです。 RFC 2177によると、クライアントは少なくとも 29 分ごとに IDLE を再発行しなければならず、 そうしないとサーバーが接続を切断できます。つまり 10,000 ユーザーなら、10,000 本の長寿命 socket を維持し、再接続し、プロセス間で再配分する必要があります。

その socket 群の上に、アカウントごとの OAuth token 更新、XOAUTH2 認証、provider ごとの癖、ノード再起動時に数千のメールボックスが一斉に再ハンドシェイクする再接続ストームが重なります。 これは 1 通のメッセージを parse する前に数週間分のインフラ作業を意味します — 午前 3 時に呼び出されるのは、作りたかった機能ではなくこの部分です。

IMAP 同期は何で置き換えられますか?

置き換えるのは push-plus-pull モデルです。新着メールが届いたら webhook が小さな通知を届け、 アプリは内容が必要なときだけメッセージをオンデマンドに読み取ります。永続接続はゼロです。 provider が変更を知らせ、あなたは必要なものだけを取得します。これは Gmail と Microsoft Graph の push モデルが内部で使う考え方でもあります。

これによりコストが反転します。何千もの idle socket を温め続ける代わりに、新着メッセージごとの 軽量な webhook と、実際に使う読み取りだけに支払います。1 日 50 通を受け取るメールボックスのコストは 50 通知であり、24 時間保持された接続ではありません。

IMAP なしのメール同期をどうプロトタイプしますか?

このパターン全体は、ターミナルから 2 つのコマンドでプロトタイプできます。 message.created webhook を登録して、新着メッセージごとに endpoint が通知されるようにし、内蔵 receiver を実行して payload の到着を確認します。サーバーフレームワークも socket pool も不要です — アプリが扱う正確な push 形状を確認できます。

# 1. Push new mail to your endpoint
nylas webhook create \
  --url https://your-app.example.com/inbound \
  --triggers message.created \
  --description "email sync"

# 2. Watch payloads locally while you build the handler
nylas webhook server --port 9000

通知が届いたら、メッセージ本文をオンデマンドで取得します。 nylas email read コマンドは webhook の message ID を受け取り、完全な内容を JSON として返します — 必要なときだけ行う、唯一の取得です。

# In your handler: fetch just the message the webhook pointed at
nylas email read "$MESSAGE_ID" --json | jq '{from: .from, subject: .subject}'

既存メールをどうバックフィルしますか?

履歴のバックフィルには、完全同期ではなくオンデマンド検索を使います。 nylas email search コマンドはメールボックスを直接検索し、 --after の日付フィルターでインポート範囲を最近の期間に絞ります。不要な何年分ものメールを取得しません。 多くのアプリでは、オンボーディング時に直近 30–90 日だけで足ります。

# One-time backfill of the last 30 days at user onboarding
nylas email search "*" --after 2026-05-10 --json > backfill.json
jq 'length' backfill.json

それでも IMAP が必要なのはいつですか?

メールボックスにモダン API がない場合は、まだ IMAP が必要です — 自己ホストの Dovecot サーバー、レガシーホスト、IMAP だけを公開する niche provider などです。この場合は購読できる webhook がないため、polling または IDLE client は避けられません。正直なトレードオフは、 push モデルには通知をサポートする provider が必要だということです。

それでも CLI は同じコマンド面で汎用 IMAP アカウントに接続するため、IMAP client を自分で書かずに統一された読み取りモデルを得られます。多くのチームでは、IMAP なしの道で Gmail、Outlook、主要 provider をカバーできます — 実ユーザーの大部分です — そして長尾には polling fallback を残します。

次のステップ