Cloudflare Worker によるお問い合わせフォームバックエンド。Discord チケット連携 & メール通知。
contact-us は、Cloudflare Worker 上で動作するお問い合わせフォームバックエンドです。
フォーム送信を受け付け、Discord にチケットチャンネルを自動作成し、Resend 経由でメール通知を行います。
Discord の /reply コマンドやメール返信で、ユーザーとの双方向コミュニケーションが可能です。
reply+{channelId}@domain 宛のメールを Discord チャンネルに転送| コンポーネント | 詳細 |
|---|---|
| ランタイム | Cloudflare Workers |
| KV | チケット情報(チャンネル ID ↔ メールアドレス)の保存 |
| 外部サービス | Discord API, Resend API, Cloudflare Turnstile |
| 変数名 | 説明 |
|---|---|
DISCORD_BOT_TOKEN |
Discord Bot トークン |
DISCORD_GUILD_ID |
チケットを作成するサーバー ID |
DISCORD_CATEGORY_ID |
チケットチャンネルを作成するカテゴリ ID |
DISCORD_PUBLIC_KEY |
Discord Interaction 検証用公開鍵 |
RESEND_API_KEY |
Resend API キー |
RESEND_FROM_EMAIL |
送信元メールアドレス |
TURNSTILE_SECRET_KEY |
Cloudflare Turnstile シークレットキー |
ALLOWED_ORIGIN |
CORS 許可オリジン(カンマ区切りで複数指定可) |
REPLY_TO_DOMAIN |
返信用メールアドレスのドメイン(省略時は RESEND_FROM_EMAIL のドメインを使用) |
| メソッド | パス | 説明 |
|---|---|---|
POST |
/ |
フォーム送信を受け付け |
GET |
/ |
ヘルスチェック |
POST |
/discord-interactions |
Discord Interaction Webhook |
[ユーザー]
│ フォーム送信
▼
[Cloudflare Worker] ── Discord チャンネル作成
│ 確認メール送信 (Reply-To: reply+{channelId}@domain)
▼
[ユーザーがメールに返信]
│ reply+{channelId}@domain 宛に届く
▼
[Cloudflare Email Routing] ── Worker の email() ハンドラを呼び出し
│ Discord チャンネルに返信内容を投稿
▼
[Discord スタッフが確認・/reply で返信]
│ 返信メール (Reply-To: reply+{channelId}@domain)
▼
[ユーザー] → またメールに返信できる(スレッド継続)
npm install
bot, applications.commandsManage Channels, Send Messages, Embed Linksnpx wrangler kv namespace create TICKET_KV
npx wrangler kv namespace create TICKET_KV --preview
出力された id と preview_id を wrangler.toml に設定。
reply@yourdomain → Send to Worker のルールを追加npx wrangler secret put DISCORD_BOT_TOKEN
npx wrangler secret put DISCORD_GUILD_ID
npx wrangler secret put DISCORD_CATEGORY_ID
npx wrangler secret put DISCORD_PUBLIC_KEY
npx wrangler secret put RESEND_API_KEY
npx wrangler secret put RESEND_FROM_EMAIL
npx wrangler secret put TURNSTILE_SECRET_KEY
npx wrangler secret put ALLOWED_ORIGIN
npx wrangler deploy
デプロイ後、Worker の URL を Discord Developer Portal の Interactions Endpoint URL に <Worker URL>/discord-interactions として設定。
RESEND_FROM_EMAIL のドメインで Cloudflare Email Routing が有効になっている必要があるnoreply@send.example.com)を使う場合は REPLY_TO_DOMAIN を受信側ドメインに設定する