Почта и доставляемость

Заголовок письма: как его читать и что он доказывает

Над письмом, которое вы читаете, есть блок строк, написанных машинами, а не отправителем. Почти всё в нём — шум, четыре поля — нет, и ровно одну из них самозванец написать не может. Дальше: где найти этот блок, в каком направлении его читать и что он на самом деле доказывает, когда вы его нашли.

  • Начальный
  • 21 мин на чтение
Синий конверт, из-за которого разворачивается длинная серая бумажная лента с чёрточками вместо слов, а над ним — серая лупа

Что на самом деле представляет собой блок заголовка

Любое письмо — это две части, разделённые одной пустой строкой: блок строк вида Name: value и текст, который вы читаете. RFC 5322 называет первую часть заголовком, а каждую строку в ней — полем, и никак не ограничивает их число. Ваш почтовый клиент показывает четыре-пять из них. Письмо, прошедшее через три сервера, обычно несёт от тридцати до шестидесяти.

исходный текст письма, сокращённый вариант
Return-Path: <bounces+2841@mail.example.com>
Delivered-To: signup-2026@example.org
Received: by mx.example.org (Postfix) with LMTP id 4c8f21
        for <signup-2026@example.org>; Fri, 5 Sep 2026 09:14:22 +0000 (UTC)
Received: from out-17.mail.example.com (out-17.mail.example.com [198.51.100.17])
        by mx.example.org (Postfix) with ESMTPS id 9a31b0
        for <signup-2026@example.org>; Fri, 5 Sep 2026 09:14:21 +0000 (UTC)
Authentication-Results: mx.example.org;
        spf=pass smtp.mailfrom=mail.example.com;
        dkim=pass header.d=example.com;
        dmarc=pass header.from=example.com
From: "Example Support" <support@example.com>
To: signup-2026@example.org
Subject: Confirm your email address
Date: Fri, 5 Sep 2026 09:14:19 +0000
Message-ID: <20260905091419.9a31b0@mail.example.com>
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="b1_4c8f21"

Если читать сверху вниз, это похоже на машинный шум, и по большей части так и есть. Почти всю информацию несут четыре поля, и именно о них это руководство: Received, From, Return-Path и Authentication-Results.

Где прячется полный заголовок

Ничего из того, что дальше, не требует ни инструмента, ни расширения, ни отдельного аккаунта. Каждый почтовый клиент хранит исходное сообщение за одним из пунктов меню, и слово, которое нужно искать, — это всегда какая-то форма слова оригинал, исходный или необработанный.

Где вы читаете почтуЧто открытьЧто вы получите
Gmail в браузереМеню «Ещё» (три точки) на открытом письме → Показать оригиналВесь блок целиком, а над ним — панель, которая уже сама оценила SPF, DKIM и DMARC
Outlook.com в браузереМеню из трёх точек → ViewView message sourceВсё письмо целиком, как оно пришло, в виде обычного текста
Классическое приложение OutlookОткройте письмо в отдельном окне → ФайлСвойстваТолько блок заголовка, в поле внизу диалогового окна
Apple Mail на MacВидСообщениеRaw SourceЗаголовок и текст письма вместе, в отдельном окне
Thunderbird на любой системеВидИсходный текст сообщенияВсё письмо целиком, с блоком заголовка сверху
Proton Mail в браузереМеню из трёх точек на письме → View headersБлок заголовка сам по себе, без текста письма
Yahoo Mail в браузереЕщёView raw messageВсё письмо целиком, именно в том виде, в котором оно было доставлено
Файл, который вам прислали, или тот, что вы экспортировали самиОткройте .eml в любом текстовом редактореВсё целиком, потому что блок заголовка и текст письма — это и есть весь .eml

Эти пути в меню верны на 5 сентября 2026 года, и они сдвигаются примерно раз в год — именно поэтому фраза выше важнее самой таблицы: как бы ни назывался пункт меню в этом сезоне, в нём обязательно будет корень слова оригинал, исходный или необработанный.

Цепочка Received: читаем снизу

