コンテンツにスキップ

第25章: Email Routing による受信メールのエッジ処理

メールサーバー(Postfix等)を自前運用したり有料のメール受信SaaSを契約することなく、Cloudflare Email Routing と Workers を連携させることで、届いたメールをイベント駆動でエッジ処理できます。


本チュートリアルのゴール

  • wrangler.jsonc でのメールハンドラー(Email Workers)の有効化
  • 受信メールの送信元・件名・本文の抽出
  • Slack/Discordへの通知転送およびR2への添付ファイル自動保存

Step 1: wrangler.jsonc の設定

{
"name": "email-parser-worker",
"main": "src/index.ts",
"compatibility_date": "2024-09-01"
}

Step 2: メールハンドラー(email)の実装

src/index.ts
import { EmailMessage } from 'cloudflare:email';
export default {
// 受信メール処理ハンドラー
async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext) {
const sender = message.from;
const recipient = message.to;
const subject = message.headers.get('subject') || '(件名なし)';
console.log(`[メール受信] From: ${sender}, To: ${recipient}, Subject: ${subject}`);
// メール生データ(MIME/RFC822)の読み取り
const rawEmail = await new Response(message.raw).text();
// 例: 特定の宛先(alert@my-domain.com)ならSlack通知に転送
if (recipient.startsWith('alert@')) {
ctx.waitUntil(
fetch('https://hooks.slack.com/services/xxx/yyy/zzz', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
text: `🚨 受信アラートメール\n差出人: ${sender}\n件名: ${subject}`,
}),
})
);
} else {
// 通常の個人アドレスへそのまま転送
await message.forward('my-personal@gmail.com');
}
}
};

Step 3: Cloudflareダッシュボードでのルーティング設定

  1. Email Routing > Routing rules に移動
  2. カスタムアドレス(例: contact@my-domain.com)の宛先に、デプロイした email-parser-worker を選択
  3. 有効化するだけで、届いたメールが自動的にWorkerで解析されます。

💡 用語解説コラム

[!NOTE] RFC 822 / MIME形式
インターネット上でやり取りされる電子メールの標準データ構造(ヘッダー、本文、添付ファイルなど)。Email Workersはこの生データをエッジでパースできます。