mcpField
C
cloudflare-email-routing

cloudflare-email-routing

github.com/jackspaceクラウド・DevOps1655 回インストール12 週間前に更新
リポジトリ

cloudflare-email-routing について

Cloudflare Workers開発者向けのEmail Routing実践ガイドです。メールの受信、解析、転送、送信に関する設定とコードパターンを紹介し、デプロイや配信時の問題の予防・調査も扱います。

主な機能

  1. 01Email Workersでメールを受信・処理
  2. 02メール本文と添付ファイルの解析
  3. 03ルールに基づくフィルタリングと転送
  4. 04Workersからメールを送信
  5. 05DNSとメールバインディングの設定

活用シーン

  1. 01受信メールをD1またはKVに保存
  2. 02件名に応じて異なる宛先へ転送
  3. 03サポート依頼への自動返信
  4. 04Workerから通知メールを送信

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jackspace/claudeskillz --skill cloudflare-email-routing

インストール後、Claude Code で/cloudflare-email-routingを入力して読み込まれたか確認します。

同梱ファイルREADME.mdSKILL.json

詳細

Cloudflare Email Routing

Status:本番環境で利用可能 ✅ 最終更新日:2025-10-23 最新バージョン:[email protected], [email protected]


Cloudflare Email Routing とは?

Cloudflare Email Routing では、相互に補完する次の 2 つの機能を利用できます。

  1. Email Workers - カスタムロジック(許可リスト、ブロックリスト、転送、解析、返信)を使って受信メールを受け取り、処理します
  2. Send Email - Workers から確認済みの宛先アドレスへメールを送信します(通知、アラート、確認)

どちらの機能も無料で、連携して Cloudflare Workers のメール機能を完全に利用できます。


クイックスタート(10 分)

パート 1:Email Routing を有効にする(ダッシュボード)

前提条件:ドメインが Cloudflare DNS に登録されていること

  1. Cloudflare Dashboard にログインし、ドメインを選択します
  2. Email > Email Routing に移動します
  3. Enable Email Routing → Add records and enable を選択します
    • これにより、MX レコード、SPF、DKIM が DNS に自動的に追加されます
  4. 宛先アドレスを作成します:
  5. ✅ 基本的なメール転送が有効になりました

ここまでで行ったこと:DNS と基本的な転送を設定しました。それでは、カスタムロジックを追加するために Workers を設定しましょう。


パート 2:Email Workers でメールを受信する
1. 依存関係をインストールする
npm install [email protected] [email protected]

これらのパッケージが必要な理由:

  • postal-mime - 受信メールメッセージ(ヘッダー、本文、添付ファイル)を解析します
  • mimetext - 送信または返信用のメールメッセージを作成します
2. Email Worker を作成する

src/email.ts を作成します:

import { EmailMessage } from 'cloudflare:email';
import PostalMime from 'postal-mime';

export default {
  async email(message, env, ctx) {
    // Parse the incoming message
    const parser = new PostalMime.default();
    const email = await parser.parse(await new Response(message.raw).arrayBuffer());

    console.log('From:', message.from);
    console.log('To:', message.to);
    console.log('Subject:', email.subject);

    // Forward to verified destination
    await message.forward('[email protected]');
  },
};
3. Wrangler を設定する

wrangler.jsonc を更新します:

{
  "name": "email-worker",
  "main": "src/email.ts",
  "compatibility_date": "2025-10-11"
}
4. デプロイしてバインドする
npx wrangler deploy

# In Cloudflare Dashboard:
# Email > Email Routing > Email Workers
# Select your worker → Create route → Enter address (e.g., [email protected])

ここまでで行ったこと:メールをログに記録して転送する Worker を作成しました。


パート 3:Workers からメールを送信する
1. Send Email バインディングを設定する

wrangler.jsonc を更新します:

{
  "name": "my-worker",
  "main": "src/index.ts",
  "compatibility_date": "2025-10-11",
  "send_email": [
    {
      "name": "EMAIL",
      "destination_address": "[email protected]"
    }
  ]
}

