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お客様がサポート用アドレスのいずれか(例: support@example.com)にメールを送ります。
- 2Cloudflare Email Routing がメッセージを受信し、Yuva Email Worker に渡します。
- 3Worker は、生のメッセージ、2 つのエンベロープアドレス、タイムスタンプに、Yuva と共有するシークレットで HMAC-SHA256 署名を行い、Yuva サーバーの /ingress/email に送信します。
- 4Yuva は、メッセージを読む前に署名を確認し、タイムスタンプが 5 分以内であることを確認します。署名が正しくないリクエストは拒否されます。
- 5Yuva は宛先アドレスのメールチャネルを見つけ、In-Reply-To と References をもとに、メッセージが属する会話にスレッド化します。それ以外は新しい会話になります。返信があると、会話は再び開きます。
- 6チームはパネルで返信します。返信は、Amazon SES、Postmark、自前のリレーなど、メールチャネル独自の SMTP アカウントから、同じアドレス、同じスレッドで送信されます。返信が Worker を通ることはありません。
拒否は送信者に届きます
不明なアドレス、ブロックされた送信者、大きすぎるメッセージなど、Yuva がメッセージを恒久的に拒否する場合、Worker はそれを拒否し、送信者には Yuva の理由が付いた恒久的な SMTP エラーが返ります。
Yuva に到達できない場合
Yuva がサーバーエラーを返した場合、20 秒以内に応答しない場合、または到達できない場合、FALLBACK_FORWARD を設定していれば、Worker はメッセージを指定したアドレスに転送できます。そのアドレスは Email Routing で確認済みの宛先である必要があります。メッセージは通常の転送として届き、Yuva には表示されません。FALLBACK_FORWARD がない場合は配信がエラーで失敗し、送信元サーバーが後で再試行することがあります。
数ステップでセットアップ
Yuva サーバーと、ドメインを管理している Cloudflare アカウントが必要です。
- 1
Yuva で、設定 → 対象の受信トレイ → チャネル → メールを開き、サポート用アドレスを追加します。サーバーにシークレットを設定して再起動します。
YUVA_INGRESS_SECRET=<openssl rand -hex 32> YUVA_INGRESS_AUTHSERV_ID=mx.cloudflare.net
- 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
Cloudflare ダッシュボードで、ドメイン → Email → Email Routing を開いて有効にします。Cloudflare が MX と SPF のレコードを追加します。
- 4
Routing rules で、各サポート用アドレスを Worker の yuva-edge に送ります。キャッチオールのチャネルでは、キャッチオールのルールを yuva-edge に向けます。
- 5
テストメッセージを送信して、パネルに会話が現れるのを確認します。
- 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 の承認も受けていません。