INTEGRITY Документация

Отправка писем

Проверяйте функцию отправки писем локально с помощью wrangler dev для имитации доставки писем и проверки логики отправки перед развёртыванием.

Предварительные требования

  1. Зарегистрируйтесь для получения Аккаунт Cloudflare ↗.
  2. Установка Node.js ↗.

менеджер версий Node.js

Используйте менеджер версий Node, например Volta ↗ или nvm ↗ чтобы избежать проблем с правами доступа и переключать версии Node.js. Wrangler, о котором пойдёт речь далее в этом руководстве, требует версию Node 16.17.0 или более поздней версии.

Конфигурация

Настройте файл Wrangler с привязкой email:

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

[[send_email]]
name = "EMAIL"

Использование удаленные привязки является рекомендуемым способом локальной разработки с Email Service. По умолчанию wrangler dev имитирует привязку электронной почты локально: письма записываются в консоль, но фактически не отправляются. При использовании удалённых привязок ваш Worker выполняется локально, но отправляет настоящие письма через Email Service.

Задайте remote: true для привязки электронной почты в конфигурации Wrangler:

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

[[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": "[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 привязку локально, но ArrayBuffer значения во вложении content нельзя сериализовать с помощью локального симулятора. Если вы передаёте ArrayBuffer (например, для вложений в виде изображений или PDF), вы увидите ошибку вида:

Cannot serialize value: [object ArrayBuffer]

Обходное решение: Используйте строковое содержимое для текстовых вложений при локальной разработке. Чтобы протестировать бинарные вложения (изображения, PDF), разверните Worker с помощью npx wrangler deploy и протестируйте на развёрнутой версии.

Это ограничение касается только локальной разработки: ArrayBuffer содержимое корректно работает в развёрнутых Workers.

Следующие шаги