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

Заголовки писем

При отправке писем через 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, а также любые пользовательские заголовки отслеживания, необходимые вашему приложению.

Примеры использования

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-заголовки учитываются в этом лимите совместно.

Правила проверки

  1. Имена заголовков : только ASCII, без пробелов и двоеточий, от 1 до 100 символов. Разрешённые заголовки должны соответствовать [A-Za-z0-9\-]+. X-заголовки должны соответствовать X-[A-Za-z0-9\-_]+ (подчёркивания допускаются только в X-заголовках).
  2. Значения заголовков : допускается UTF-8, максимум 2,048 байт, отдельные CR/LF запрещены. Пустые значения отклоняются.
  3. Сопоставление без учета регистра : имена заголовков сравниваются без учёта регистра согласно RFC 5322 §2.2 ↗. В создаваемом письме используется исходный регистр символов из списка разрешенных адресов.
  4. Корректное сворачивание строк : длинные заголовки переносятся через 78 символов согласно RFC 5322 с помощью CRLF+WSP, а не кодированием MIME.
  5. Единичный случай : 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.