← Cloudflare Email Service / email-service / reference
Заголовки писем
При отправке писем через Cloudflare Email Service можно задать пользовательские заголовки с помощью headers поле в API Workers или REST API. Email Service использует подход на основе allowlist : принимаются только явно разрешённые заголовки. Любой заголовок, не входящий в список разрешённых (и не являющийся X- с этим префиксом) отклоняется на уровне API с понятным сообщением об ошибке.
При отправке через SMTP, задавайте заголовки непосредственно в MIME-сообщении, а не через headers поле. Действует тот же список разрешённых значений.
Заголовки, управляемые платформой
Эти заголовки автоматически создаются инфраструктурой Cloudflare Email Service. Задать или переопределить их нельзя. Если вы укажете любой из них в headers объект, API возвращает E_HEADER_NOT_ALLOWED.
| Header | Поведение |
|---|---|
Date |
Метка времени UTC, установленная при приёме |
Message-ID |
Формируется с доменом Cloudflare для уникального отслеживания |
MIME-Version |
Всегда 1.0 |
Content-Type |
Формируется на основе переданных частей тела письма |
Content-Transfer-Encoding |
Формируется на основе анализа содержимого |
DKIM-Signature |
Подписано инфраструктурой Cloudflare |
Return-Path |
Указывает на обработчик отказов Cloudflare |
Received |
Добавляется на каждом хопе согласно RFC 5321 |
Feedback-ID |
Формируется для отчётов о репутации в Google Postmaster Tools |
ARC-* |
Цепочка аутентификации для пересылки |
TLS-Required |
Настройка инфраструктуры доставки, управляемая платформой |
TLS-Report-Domain |
Отчёты об ошибках TLS направляются в инфраструктуру Cloudflare |
TLS-Report-Submitter |
Ссылка на домен отправки Cloudflare |
CFBL-Address |
Адрес цикла обратной связи по жалобам (RFC 9477) |
CFBL-Feedback-ID |
Идентификатор цикла обратной связи по жалобам (RFC 9477) |
Заголовки, которые соответствуют основным полям API: From, To, Cc, Bcc, Subject, Reply-To : также отклоняются в headers объект с E_HEADER_USE_API_FIELD. Задайте их через специальные поля API (from, to, cc, bcc, subject, replyTo для Workers / reply_to для REST) вместо этого.
Пользовательские заголовки из списка разрешенных
Эти заголовки можно задать через headers поле. Любой заголовок, который не указан здесь и не начинается с X- отклоняется с E_HEADER_NOT_ALLOWED.
Если запрос на отправку содержит запрещённый заголовок, Email Service отклоняет весь запрос целиком, а не удаляет заголовок и продолжает отправку.
Заголовки цепочек и ответов
| Header | RFC | Примечания |
|---|---|---|
In-Reply-To |
RFC 5322 ↗ | Критично для группировки писем в цепочки во всех клиентах |
References |
RFC 5322 ↗ | Критично для группировки писем в цепочки во всех клиентах |
Thread-Index |
Microsoft (нестандартный) | Индекс переписки, используемый Outlook и Exchange Online |
Thread-Topic |
Microsoft (нестандартный) | Тема переписки, используемая Outlook и Exchange Online |
Заголовки управления списком рассылки
| Header | RFC | Примечания |
|---|---|---|
List-Unsubscribe |
RFC 2369 ↗ | Должно содержать <https://...> и/или <mailto:...> URI. HTTP-адреса (без TLS) отклоняются. Gmail и Yahoo требуют этого от массовых отправителей. Всегда подписывается DKIM согласно RFC 8058. |
List-Unsubscribe-Post |
RFC 8058 ↗ | Должно быть ровно List-Unsubscribe=One-Click (с учётом регистра). Требует List-Unsubscribe с URI HTTPS. |
List-Id |
RFC 2919 ↗ | Идентификация списка рассылки |
List-Archive |
RFC 2369 ↗ | URL-адрес списка архива |
List-Help |
RFC 2369 ↗ | URL-адрес справки |
List-Owner |
RFC 2369 ↗ | Контакт владельца списка рассылки |
List-Post |
RFC 2369 ↗ | Адрес для отправки |
List-Subscribe |
RFC 2369 ↗ | URL-адрес или адрес для подписки |
Precedence |
Стандарт де-факто | Допустимые значения: bulk, list, junk |
Определение автоматических сообщений
| Header | RFC | Примечания |
|---|---|---|
Auto-Submitted |
RFC 3834 ↗ | Значения: auto-generated, auto-replied, auto-notified |
Содержимое и отображение
| Header | RFC | Примечания |
|---|---|---|
Content-Language |
RFC 3282 ↗ | Язык содержимого (например, en, fr) |
Keywords |
RFC 5322 ↗ | Ключевые слова сообщения (через запятую для нескольких значений) |
Comments |
RFC 5322 ↗ | Дополнительные комментарии (через запятую для нескольких значений) |
Importance |
RFC 2156 ↗ | Значения: high, normal, low |
Priority |
RFC 2156 ↗ | Значения: normal, non-urgent, urgent |
Sensitivity |
RFC 2156 ↗ | Значения: personal, private, company-confidential |
Organization |
RFC 4021 ↗ | Название организации отправителя |
Доставка и уведомления
| Header | RFC | Примечания |
|---|---|---|
Require-Recipient-Valid-Since |
RFC 7293 ↗ | Защита от повторного использования адреса |
Expires |
RFC 2156 ↗ | Дата и время, после которых сообщение считается недействительным |
Reply-By |
RFC 2156 ↗ | Дата и время, к которым запрошен ответ |
Современные стандарты
| Header | RFC | Примечания |
|---|---|---|
Archived-At |
RFC 5064 ↗ | URL-адрес, по которому архивируется сообщение |
Пользовательские X-заголовки
Любой заголовок, начинающийся с X- разрешён. Это касается таких распространённых заголовков, как X-Mailer, X-Priority, X-Campaign-ID, а также любые пользовательские заголовки отслеживания, необходимые вашему приложению.
- Формат имени:
X-[A-Za-z0-9\-_]+, максимум 100 символов - Значение: UTF-8, максимум 2,048 байт
- Без ограничения по количеству для X-заголовков (с учётом общего ограничения на размер полезной нагрузки в 16 КБ)
Примеры использования
curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/email/sending/send" \
--header "Authorization: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"to": "[email protected]",
"from": "[email protected]",
"subject": "Your weekly digest",
"html": "<h1>Weekly Digest</h1>",
"headers": {
"In-Reply-To": "<[email protected]>",
"References": "<[email protected]>",
"List-Unsubscribe": "<https://yourdomain.com/unsubscribe?id=abc123>",
"List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
"X-Campaign-ID": "weekly-digest-2026-03",
"X-User-Segment": "premium"
}
}'const response = await env.EMAIL.send({
to: "[email protected]",
from: "[email protected]",
subject: "Your weekly digest",
html: "<h1>Weekly Digest</h1>",
headers: {
// Threading
"In-Reply-To": "<[email protected]>",
References: "<[email protected]>",
// List management (required by Gmail/Yahoo for bulk senders)
"List-Unsubscribe": "<https://yourdomain.com/unsubscribe?id=abc123>",
"List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
// Custom tracking
"X-Campaign-ID": "weekly-digest-2026-03",
"X-User-Segment": "premium",
},
});Ограничения заголовков
| Лимит | Значение |
|---|---|
| Максимум разрешенных (не-X) пользовательских заголовков | 20 |
| Максимальная длина имени заголовка | 100 байт |
| Максимальная длина значения заголовка | 2,048 байт |
| Общий объём данных пользовательских заголовков | 16 KB |
Общий размер полезной нагрузки рассчитывается как sum(len(name) + 2 + len(value) + 2) для всех пользовательских заголовков (имя + : + value + CRLF). Заголовки из списка разрешённых и X-заголовки учитываются в этом лимите совместно.
Правила проверки
- Имена заголовков : только ASCII, без пробелов и двоеточий, от 1 до 100 символов. Разрешённые заголовки должны соответствовать
[A-Za-z0-9\-]+. X-заголовки должны соответствоватьX-[A-Za-z0-9\-_]+(подчёркивания допускаются только в X-заголовках). - Значения заголовков : допускается UTF-8, максимум 2,048 байт, отдельные CR/LF запрещены. Пустые значения отклоняются.
- Сопоставление без учета регистра : имена заголовков сравниваются без учёта регистра согласно RFC 5322 §2.2 ↗. В создаваемом письме используется исходный регистр символов из списка разрешенных адресов.
- Корректное сворачивание строк : длинные заголовки переносятся через 78 символов согласно RFC 5322 с помощью CRLF+WSP, а не кодированием MIME.
- Единичный случай :
headersимеет тип{ [key]: string }, поэтому каждое имя заголовка может встречаться не более одного раза. Для заголовков, поддерживающих несколько значений (например,KeywordsилиComments), используйте значения, разделённые запятыми, в одной строке.
Коды ошибок
| Код ошибки | Когда | Пример сообщения |
|---|---|---|
E_HEADER_NOT_ALLOWED |
Заголовок управляется платформой или отсутствует в allowlist | Header 'Date' is not allowed. It is auto-generated by the platform. |
E_HEADER_USE_API_FIELD |
Заголовок соответствует одному из основных полей API | Header 'From' must be set via the 'from' API field, not the 'headers' object. |
E_HEADER_VALUE_INVALID |
Значение заголовка некорректно или пусто | Header 'List-Unsubscribe' must contain angle-bracket HTTPS or mailto URI(s). |
E_HEADER_VALUE_TOO_LONG |
Значение заголовка превышает лимит в 2,048 байт | Header 'X-Campaign-ID' value exceeds 2048 byte limit. |
E_HEADER_NAME_INVALID |
Имя заголовка содержит недопустимые символы или превышает 100 байт | Header name 'Bad Header!' contains invalid characters. |
E_HEADERS_TOO_LARGE |
Общий объём данных пользовательских заголовков превышает 16 КБ | Total custom headers payload (17.2KB) exceeds 16KB limit. |
E_HEADERS_TOO_MANY |
Слишком много разрешённых (не X-) пользовательских заголовков | 21 allowlisted headers provided, maximum is 20. |