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

API Workers

Workers API предоставляет встроенные возможности отправки писем непосредственно из ваших Cloudflare Workers с помощью привязок (bindings). Если вы не используете Workers, отправлять письма можно с помощью REST API взамен.

Привязка email

Настройте send_email привязку в файле конфигурации Wrangler, чтобы включить отправку писем:

{
	"send_email": [{ "name": "EMAIL" }],
}
[[send_email]]
name = "EMAIL"

Вы можете ограничить, каких отправителей и получателей может использовать привязка. Подробнее см. Настройка привязок отправки для получения сведений о доступных атрибутах ограничений и примерах.

send() метод

Отправьте одно письмо с помощью send() метод в привязке электронной почты.

Интерфейс

interface SendEmail {
	send(message: EmailMessage | EmailMessageBuilder): Promise<EmailSendResult>;
}

interface EmailAddress {
	email: string;
	name?: string;
}

// Structured email builder (recommended)
interface EmailMessageBuilder {
	to: string | EmailAddress | (string | EmailAddress)[]; // Max 50 recipients
	from: string | EmailAddress;
	subject: string;
	html?: string;
	text?: string;
	cc?: string | EmailAddress | (string | EmailAddress)[];
	bcc?: string | EmailAddress | (string | EmailAddress)[];
	replyTo?: string | EmailAddress;
	attachments?: Attachment[];
	// Custom headers. See /email-service/reference/headers/
	headers?: { [key: string]: string };
	// The combined number of addresses in `to`, `cc`, and `bcc` must not
	// exceed 50. See /email-service/platform/limits/ for all limits.
}

interface Attachment {
	content: string | ArrayBuffer | ArrayBufferView; // Base64 string or binary content
	filename: string;
	type: string; // MIME type
	disposition: "attachment" | "inline";
	contentId?: string; // For inline attachments
}

interface EmailSendResult {
	messageId: string; // Unique email ID
}

// Errors are thrown as standard Error objects with a `code` property
// try { await env.EMAIL.send(...) } catch (e) { console.log(e.code, e.message) }

Базовое использование

const response = await env.EMAIL.send({
	to: "[email protected]",
	from: "[email protected]",
	subject: "Welcome to our service!",
	html: "<h1>Welcome!</h1><p>Thanks for signing up.</p>",
	text: "Welcome! Thanks for signing up.",
});

О нескольких получателях, CC/BCC и именованных адресах см. Указание получателей.

Вложения

Отправляйте файлы, указав содержимое в кодировке base64 в attachments массив. Общий размер сообщения не должен превышать 5 MiB (включая вложения).

const response = await env.EMAIL.send({
	to: "[email protected]",
	from: "[email protected]",
	subject: "Your Invoice",
	html: "<h1>Invoice attached</h1><p>Please find your invoice attached.</p>",
	attachments: [
		{
			content: "JVBERi0xLjQKJeLjz9MKMSAwIG9iag...", // Base64 PDF content
			filename: "invoice-12345.pdf",
			type: "application/pdf",
			disposition: "attachment",
		},
	],
});

Об встроенных изображениях и загрузке файлов см. Вложения писем.

Обработка ошибок

Корректная обработка ошибок при отправке писем:

export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		try {
			const response = await env.EMAIL.send({
				to: "[email protected]",
				from: "[email protected]",
				subject: "Test Email",
				text: "This is a test email.",
			});

			return new Response(
				JSON.stringify({
					success: true,
					emailId: response.messageId,
				}),
			);
		} catch (error) {
			// Error has .code and .message properties
			console.error("Email sending failed:", error.code, error.message);

			// Handle specific error types
			switch (error.code) {
				case "E_SENDER_NOT_VERIFIED":
					return new Response(
						JSON.stringify({
							success: false,
							error: "Please verify your sender domain first",
						}),
						{ status: 400 },
					);

				case "E_RATE_LIMIT_EXCEEDED":
					return new Response(
						JSON.stringify({
							success: false,
							error: "Rate limit exceeded. Please try again later",
						}),
						{ status: 429 },
					);

				default:
					return new Response(
						JSON.stringify({
							success: false,
							error: error.message,
						}),
						{ status: 500 },
					);
			}
		}
	},
};

Коды ошибок

При отправке писем могут возвращаться следующие коды ошибок:

Код ошибки Описание Частые причины
E_VALIDATION_ERROR Ошибка проверки в теле запроса Неверный формат письма, отсутствуют обязательные поля, некорректные данные
E_FIELD_MISSING Отсутствует обязательное поле Отсутствует to, from, или subject поля
E_TOO_MANY_RECIPIENTS Слишком много получателей в массивах to/cc/bcc Суммарное количество получателей превышает лимит в 50
E_TOO_MANY_ATTACHMENTS Слишком много вложений в attachments массив attachments массив превышает 32 записи
E_SENDER_NOT_VERIFIED Домен отправителя не подтверждён Попытка отправки с неподтвержденного домена
E_RECIPIENT_NOT_ALLOWED Получатель не входит в список разрешённых Адрес получателя не входит в allowed_destination_addresses
E_RECIPIENT_SUPPRESSED Получатель находится в списке подавления Адрес электронной почты получал возвраты писем или отмечал ваши письма как спам
E_SENDER_DOMAIN_NOT_AVAILABLE Домен недоступен для отправки Домен не подключён к Email Service
E_CONTENT_TOO_LARGE Содержимое письма превышает допустимый размер Общий размер сообщения превышает максимально допустимый
E_DELIVERY_FAILED Не удалось доставить письмо Сбой доставки по SMTP, отказ сервера получателя
E_RATE_LIMIT_EXCEEDED Превышено ограничение скорости Достигнут лимит скорости отправки
E_DAILY_LIMIT_EXCEEDED Превышен дневной лимит Достигнута дневная квота отправки
E_INTERNAL_SERVER_ERROR Внутренняя ошибка сервиса Email Service временно недоступен
E_HEADER_NOT_ALLOWED Заголовок не разрешён Заголовок управляется платформой или отсутствует в allowlist
E_HEADER_USE_API_FIELD Необходимо использовать поле API Заголовок вроде From необходимо задавать через отдельное поле API
E_HEADER_VALUE_INVALID Недопустимое значение заголовка Некорректное значение, пустое значение или неверный формат
E_HEADER_VALUE_TOO_LONG Слишком длинное значение заголовка Значение превышает лимит в 2,048 байт
E_HEADER_NAME_INVALID Недопустимое имя заголовка Недопустимые символы или превышение лимита в 100 байт
E_HEADERS_TOO_LARGE Слишком большой размер заголовков Общий объём пользовательских заголовков превышает лимит 16 КБ
E_HEADERS_TOO_MANY Слишком много заголовков Более 20 разрешённых пользовательских заголовков (не X-заголовков)

Устаревшая EmailMessage API

EmailMessage API по-прежнему поддерживается для обратной совместимости. Используйте его, если у вас уже есть необработанное RFC 5322 ↗ MIME-сообщение для отправки. Для нового кода предпочтительнее использовать структурированный send() метод выше.

import { EmailMessage } from "cloudflare:email";
import { createMimeMessage } from "mimetext";

export default {
	async fetch(request: Request, env: Env): Promise<Response> {
		const msg = createMimeMessage();
		msg.setSender({ name: "Sender", addr: "[email protected]" });
		msg.setRecipient("[email protected]");
		msg.setSubject("Legacy Email");
		msg.addMessage({
			contentType: "text/html",
			data: "<h1>Hello from legacy API</h1>",
		});

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

		await env.EMAIL.send(message);
		return new Response("Legacy email sent");
	},
};

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