← Cloudflare Email Service / email-service / api / send-emails
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");
},
};Следующие шаги
- См. REST API для отправки писем без Workers
- См. SMTP для отправки из любого приложения или почтового клиента с поддержкой SMTP
- См. практические примеры моделей отправки писем
- Подробнее о Email Routing для обработки входящих писем
- Изучите аутентификация электронной почты для повышения доставляемости