重要:destination_address は次の条件を満たす必要があります。

  • Email Routing が有効になっているドメインであること
  • Email Routing の設定で確認済みの宛先アドレスであること
2. Worker からメールを送信する
import { EmailMessage } from 'cloudflare:email';
import { createMimeMessage } from 'mimetext';

export default {
  async fetch(request, env, ctx) {
    // Create email message
    const msg = createMimeMessage();
    msg.setSender({ name: 'My App', addr: '[email protected]' });
    msg.setRecipient('[email protected]');
    msg.setSubject('Welcome to My App');
    msg.addMessage({
      contentType: 'text/plain',
      data: 'Thank you for signing up!',
    });

    // Send via binding
    const message = new EmailMessage(
      '[email protected]',
      '[email protected]',
      msg.asRaw()
    );

    await env.EMAIL.send(message);

    return new Response('Email sent!');
  },
};
3. デプロイする
npx wrangler deploy

ここまでで行ったこと:確認済みのアドレスにメールを送信するよう Worker を設定しました。


Email Workers:完全ガイド

ランタイム API
EmailEvent ハンドラー
export default {
  async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext) {
    // Process email here
  },
};

パラメーター:

  • message - ForwardableEmailMessage オブジェクト
  • env - 環境バインディング(KV、D1、シークレットなど)
  • ctx - 実行コンテキスト(非同期処理用の waitUntil)
ForwardableEmailMessage のプロパティ
interface ForwardableEmailMessage {
  readonly from: string;          // Sender email
  readonly to: string;            // Recipient email
  readonly headers: Headers;      // Email headers
  readonly raw: ReadableStream;   // Raw email message
  readonly rawSize: number;       // Size in bytes

  // Methods
  setReject(reason: string): void;
  forward(rcptTo: string, headers?: Headers): Promise<void>;
  reply(message: EmailMessage): Promise<void>;
}

よくあるパターン

パターン 1:許可リスト

承認済みの送信者からのメールのみを受け付けます:

export default {
  async email(message, env, ctx) {
    const allowList = [
      '[email protected]',
      '[email protected]',
      '[email protected]',
    ];

    if (!allowList.includes(message.from)) {
      message.setReject('Address not on allowlist');
      return;
    }

    await message.forward('[email protected]');
  },
};

使用する場面:お問い合わせフォーム、プライベートなメールアドレス、チームの受信トレイ


パターン 2:ブロックリスト

特定の送信者またはドメインからのメールを拒否します:

export default {
  async email(message, env, ctx) {
    const blockList = [
      '[email protected]',
      '@suspicious-domain.com', // Block entire domain
    ];

    const isBlocked = blockList.some(pattern =>
      message.from.includes(pattern)
    );

    if (isBlocked) {
      message.setReject('Sender blocked');
      return;
    }

    await message.forward('[email protected]');
  },
};

使用する場面:スパムのフィルタリング、嫌がらせをする相手のブロック、ドメイン単位のブロック


パターン 3:解析して保存する

メールの内容を抽出し、D1 または KV に保存します:

import PostalMime from 'postal-mime';

export default {
  async email(message, env, ctx) {
    // Parse email
    const parser = new PostalMime.default();
    const rawEmail = new Response(message.raw);
    const email = await parser.parse(await rawEmail.arrayBuffer());

    // Store in D1
    await env.DB.prepare(
      'INSERT INTO emails (from_addr, subject, text, received_at) VALUES (?, ?, ?, ?)'
    ).bind(
      message.from,
      email.subject,
      email.text,
      new Date().toISOString()
    ).run();

    // Forward to inbox
    await message.forward('[email protected]');
  },
};

使用する場面:メールのアーカイブ、チケットシステム、サポート用受信トレイ、監査ログ


パターン 4:自動返信

カスタムロジックで自動返信を送信します:

import PostalMime from 'postal-mime';
import { createMimeMessage } from 'mimetext';
import { EmailMessage } from 'cloudflare:email';

export default {
  async email(message, env, ctx) {
    // Parse incoming email
    const parser = new PostalMime.default();
    const email = await parser.parse(await new Response(message.raw).arrayBuffer());

    // Create reply
    const msg = createMimeMessage();
    msg.setSender({ name: 'Support Team', addr: '[email protected]' });
    msg.setRecipient(message.from);
    msg.setHeader('In-Reply-To', message.headers.get('Message-ID'));
    msg.setSubject(`Re: ${email.subject}`);
    msg.addMessage({
      contentType: 'text/plain',
      data: `Thank you for your message about "${email.subject}". We'll respond within 24 hours.`,
    });

    // Send reply
    const replyMessage = new EmailMessage(
      '[email protected]',
      message.from,
      msg.asRaw()
    );

    await message.reply(replyMessage);

    // Also forward to team inbox
    await message.forward('[email protected]');
  },
};

使用する場面:不在通知、サポートチケットの受領確認、自動応答


パターン 5:条件付きルーティング

内容に応じてメールを異なる宛先に振り分けます:

import PostalMime from 'postal-mime';

export default {
  async email(message, env, ctx) {
    const parser = new PostalMime.default();
    const email = await parser.parse(await new Response(message.raw).arrayBuffer());

    const subject = email.subject.toLowerCase();

    // Route based on subject keywords
    if (subject.includes('urgent') || subject.includes('critical')) {
      await message.forward('[email protected]');
    } else if (subject.includes('invoice') || subject.includes('payment')) {
      await message.forward('[email protected]');
    } else if (subject.includes('support') || subject.includes('help')) {
      await message.forward('[email protected]');
    } else {
      await message.forward('[email protected]');
    }
  },
};

使用する場面:部門ごとの振り分け、優先度によるフィルタリング、カテゴリ別の受信トレイ


Send Email:完全ガイド

設定
単一の宛先(シンプル)
{
  "send_email": [
    {
      "name": "EMAIL",
      "destination_address": "[email protected]"
    }
  ]
}

動作:env.EMAIL を使って送信されるすべてのメールが、このアドレスに送信されます。

複数の宛先(柔軟)
{
  "send_email": [
    {
      "name": "EMAIL",
      "allowed_destination_addresses": [
        "[email protected]",
        "[email protected]",
        "[email protected]"
      ]
    }
  ]
}

動作:リスト内の任意のアドレスに送信できます。

複数のバインディング(整理)
{
  "send_email": [
    {
      "name": "NOTIFICATIONS",
      "destination_address": "[email protected]"
    },
    {
      "name": "ALERTS",
      "destination_address": "[email protected]"
    }
  ]
}

動作:用途に応じて異なるバインディングを使用します。


メールを送信する
基本的なテキストメール
import { EmailMessage } from 'cloudflare:email';
import { createMimeMessage } from 'mimetext';

const msg = createMimeMessage();
msg.setSender({ name: 'My App', addr: '[email protected]' });
msg.setRecipient('[email protected]');
msg.setSubject('Welcome!');
msg.addMessage({
  contentType: 'text/plain',
  data: 'Welcome to our service!',
});

const email = new EmailMessage(
  '[email protected]',
  '[email protected]',
  msg.asRaw()
);

await env.EMAIL.send(email);
HTML メール
import { EmailMessage } from 'cloudflare:email';
import { createMimeMessage } from 'mimetext';

const msg = createMimeMessage();
msg.setSender({ name: 'My App', addr: '[email protected]' });
msg.setRecipient('[email protected]');
msg.setSubject('Welcome!');

// Add both plain text and HTML versions
msg.addMessage({
  contentType: 'text/plain',
  data: 'Welcome to our service!',
});

msg.addMessage({
  contentType: 'text/html',
  data: '<h1>Welcome!</h1><p>Thanks for joining us.</p>',
});