Каждый сервер, принимающий письмо, пишет одну строку Received: и ставит её наверх блока, выше всего, что там уже было. Именно эта привычка порождает самый полезный факт о заголовках: последний переход — это первая строка, которую вы видите, а путь письма записан в обратном порядке.

ваш провайдернаписана последней — верхняя строкапромежуточный сервернаписана второйотправляющий сервернаписана первой — нижняя строкаэтой строке можно доверятьа эта — только утверждениепуть читается в эту сторону
Три перехода, три строки, в обратном порядке. Строка, которую написал ваш провайдер, стоит наверху — ей можно доверять; нижняя строка — это то, что о себе решила сказать отправляющая машина.
цепочка Received того же письма
Received: by mx.example.org (Postfix) with LMTP id 4c8f21
        for <signup-2026@example.org>; Fri, 5 Sep 2026 09:14:22 +0000 (UTC)
Received: from out-17.mail.example.com (out-17.mail.example.com [198.51.100.17])
        by mx.example.org (Postfix) with ESMTPS id 9a31b0
        for <signup-2026@example.org>; Fri, 5 Sep 2026 09:14:21 +0000 (UTC)
Received: from app-3.internal (app-3.internal [192.0.2.53])
        by out-17.mail.example.com (Postfix) with ESMTP id 771c4e
        for <signup-2026@example.org>; Fri, 5 Sep 2026 09:11:58 +0000 (UTC)

Каждая строка построена из одного и того же небольшого набора слов, и как только вы научитесь их называть, цепочка перестаёт быть просто узором на обоях.

from
Как назвала себя подключившаяся машина, а в скобках после этого — чем она была на самом деле: обратное DNS-имя и IP-адрес, которые принимающий сервер увидел на соединении. Имя перед скобками — это утверждение. Адрес внутри скобок — это наблюдение.
by
Сервер, который написал эту строку. Это единственная сторона в строке, с которой вы вообще можете спросить за её содержимое.
with
Как был сделан переход: ESMTP, ESMTPS — если соединение было зашифровано, LMTP — для финальной передачи в почтовый ящик. Переход, в котором указано ESMTP без S на конце, перенёс письмо в незашифрованном виде.
for
Получатель конверта на этом переходе — на какой именно из ваших адресов письмо было отправлено на самом деле, до того как его переписало какое-либо правило пересылки. На catch-all-домене или с плюс-тегом это как раз то поле, которое называет утёкший адрес.
отметка времени в конце строки
Когда этот сервер закончил принимать письмо. Вычтите время одной строки из времени строки над ней — и вы получите задержку на этом переходе, а значит, узнаете, где на самом деле застряло медленное письмо, вместо того чтобы гадать.

В примере выше письмо вышло из приложения в 09:11:58 и добралось до исходящего сервера отправляющего провайдера двумя минутами и двадцатью тремя секундами позже; следующие два перехода вместе заняли одну секунду. У письма, которое приходит с опозданием на час, почти всегда найдётся одна строка, внутри которой спрятан этот час, — и это редко бывает последняя строка.

Четыре поля, каждое из которых претендует на роль отправителя

На вопрос «кто это отправил» в заголовке есть четыре ответа, и им разрешено не совпадать. Чаще всего они не совпадают по скучным причинам — список рассылки, платформа для маркетинговых писем, правило пересылки, которое вы сами когда-то настроили. Само по себе несовпадение ничего не доказывает. А вот знание, на какое из четырёх полей вы сейчас смотрите, — доказывает.

