Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

メール送信

wrangler dev で送信 Worker をローカルテストし、メール配信をシミュレートします

最終更新 Markdown で表示Agent セットアップ

wrangler dev でメール送信をローカルテストし、配信をシミュレートします。デプロイ前に送信ロジックを確認できます。

前提条件

  1. Cloudflare アカウント に登録します。
  2. Node.js をインストールします。

Node.js のバージョンマネージャー

権限の問題を避け、Node.js のバージョンを切り替えられるよう、Voltanvm などの Node バージョンマネージャーを使います。このガイドの後半で説明する Wrangler には、Node バージョン 16.17.0 以降が必要です。

設定

Wrangler ファイルにメールバインディングを設定します。

{
	"name": "email-sending-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"send_email": [{ "name": "EMAIL" }],
}
name = "email-sending-worker"
# Set this to today's date
compatibility_date = "2026-09-20"

[[send_email]]
name = "EMAIL"

リモートバインディング(推奨)

Email Service をローカルで開発するときは、リモートバインディング の利用を推奨します。デフォルトでは wrangler dev がメールバインディングをローカルでシミュレートします。メールはコンソールに記録されますが、実際には送信されません。リモートバインディングを使うと、Worker はローカルで動き、メールは Email Service 経由で実際に送信されます。

Wrangler 設定のメールバインディングで remote: true を設定します。

{
	"name": "email-sending-worker",
	// Set this to today's date
	"compatibility_date": "2026-09-20",
	"send_email": [
		{
			"name": "EMAIL",
			"remote": true,
		},
	],
}
name = "email-sending-worker"
# Set this to today's date
compatibility_date = "2026-09-20"

[[send_email]]
name = "EMAIL"
remote = true

そのあと、いつもどおり wrangler dev を実行します。env.EMAIL.send() の呼び出しは Email Service 経由で実際のメールを送り、Worker のコードはローカルで実行されます。

ローカルシミュレーション

リモートバインディングなしで wrangler dev を実行すると、メールバインディングはローカルでシミュレートされます。メールは送信されません。代わりに、メール本文がコンソールに記録され、確認用のローカルファイルにも保存されます。

基本的な送信 Worker

export default {
	async fetch(request, env, ctx) {
		if (request.method !== "POST") {
			return new Response("Method not allowed", { status: 405 });
		}

		try {
			const emailData = await request.json();

			console.log("Sending email:", {
				to: emailData.to,
				from: emailData.from,
				subject: emailData.subject,
			});

			const response = await env.EMAIL.send(emailData);

			return new Response(
				JSON.stringify({
					success: true,
					id: response.messageId,
				}),
				{
					headers: { "Content-Type": "application/json" },
				},
			);
		} catch (error) {
			return new Response(
				JSON.stringify({
					success: false,
					error: error.message,
				}),
				{
					status: 500,
					headers: { "Content-Type": "application/json" },
				},
			);
		}
	},
};

ローカルでテストする

開発サーバーを起動します。

npx wrangler dev

テストメールを送信します。

curl -X POST http://localhost:8787/ \
  -H "Content-Type: application/json" \
  -d '{
    "to": "recipient@example.com",
    "from": "sender@yourdomain.com",
    "subject": "Test Email",
    "html": "<h1>Hello from Wrangler!</h1>",
    "text": "Hello from Wrangler!"
  }'

Wrangler は次のような出力を表示します。

[wrangler:info] send_email binding called with MessageBuilder:
From: sender@yourdomain.com
To: recipient@example.com
Subject: Test Email

Text: /tmp/miniflare-.../files/email-text/<message-id>.txt

メール本文(テキストと HTML)はローカルファイルに保存されます。デプロイ前にメールの構成を確認できます。

既知の制限

バイナリ添付

ローカル開発では send_email バインディングをローカルでシミュレートしますが、添付の content にある ArrayBuffer 値は、ローカルシミュレーターではシリアライズできません。画像や PDF の添付などで ArrayBuffer を渡すと、次のようなエラーが出ます。

Cannot serialize value: [object ArrayBuffer]

回避策: ローカル開発では、テキストベースの添付に文字列コンテンツを使います。バイナリ添付(画像、PDF)をテストする場合は、npx wrangler deploy で Worker をデプロイし、デプロイ済みのバージョンに対してテストします。

この制限はローカル開発にだけ影響します。デプロイ済みの Workers では ArrayBuffer コンテンツは正しく動作します。

次のステップ

役に立ちましたか?