const email = new EmailMessage(
  '[email protected]',
  '[email protected]',
  msg.asRaw()
);

await env.EMAIL.send(email);
カスタムヘッダー付きメール
import { EmailMessage } from 'cloudflare:email';
import { createMimeMessage } from 'mimetext';

const msg = createMimeMessage();
msg.setSender({ name: 'My App', addr: '[email protected]' });
msg.setRecipient('[email protected]');
msg.setSubject('Password Reset');

// Add custom headers
msg.setHeader('X-Priority', '1');
msg.setHeader('X-Application-ID', 'my-app-123');

msg.addMessage({
  contentType: 'text/plain',
  data: 'Click here to reset your password...',
});

const email = new EmailMessage(
  '[email protected]',
  '[email protected]',
  msg.asRaw()
);

await env.EMAIL.send(email);

DNS の設定

自動セットアップ(推奨)

ダッシュボードでメールルーティングを有効にすると、Cloudflare によって次のレコードが自動的に追加されます。

  1. MX レコード - メールを Cloudflare のサーバーに転送します

    yourdomain.com. 300 IN MX 13 amir.mx.cloudflare.net.
    yourdomain.com. 300 IN MX 86 linda.mx.cloudflare.net.
    yourdomain.com. 300 IN MX 24 isaac.mx.cloudflare.net.
    
  2. SPF レコード - Cloudflare にお客様の代理でメールを送信する権限を付与します

    yourdomain.com. 300 IN TXT "v=spf1 include:_spf.mx.cloudflare.net ~all"
    
  3. DKIM レコード - 送信メールに署名します

    Automatically configured per domain
    
手動セットアップ(上級者向け)

別のプロバイダーから移行する必要がある場合は、次の手順を実行します。

  1. Email > Email Routing > Settings に移動します
  2. Start disabling > Unlock records and continue を選択します
  3. 必要に応じて DNS レコードを編集します
  4. 準備ができたら、Lock DNS records を選択してメールルーティングを保護します

警告:MX レコードを変更すると、メールルーティングが機能しなくなります。プロバイダーを移行する場合にのみ変更してください。


既知の問題の予防

このスキルでは、記録されている8つの問題を防止します。

問題 #1:「この workers では Email Trigger を利用できません」

エラー:メールワーカーのテストが「この workers では Email Trigger を利用できません」というエラーで失敗します

出典:workers-sdk #3751

発生する理由:Wrangler dev はメールトリガーを完全にはサポートしていないため、デプロイ済みの Workers を使ってテストする必要があります

予防策:

  • テストの前に、必ずメールワーカーをデプロイします
  • ライブデバッグには wrangler tail を使用します
  • ダッシュボードの「Test Email Event」機能を使用します(利用できる場合)

問題 #2:宛先アドレスの検証に関するバグ

エラー:検証済みの宛先アドレスが、メールワーカーによる転送では「未検証」と表示されます

出典:コミュニティからの報告(Cloudflare Community)

発生する理由:通常のルーティングルールでも使用されている場合に限り、アドレスが検証済みと表示されるダッシュボードのバグです

予防策:

  • まず、各宛先アドレスの通常の転送ルールを作成します
  • その後、同じアドレスをメールワーカーで使用します
  • ワーカーをデプロイする前にアドレスを検証します

問題 #3:Gmail によるレート制限

エラー:「421: お客様の IP アドレスから送信された迷惑メールの量に異常があることを、システムが検出しました」

出典:コミュニティからの報告

発生する理由:共有インフラストラクチャが原因で、Gmail が Cloudflare の IP 範囲を不審と判断する場合があります

予防策:

  • SPF/DKIM/DMARC レコードを適切に設定します
  • メールルーティングを使って大量のメールを送信しないでください
  • 送信量が多い場合は、トランザクションメールサービス(SendGrid、Mailgun など)を使用します
  • 送信レートを制限します(個人利用では最大50~100通/時間)