From:
Адрес, который отправитель хочет показать, плюс отображаемое имя, представляющее собой произвольный текст. Ни то, ни другое ничем не проверяется. Именно это поле ваш почтовый клиент выводит в списке писем, и на телефоне адрес обычно полностью скрыт за именем.
Return-Path:
Отправитель конверта — его вписывает в заголовок сервер, принявший письмо, на основании того, что реально было сказано во время SMTP-сессии. Именно туда уходит письмо о недоставке, и именно этот адрес проверяет SPF, — а значит, письмо вполне может пройти SPF и при этом нести From:, не имеющий к этому адресу никакого отношения.
Reply-To:
Куда уйдёт ваш ответ — и это не обязано быть тем же адресом, откуда пришло письмо. Обычные отправители используют его для служб поддержки и адресов no-reply. А ещё это старейший трюк в отрасли: внимательный читатель проверяет отправителя, решает, что всё в порядке, а потом нажимает «Ответить».
Delivered-To: и X-Original-To:
Какой именно из ваших адресов был использован. На catch-all-домене или с плюс-тегом это как раз то поле, которое называет адрес, отданный вами наружу, — тот самый, что укажет, кто его выпустил на волю.
отображаемое имя говорит одно, а адрес — другое
From: "Example Support <support@example.com>" <billing@example.net>
         ^-- the display name, which is free text and is all a phone shows
                                              ^-- the address, which is not

Отображаемое имя — это произвольный текст, поэтому в нём может целиком поместиться чужой адрес. Любой почтовый клиент в мире покажет часть в кавычках и спрячет часть в угловых скобках, и в этом вся атака целиком: написать её ничего не стоит, а работает она ровно на том поле, на которое читатель гарантированно посмотрит.

SPF, DKIM и DMARC в одной строке

Одно поле не похоже ни на одно другое поле в блоке. Authentication-Results: пишет сервер, который принял письмо, — то есть ваш собственный, — а всё, что приходит извне под тем же именем, вырезается или переименовывается ещё до того, как вы это увидите. Это единственная строка в заголовке, которую самозванец написать не может.

вердикт, который зафиксировал ваш собственный провайдер
Authentication-Results: mx.example.org;
        spf=pass (sender IP is 198.51.100.17) smtp.mailfrom=mail.example.com;
        dkim=pass header.d=example.com header.s=s1 header.b=Qk3vR2mA;
        dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=example.com

В этой строке живут три проверки, и они отвечают на три разных вопроса. А четвёртый столбец стоит прочитать дважды.

ПроверкаЧто означает успешный результатЧто обычно означает неудачный результатЧего не доказывает ни то, ни другое
spf=Машина, которая передала письмо, есть в списке, который в DNS публикует домен отправителя конверта.Либо самозванец, либо обычная пересылка: SPF ломается всякий раз, когда третья сторона ретранслирует письмо, а это не является нарушением и происходит постоянно.Ничего об адресе в From:. SPF на него вообще никогда не смотрит.
dkim=Криптографическая подпись письма совпадает с открытым ключом, опубликованным доменом, который подписал письмо.Либо письмо изменили в пути — для этого достаточно, чтобы список рассылки дописал в конец подпись, — либо его подписал не тот домен, на который оно претендует.Того, что домен, поставивший подпись, — это домен в From:. Собственную почту безупречно подписать может кто угодно.
dmarc=SPF или DKIM прошли проверку, и домен, для которого они её прошли, совпадает с доменом в From:.Домен в From: не авторизовал это письмо — ближе к утверждению «отправитель не тот, за кого себя выдаёт» заголовок никогда не подходит.Того, что письмо безопасно, честно или желанно. Домен, зарегистрированный сегодня утром, уже к обеду может опубликовать безупречный DMARC.

Этот последний столбец — вся суть, и именно на нём чаще всего спотыкается чтение заголовков. dmarc=pass доказывает, что домен, напечатанный в From:, авторизовал это письмо. Он вообще ничего не говорит о том, заслуживает ли этот домен хоть какого-то доверия с вашей стороны, — а опубликовать такие записи самостоятельно может кто угодно примерно за десять минут.

