跳转到内容
搜索文档

邮件发送

使用 wrangler dev 在本地测试 Email Service 发送 Worker,并模拟邮件投递。

最后更新 查看 MarkdownAgent 设置

使用 wrangler dev 在本地测试邮件发送功能,以模拟邮件投递,并在部署前验证发送逻辑。

前提条件

  1. 注册 Cloudflare 账户 ↗。
  2. 安装 Node.js ↗。

Node.js 版本管理器

使用 Volta ↗ 或 nvm ↗ 等 Node 版本管理器,以避免权限问题并切换 Node.js 版本。本指南后续将介绍的 Wrangler 需要 Node 版本 16.17.0 或更高。

配置

在 Wrangler 文件中配置 email 绑定:

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

[[send_email]]
name = "EMAIL"

远程绑定(推荐)

使用远程绑定是在本地开发 Email Service 的推荐方式。默认情况下,wrangler dev 会在本地模拟 email 绑定——邮件会记录到控制台,但不会真正发送。使用远程绑定时,Worker 在本地运行,但会通过 Email Service 发送真实邮件。

在 Wrangler 配置中为 email 绑定设置 remote: true:

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

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

然后照常运行 wrangler dev。对 env.EMAIL.send() 的调用会通过 Email Service 发送真实邮件,而 Worker 代码仍在本地运行。

本地模拟

在不使用远程绑定的情况下运行 wrangler dev 时,email 绑定会在本地模拟。邮件不会真正发送——邮件内容会记录到控制台,并保存到本地文件供检查。

基础发送 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": "[email protected]",
    "from": "[email protected]",
    "subject": "Test Email",
    "html": "<h1>Hello from Wrangler!</h1>",
    "text": "Hello from Wrangler!"
  }'

Wrangler 会显示类似如下输出:

[wrangler:info] send_email binding called with MessageBuilder:
From: [email protected]
To: [email protected]
Subject: Test Email

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

邮件内容(文本和 HTML)会保存到本地文件,部署前可检查这些文件以验证邮件结构。

已知限制

二进制附件

本地开发会在本地模拟 send_email 绑定,但附件 content 中的 ArrayBuffer 值无法被本地模拟器序列化。如果传入 ArrayBuffer(例如图片或 PDF 附件),会看到类似如下错误:

Cannot serialize value: [object ArrayBuffer]

解决方法: 本地开发期间对基于文本的附件使用字符串内容。要测试二进制附件(图片、PDF),请使用 npx wrangler deploy 部署 Worker,并对已部署版本进行测试。

此限制仅影响本地开发——在已部署的 Workers 上,ArrayBuffer 内容可正常工作。

后续步骤

这篇文档对您有帮助吗?