問題 #4:MailChannels 使用時の SPF permerror

エラー:MailChannels 経由でルーティングすると、SPF permerror が発生します

出典:コミュニティでの議論

発生する理由:複数のサービスを経由して転送すると、SPF レコードのチェーンが切れる場合があります

予防策:

  • MailChannels の代わりに、メールルーティングのネイティブな送信機能を使用します
  • MailChannels を使用する場合は、SPF の include を正しく設定します
  • MXToolbox SPF checker でテストします

問題 #5:無料プランでのログ記録の制限

エラー:ワーカーログやメール処理の詳細を確認できません

出典:コミュニティからの報告

発生する理由:無料プランでは、ログの保持期間とストリーミングが制限されています

予防策:

  • 開発中はライブログの確認に wrangler tail を使用します
  • メールワーカーで console.log() を積極的に使用します
  • デバッグ用の重要なデータを D1/KV に保存します
  • 可観測性を高めるには、Workers Paid プランにアップグレードします

問題 #6:アクティビティログの不一致

エラー:正常に転送されたメールが、アクティビティログでは「Dropped」と表示されます

出典:コミュニティからの報告

発生する理由:ダッシュボードのバグにより、誤ったステータスが表示されます

予防策:

  • ダッシュボードに頼らず、実際にメールが届くことを確認します
  • wrangler tail を使用して処理を確認します
  • D1/KV を使って独自のログ記録を実装します
  • 実際のメールでテストし、配信を確認します

Issue #7: テストメールイベントの読み込みが終わらない

エラー: ダッシュボードの「Test Email Event」ボタンが読み込み中のままになる

出典: workers-sdk #9195

原因: ダッシュボードのテストインターフェースのバグです(2025-10 時点で未解決)

予防策:

  • ダッシュボードのテスト機能に依存しないでください
  • 代わりに、ローカル開発で curl を使用してください(「ローカル開発」セクションを参照)
  • デプロイして実際のメールでテストしてください
  • wrangler tail を使用して処理を監視してください

Issue #8: Worker の呼び出しに失敗する

エラー: 「Rejected reason: Unknown error: failed to call worker: Worker call failed for 3 times, aborting…」

出典: workers-sdk #9069、コミュニティからの報告

原因: ランタイムエラー、タイムアウト、またはメモリの問題により Worker がクラッシュしています

予防策:

  • try/catch による包括的なエラー処理を追加してください
  • 外部 API 呼び出しにタイムアウトを設定してください
  • 拒否する前にエラーを D1/KV に記録してください
  • 重要度の低い処理には ctx.waitUntil() を使用してください
  • さまざまなメール形式(プレーンテキスト、HTML、添付ファイル)でテストしてください

ローカル開発

メールの受信

Wrangler は HTTP POST を介してメールの受信をシミュレートします:

# Start dev server
npx wrangler dev

# In another terminal, send test email
curl http://localhost:8787 -X POST \
  --data-binary @- << EOF
From: [email protected]
To: [email protected]
Subject: Test Email

This is a test email body.
EOF

動作: Wrangler はメールの処理をログに記録し、転送されるメールの送信先を表示します。

メールの送信

Wrangler は送信メールをローカルの .eml ファイルに書き込みます:

// Your worker code
await env.EMAIL.send(message);

ターミナルの出力:

[wrangler:inf] send_email binding called with the following message:
  /tmp/miniflare-abc123/files/email/message-123.eml

メールの表示:

cat /tmp/miniflare-abc123/files/email/message-123.eml

設定ファイルのリファレンス