Пять вещей, которые заголовок не расскажет

  • Где находится отправитель. Адреса машины, на которой письмо набирали, в блоке обычно вообще нет. Крупные почтовые провайдеры перестали его публиковать много лет назад, и всё, что остаётся, — это их собственный исходящий сервер, который стоит в дата-центре и назовёт вам разве что имя хостинговой компании.
  • Кто отправитель. Домен — это не человек. dmarc=pass для домена, купленного сорок минут назад, — такая же настоящая, неподдельная проверка, как и любая другая.
  • Правда ли то, что в нём написано. Аутентификация касается конверта и никогда — утверждений внутри него. Счёт может быть правильно подписан, правильно выровнен и при этом полностью выдуман.
  • Прочитали ли его вообще. Заголовок этого не фиксирует никак. Попытку сделать это берёт на себя трекинговый пиксель в теле письма — это совсем другой механизм и совсем другая защита от него.
  • Когда оно было написано. Date: берётся с машины отправителя и с его собственных часов. Письмо со штампом на три часа в будущем гораздо чаще означает неправильно настроенный компьютер, чем что-то интересное; отметкам времени, на которые можно полагаться, — место в строках Received, написанных вашим провайдером.

И есть целое семейство полей, которое по своей конструкции не доказывает вообще ничего. Всё, что начинается с X-, — это частное расширение, придуманное тем, кто его написал, и отправитель может вписать туда что угодно: X-Spam-Status: No в письме означает лишь то, что письмо само о себе утверждает, что оно не спам.

Когда письмо пришло на одноразовый адрес

Стоит чётко понимать, что этот сервис возвращает, а что — нет. Письмо, которое вы читаете здесь, приходит уже разобранным, а не в сыром виде: отправитель, тема, дата, текст, HTML и список вложений — то есть именно те поля, за которыми обычно приходит скрипт, — а не блок заголовка. Всё, что описано выше, вы делаете в том ящике, который хранит вашу настоящую почту.

GET /api/v1/message/{id} — что приходит на самом деле
{
  "id":           "m_7Kq2fV3xTn",
  "from":         "support@example.com",
  "from_name":    "Example Support",
  "to":           "signup-2026@grabmail.io",
  "subject":      "Confirm your email address",
  "date":         "2026-09-05T09:14:22+00:00",
  "expires_at":   "2026-09-10T09:14:22+00:00",
  "text":         "Confirm your address: <https://example.com/confirm/9a31b0>",
  "text_derived": true,
  "html":         "<!doctype html><html>…",
  "attachments":  []
}

Взамен одноразовый адрес даёт вам сигнал, с которым не сравнится ни одно поле заголовка, и он работает ещё до того, как вы прочли хоть одну строку: вы отдали этот адрес ровно одной стороне. Если письмо приходит на него и утверждает, что оно от кого-то другого, значит, его либо переслала та сторона, которой вы этот адрес дали, либо отправил тот, кому она его передала. Третьего объяснения нет, и проверять тут нечего.

Это тот же самый аргумент, что и у плюс-тега, только без той части, где тег можно отрезать одной строкой кода, — здесь другой сам адрес, поэтому отрезать нечего. Именно поэтому catch-all на домене, которым вы владеете, — это самая сильная версия этого приёма: один адрес на каждую регистрацию, живущий столько же, сколько вы держите домен, а Delivered-To: в вашем собственном ящике называет тот, что утёк.

Проверка, которая всё ещё доступна

Смотрите, куда ведёт ссылка, а не что на ней написано. Поле text — это либо собственная текстовая часть отправителя, либо результат рендеринга HTML — какая именно, говорит text_derived, — а при рендеринге адрес каждой ссылки сохраняется в угловых скобках. Так что адрес, на который вас должна была увести кнопка, лежит прямо в ответе, на виду, без загрузки страницы, картинок или пикселя.

поле text у письма, которое пришло только в виде HTML
Confirm your address: <https://example.com/confirm/9a31b0>

Not you? Ignore this message. <https://example.com/help>

Версия на шестьдесят секунд

  1. Откройте исходный текст письма. Показать оригинал, View message source или Raw source — в зависимости от того, в каком вы клиенте.
  2. Сначала найдите Authentication-Results. Одна строка, написанная вашим собственным провайдером, — единственная, которую никто другой не мог подделать. dmarc=pass — и домен в From: действительно авторизовал письмо; dmarc=fail — и не авторизовал.
  3. Сравните From: с Return-Path: и Reply-To:. Они расходятся по скучным причинам весь день напролёт. А ещё они расходятся по одной интересной.
  4. Читайте строки Received снизу вверх и перестаньте им верить на первой же машине, которая принадлежит не вашему провайдеру.
  5. А потом посмотрите, куда указывают ссылки, — именно эта часть решает, что на самом деле произойдёт с вами.

