コンテンツへスキップ
Yuva

Cloudflare 用 Yuva Email Worker

Cloudflare 経由のサポートメール。運用するメールサーバーは不要。

Cloudflare® Email Routing がサポート用アドレス宛てのメールを受信し、オープンソースの Yuva Email Worker が各メッセージに署名して Yuva に渡します。メッセージは共有受信トレイに、チームが返信する会話として届きます。

概要

手前に Email Routing

Cloudflare Email Routing がドメインの MX となり、メールを受信します。Yuva は SMTP を待ち受けないため、インストールや保守が必要なメールサーバーはありません。

オープンソースの小さな Worker

Yuva Email Worker は生のメッセージとエンベロープを読み取り、リクエストに署名して Yuva に POST します。解析、スレッド化、スパム判定はサーバー側で行います。

本物の会話

サポート用アドレス宛てのメールは受信トレイで会話を開始または継続し、チームはチャットやアプリ内メッセージと同じパネルから返信します。

お客様のメッセージがチームに届くまで

  1. 1お客様がサポート用アドレスのいずれか(例: support@example.com)にメールを送ります。
  2. 2Cloudflare Email Routing がメッセージを受信し、Yuva Email Worker に渡します。
  3. 3Worker は、生のメッセージ、2 つのエンベロープアドレス、タイムスタンプに、Yuva と共有するシークレットで HMAC-SHA256 署名を行い、Yuva サーバーの /ingress/email に送信します。
  4. 4Yuva は、メッセージを読む前に署名を確認し、タイムスタンプが 5 分以内であることを確認します。署名が正しくないリクエストは拒否されます。
  5. 5Yuva は宛先アドレスのメールチャネルを見つけ、In-Reply-To と References をもとに、メッセージが属する会話にスレッド化します。それ以外は新しい会話になります。返信があると、会話は再び開きます。
  6. 6チームはパネルで返信します。返信は、Amazon SES、Postmark、自前のリレーなど、メールチャネル独自の SMTP アカウントから、同じアドレス、同じスレッドで送信されます。返信が Worker を通ることはありません。

拒否は送信者に届きます

不明なアドレス、ブロックされた送信者、大きすぎるメッセージなど、Yuva がメッセージを恒久的に拒否する場合、Worker はそれを拒否し、送信者には Yuva の理由が付いた恒久的な SMTP エラーが返ります。

Yuva に到達できない場合

Yuva がサーバーエラーを返した場合、20 秒以内に応答しない場合、または到達できない場合、FALLBACK_FORWARD を設定していれば、Worker はメッセージを指定したアドレスに転送できます。そのアドレスは Email Routing で確認済みの宛先である必要があります。メッセージは通常の転送として届き、Yuva には表示されません。FALLBACK_FORWARD がない場合は配信がエラーで失敗し、送信元サーバーが後で再試行することがあります。

数ステップでセットアップ

Yuva サーバーと、ドメインを管理している Cloudflare アカウントが必要です。

  1. 1

    Yuva で、設定 → 対象の受信トレイ → チャネル → メールを開き、サポート用アドレスを追加します。サーバーにシークレットを設定して再起動します。

    YUVA_INGRESS_SECRET=<openssl rand -hex 32>
    YUVA_INGRESS_AUTHSERV_ID=mx.cloudflare.net
  2. 2

    同じシークレットを使って、Cloudflare アカウントに Worker をデプロイします。

    cd edge
    bun install
    bunx wrangler login
    bunx wrangler secret put INGRESS_SECRET
    bunx wrangler deploy --var YUVA_URL:https://support.example.com
  3. 3

    Cloudflare ダッシュボードで、ドメイン → Email → Email Routing を開いて有効にします。Cloudflare が MX と SPF のレコードを追加します。

  4. 4

    Routing rules で、各サポート用アドレスを Worker の yuva-edge に送ります。キャッチオールのチャネルでは、キャッチオールのルールを yuva-edge に向けます。

  5. 5

    テストメッセージを送信して、パネルに会話が現れるのを確認します。

  6. 6

    任意: デプロイコマンドにフォールバック用アドレスを追加すると、障害中もメールを保持できます。

    bunx wrangler deploy --var YUVA_URL:https://support.example.com --var FALLBACK_FORWARD:you@example.org

Email Routing はドメインの MX になるため、ほかのメールサーバーが扱っていないドメインまたはサブドメインを使ってください。

セットアップガイドを読む →

Cloudflare に縛られません

Worker は /ingress/email を呼び出す方法のひとつです。どのメールサーバーやリレーでも、同じ署名付きヘッダーで生のメッセージを POST できます。コマンドに配信できるメールサーバーなら、メッセージを yuva ingest-email にパイプすることもできます。リクエスト形式は Worker の README に記載されています。

Q&A

メールサーバーを運用する必要はありますか?

受信メール用ではありません。Yuva は SMTP を待ち受けません。メールは Cloudflare Email Routing が受信し、Worker が渡します。返信には、Amazon SES、Postmark、自前のリレーなど、メールチャネル用の SMTP アカウントが必要です。

Yuva が停止しているとどうなりますか?

FALLBACK_FORWARD を設定すると、メッセージは代わりにそのアドレスに転送されます。設定しない場合は配信が失敗し、送信元サーバーが再試行することがあります。不明なアドレス宛てのメールなど、Yuva が意図的に拒否したメッセージは、転送されずに拒否されます。

どのドメインとアドレスを使えますか?

Cloudflare で管理していて、ほかのサーバーがメールを扱っていないドメインならどれでも使えます。Email Routing がそのドメインの MX になるためです。各メールチャネルにはアドレスが 1 つあります。また、どのチャネルにも完全一致しないドメイン内の全アドレス向けに、キャッチオールの *@example.com も使えます。support+billing@example.com のようなサブアドレスは、support@example.com のチャネルに届きます。

メッセージはどのくらいの大きさまで受け付けますか?

メッセージは添付ファイルを含めて最大 25 MiB まで(Cloudflare Email Routing の上限)です。Yuva は 1 通につき最大 50 件の添付ファイルを保持します。それぞれサーバーの添付ファイルサイズ上限(既定は 25 MiB)と許可された種類の範囲内に限られ、それ以外は除外されます。

Yuva サーバー宛てのメールを偽装される心配はありませんか?

Yuva は、有効な HMAC 署名がない、またはタイムスタンプのずれが 5 分を超えるリクエストを、本文を読む前に拒否します。シークレットは外部に漏らさないでください。

Yuva は Cloudflare の DMARC 結果を利用しますか?

はい。YUVA_INGRESS_AUTHSERV_ID に mx.cloudflare.net を設定した場合です。Yuva は Email Routing が付与する DMARC の判定結果を読み取ります。DMARC に失敗した新しい会話は、スパムとしてマークされます。

Cloudflare、Cloudflare のロゴ、Cloudflare Workers は、米国およびその他の法域における Cloudflare, Inc. の商標または登録商標です。Yuva は独立したオープンソースプロジェクトであり、Cloudflare と提携しておらず、Cloudflare の承認も受けていません。