完全な wrangler.jsonc(受信と送信の両方)
{
  "$schema": "node_modules/wrangler/config-schema.json",
  "name": "email-worker",
  "main": "src/email.ts",
  "account_id": "YOUR_ACCOUNT_ID",
  "compatibility_date": "2025-10-11",
  "observability": {
    "enabled": true
  },

  // Send email binding
  "send_email": [
    {
      "name": "NOTIFICATIONS",
      "destination_address": "[email protected]"
    },
    {
      "name": "ALERTS",
      "allowed_destination_addresses": [
        "[email protected]",
        "[email protected]"
      ]
    }
  ],

  // Optional: Add other bindings
  "d1_databases": [
    {
      "binding": "DB",
      "database_name": "email-archive",
      "database_id": "YOUR_DATABASE_ID"
    }
  ],

  "kv_namespaces": [
    {
      "binding": "EMAIL_CACHE",
      "id": "YOUR_KV_ID"
    }
  ]
}

TypeScript 型

環境バインディング
interface Env {
  // Send email bindings
  EMAIL: SendEmail;
  NOTIFICATIONS: SendEmail;
  ALERTS: SendEmail;

  // Other bindings
  DB: D1Database;
  EMAIL_CACHE: KVNamespace;
}

interface SendEmail {
  send(message: EmailMessage): Promise<void>;
}
型定義の全体
import { EmailMessage } from 'cloudflare:email';

interface ForwardableEmailMessage {
  readonly from: string;
  readonly to: string;
  readonly headers: Headers;
  readonly raw: ReadableStream;
  readonly rawSize: number;

  setReject(reason: string): void;
  forward(rcptTo: string, headers?: Headers): Promise<void>;
  reply(message: EmailMessage): Promise<void>;
}

declare module 'cloudflare:email' {
  export class EmailMessage {
    constructor(from: string, to: string, raw: string | ReadableStream);
  }
}

完全なセットアップチェックリスト

メールルーティングのセットアップ
  • ドメインが Cloudflare DNS に登録されている
  • ダッシュボードで Email Routing が有効になっている
  • MX、SPF、DKIM レコードが自動的に追加されている
  • 少なくとも 1 つの宛先アドレスが確認済みである
  • カスタムアドレスで基本的な転送をテストする
Email Workers(受信)
  • [email protected] がインストールされている
  • [email protected] がインストールされている
  • async email() ハンドラーを含むメール Worker が作成されている
  • Worker がデプロイされている:npx wrangler deploy
  • ダッシュボードで Worker がメールルートにバインドされている
  • ルートアドレス宛ての実際のメールでテストする
  • wrangler tail でログを確認する
メールの送信
  • send_email バインディングが wrangler.jsonc で設定されている
  • destination_address または allowed_destination_addresses が指定されている
  • Email Routing ですべての宛先アドレスが確認済みである
  • Worker のコードで env.EMAIL.send() を使用している
  • Worker がデプロイされている:npx wrangler deploy
  • Worker エンドポイント経由でメール送信をテストする
  • 受信者にメールが届いたことを確認する

トラブルシューティング

問題:「この workers では Email Trigger を利用できません」

解決策:

  • Worker をデプロイしてください:npx wrangler deploy
  • ローカルシミュレーションではなく、実際のメールでテストしてください
  • wrangler tail を使用して処理を監視してください

問題:「宛先アドレスが確認されていません」

解決策:

  • ダッシュボードの Email Routing > Destination addresses を確認してください
  • 必要に応じて「Resend verification」をクリックしてください
  • 先に通常の転送ルールを作成してください(バグの回避策)
  • Worker をデプロイする前に、すべてのアドレスを確認してください

問題:Gmail が 421 エラーでメールを拒否する

解決策:

  • SPF/DKIM レコードが設定されていることを確認してください(Email Routing で自動設定されます)
  • 送信レートを下げてください(個人利用では最大 50~100 通/時)
  • 迷惑メールや一括メールを送信しないでください
  • 大量送信の場合は、トランザクションメールサービスの利用を検討してください

問題:Email Worker からメールが転送されない