Всё написанное выше отвечает на один узкий вопрос: авторизовал ли домен в From: это письмо? Это более скромный вопрос, чем «безопасно ли это», и всё равно его стоит задавать — потому что это единственный вопрос, на который заголовок вообще способен ответить.

Вопросы

Как увидеть полный заголовок в Gmail?

Откройте письмо, затем меню из трёх точек в правом верхнем углу, затем Показать оригинал. Gmail откроет новую вкладку с исходным письмом, а над ним — небольшую панель, которая уже сама оценила SPF, DKIM и DMARC: это самый быстрый вердикт из всех доступных где бы то ни было, и он бесплатный.

Можно ли подделать заголовок письма?

По большей части — да. From:, Reply-To:, Date:, тему письма и сколько угодно выдуманных строк Received: — всё это печатает отправитель. Подделать нельзя то, что написал ваш собственный провайдер, когда письмо пришло: верхнюю строку Received и Authentication-Results. Читайте эти две, а ко всему остальному относитесь как к показаниям свидетеля.

Можно ли найти IP-адрес отправителя в заголовке?

Обычно не тот, который вы имеете в виду. Почта, отправленная через любой крупный веб-сервис, несёт адрес исходящего сервера этого сервиса, а не машины, на которой письмо набирали; последнее провайдеры перестали публиковать много лет назад по понятной причине. Почта, отправленная приложением или небольшим сервером, часто всё ещё показывает такой адрес — в скобках, в нижней строке Received, — и эта же строка легче всего подделывается во всём блоке.

В чём разница между <code>From:</code> и <code>Return-Path:</code>?

From: — это то, что отправитель хочет показать, и это никто не проверяет. Return-Path: — это отправитель конверта, которого серверы использовали на самом деле; его вписывает в заголовок машина, принявшая письмо, и именно туда уходит письмо о недоставке. SPF проверяется против Return-Path:, а не против From:, и именно поэтому один только spf=pass говорит меньше, чем кажется. А вот выстроить эти два адреса в одну линию — это уже вся работа DMARC.

В заголовке стоит <code>dmarc=fail</code>. Значит ли это, что письмо поддельное?

Не обязательно. Пересылка ломает SPF по самой своей природе, а список рассылки, дописывающий подпись в конец письма, заодно ломает и DKIM, так что почта, ретранслированная через список, университет или правило вида «пересылать всё на мой другой адрес», регулярно проваливает проверку, оставаясь при этом полностью настоящей. Единственное, что действительно означает провал, — это то, что ничто в письме не доказывает, что домен в From: стоит за ним, а значит, всё, о чём просит вас это письмо, стоит проверить ещё и другим путём.

Для чего нужен <code>Message-ID</code>?

Это имя письма — уникальное, присвоенное отправляющим сервером, и именно на эту строку ссылаются In-Reply-To и References, когда выстраивают переписку в цепочку. Практическая польза в том, что служба поддержки и постмастеры могут найти его в своих логах: указать Message-ID — это разница между «письмо вчера не пришло» и вопросом, на который кто-то реально способен ответить.

Можно ли прочитать заголовки почты, присланной здесь на временный адрес?

Нет — письмо, прочитанное здесь, возвращается уже разобранным: отправитель, тема, дата, текст, HTML и список вложений, а необработанного блока заголовка среди этих полей нет. Компенсация в том, что одноразовый адрес — это доказательство само по себе: он был отдан ровно одной стороне, поэтому письмо, пришедшее якобы от кого-то другого, называет именно ту сторону, что его выпустила, — и никакая подпись для этого не нужна. Письма в любом случае удаляются через 5 дней.

Читать дальше

Попробуйте, пока свежо

Адрес — это один клик, без аккаунта и карты. Всё из этого руководства сразу заработает на нём.

С возвращением

Ваши ящики и ваши домены в одном месте.