解決策:

  • ダッシュボードで Worker が正しいメールルートにバインドされていることを確認してください
  • 宛先アドレスが確認済みであることを確認してください
  • wrangler tail を使用して処理ログを確認してください
  • Worker のコードにエラーがないか確認してください(forward() の周囲に try/catch を追加)
  • MX レコードが引き続き Cloudflare を指していることを確認してください

問題:ワーカーログを確認できない

解決方法:

  • ライブログには wrangler tail --format pretty を使用します
  • ワーカーに console.log() 文を十分に追加します
  • 後で確認できるよう、デバッグ情報を D1 または KV に保存します
  • ログの保持期間を延長するには、Workers Paid プランにアップグレードします

問題:「failed to call worker」でワーカーがクラッシュする

解決方法:

  • すべての処理に try/catch によるエラーハンドリングを追加します
  • 外部 API 呼び出しにタイムアウトを設定します
  • さまざまなメール形式(プレーンテキスト、HTML、添付ファイル)でテストします
  • ワーカーが CPU/メモリの上限を超えていないことを確認します
  • ブロッキングしない処理には ctx.waitUntil() を使用します

高度なトピック

メール添付ファイルの解析
import PostalMime from 'postal-mime';

export default {
  async email(message, env, ctx) {
    const parser = new PostalMime.default();
    const email = await parser.parse(await new Response(message.raw).arrayBuffer());

    // Access attachments
    if (email.attachments && email.attachments.length > 0) {
      for (const attachment of email.attachments) {
        console.log('Attachment:', attachment.filename);
        console.log('Type:', attachment.mimeType);
        console.log('Size:', attachment.content.length);

        // Store in R2
        await env.BUCKET.put(
          `emails/${Date.now()}-${attachment.filename}`,
          attachment.content
        );
      }
    }

    await message.forward('[email protected]');
  },
};

メールによるタスクの作成
import PostalMime from 'postal-mime';

export default {
  async email(message, env, ctx) {
    const parser = new PostalMime.default();
    const email = await parser.parse(await new Response(message.raw).arrayBuffer());

    // Extract task from email subject
    const taskMatch = email.subject.match(/\[TASK\](.*)/i);

    if (taskMatch) {
      const taskDescription = taskMatch[1].trim();

      // Create task in D1
      await env.DB.prepare(
        'INSERT INTO tasks (description, created_by, created_at) VALUES (?, ?, ?)'
      ).bind(
        taskDescription,
        message.from,
        new Date().toISOString()
      ).run();

      // Send confirmation
      await message.reply(new EmailMessage(
        '[email protected]',
        message.from,
        `Task created: ${taskDescription}`
      ));
    }
  },
};

メールをトリガーとするワークフロー
export default {
  async email(message, env, ctx) {
    // Trigger Cloudflare Workflow based on email
    if (message.from.endsWith('@trusted-domain.com')) {
      await env.WORKFLOW.create({
        params: {
          emailFrom: message.from,
          emailTo: message.to,
          receivedAt: new Date().toISOString(),
        },
      });
    }

    await message.forward('[email protected]');
  },
};

依存関係

必須:

組み込み:

  • cloudflare:email - EmailMessage クラス(インストール不要)

任意:

  • @cloudflare/workers-types - TypeScript の型定義

公式ドキュメント


パッケージのバージョン(2025-10-23 確認済み)

{
  "dependencies": {
    "postal-mime": "^2.5.0",
    "mimetext": "^3.0.27"
  },
  "devDependencies": {
    "@cloudflare/workers-types": "^4.20251014.0",
    "wrangler": "^4.44.0"
  }
}

質問や問題がありますか?

  1. 詳細なトラブルシューティングについては、references/common-errors.md を確認してください
  2. DNS 設定については、references/dns-setup.md を確認してください
  3. テストのパターンについては、references/local-development.md を参照してください
  4. 公式ドキュメントを確認してください:https://developers.cloudflare.com/email-routing/
  5. ライブデバッグには wrangler tail を使用してください
  6. すべての宛先アドレスがダッシュボードで認証済みであることを確認してください

コメント