Как на самом деле работает электронная почта: путь письма от отправителя к получателю

SMTP, DNS MX-записи, SPF, DKIM, DMARC — разбираем каждый шаг доставки письма от клика «Отправить» до папки «Входящие». С диаграммами и примерами заголовков.

Обложка: Как на самом деле работает электронная почта: путь письма от отправителя к получателю

Электронная почта — технология, которой вы пользуетесь каждый день. Но задумывались ли вы, как именно письмо попадает от отправителя к получателю? Что происходит за кулисами, когда вы нажимаете «Отправить»?

В этой статье разберём весь путь письма — от SMTP-команд до проверки подлинности через DKIM, SPF и DMARC. Покажем на конкретном примере: Джон (john@gmail.com) отправляет письмо Кевину (kevin@yahoo.com).

Ключевые выводы

— Письмо передаётся между серверами по протоколу SMTP (порт 25) через простые текстовые команды

— Почтовый сервер находит адресата через DNS-запрос MX-записи домена получателя

— Подлинность отправителя проверяется тремя механизмами: DKIM (цифровая подпись), SPF (проверка IP) и DMARC (политика при сбоях)

— Получатель забирает письма из ящика через IMAP или POP3 — это отдельные протоколы

Базовая терминология

Прежде чем разбирать процесс, познакомимся с ключевыми терминами:

  • SMTP (Simple Mail Transfer Protocol) — протокол передачи почты, работающий поверх TCP. Используется для отправки и доставки писем между серверами
  • Почтовый сервер (Mail Server) — серверное приложение, которое принимает, хранит, проверяет и доставляет электронные письма
  • MX-запись (Mail Exchange Record) — DNS-запись, содержащая доменное имя почтового сервера для данного домена
  • MTA (Mail Transfer Agent) — компонент сервера, отвечающий за передачу писем между серверами (например, с сервера Gmail на сервер Yahoo)
  • DKIM (DomainKeys Identified Mail) — механизм аутентификации на основе цифровой подписи
  • DMARC (Domain-based Message Authentication, Reporting, and Conformance) — политика, определяющая действия при сбое аутентификации
  • SPF (Sender Policy Framework) — метод аутентификации, проверяющий, имеет ли IP-адрес отправителя право отправлять почту от имени домена

Не страшно, если не всё понятно сразу — каждый термин подробно разобран ниже.

Общая картина: как письмо проходит путь от отправителя к получателю

Этот раздел — краткий обзор всего процесса. Детали каждого шага разобраны дальше.

Почтовый сервер — это серверное ПО, которое принимает, ставит в очередь, отправляет и получает письма. Если вы шлёте письмо с john@gmail.com на kevin@yahoo.com, сервер Gmail примет письмо и передаст его серверу Yahoo.

Допустим, есть два друга:

  • Джон (john@gmail.com)
  • Кевин (kevin@yahoo.com)

Почему Yahoo? Потому что получатель использует Yahoo (kevin@yahoo.com).

Дальше всё берёт на себя сервер Yahoo Mail, и письмо попадает во входящие Кевина.

Архитектурная диаграмма

Архитектурная диаграмма доставки email
Схема: путь письма от отправителя к получателю через SMTP, DNS, MX, DKIM, SPF

Разбор по шагам

Теперь разберём каждый этап подробно. Стоит отметить, что описан наиболее распространённый сценарий работы почтовых серверов. У разных компаний реализация может отличаться, но базовая идея одна и та же.

SMTP: как письмо попадает на сервер

Simple Mail Transfer Protocol определяет, как письмо передаётся на почтовый сервер. Для передачи почты между серверами SMTP использует порт 25. Для отправки от клиента к серверу (submission) применяются порты 587 (STARTTLS) или 465 (implicit TLS). Подключиться к серверу можно через утилиту telnet. Вот что вы увидите при подключении к серверу Gmail:

Подключение к SMTP-серверу Gmail через telnet
Подключение к SMTP-серверу Gmail через telnet

После подключения мы можем отправлять серверу команды:

HELO / EHLO

Команда для приветствия — вы представляетесь почтовому серверу. В ответ сервер отправляет приветствие:

SMTP-команда HELO
Команда HELO — приветствие почтового сервера

MAIL FROM

Сообщает серверу, кто отправляет письмо. Сервер отвечает 250 2.1.0 OK:

SMTP-команда MAIL FROM
Команда MAIL FROM — указание отправителя

RCPT TO

Указывает, кому адресовано письмо. Сервер снова отвечает OK:

SMTP-команда RCPT TO
Команда RCPT TO — указание получателя

DATA

Сервер сообщает клиенту, что можно начинать передачу тела письма:

SMTP-команда DATA
Команда DATA — начало передачи тела письма

Затем отправляются данные самого письма:

Тело SMTP-письма
Передача содержимого письма

Точка (.) на отдельной строке означает «конец сообщения». Сервер отвечает подтверждением (Accepted):

SMTP ответ Accepted
Сервер подтверждает приём письма

QUIT

Прощаемся с сервером:

SMTP-команда QUIT
Команда QUIT — завершение сессии

Вот так письмо передаётся на почтовый сервер по протоколу SMTP. Теперь разберём, что происходит дальше.

Хранение

Письмо теперь хранится на сервере Gmail, и сервер извлекает из него метаданные: FROM, TO и другие заголовки.

Некоторые почтовые серверы хранят письма прямо в файловой системе, другие используют распределённые объектные хранилища вроде AWS S3.

Очередь

Обратите внимание: когда SMTP-сервер принял наше письмо, он ответил «queued» (поставлено в очередь), а не «sent» (отправлено). Письма поступают в огромных объёмах, и отправить их мгновенно невозможно. Поэтому почтовые серверы ставят их в очередь и отправляют по одному. В случае ошибки письмо может быть перемещено в очередь повторных попыток.

DNS и DNS-записи

Для отправки писем нужно доменное имя (часть после @ в адресе). В конечном счёте любой сервер — это IP-адрес, но запоминать IP неудобно. Для этого и существует DNS.

DNS (Domain Name System) преобразует доменные имена (например, gmail.com) в IP-адреса. Именно поэтому можно подключиться и через telnet <ДОМЕН>, и через telnet <IP>.

DNS-запись — это запись, опубликованная в системе доменных имён, содержащая данные, видимые из интернета. Запомните это — DNS-записи играют ключевую роль в аутентификации email.

MX-запись

Ранее мы говорили, что почтовые серверы передают письма друг другу через SMTP-соединение на порту 25. Но как серверы узнают, на какой IP-адрес или домен отправлять письмо?

Здесь на сцену выходит MX-запись (Mail Exchange). Каждый домен публикует MX-запись в DNS, и другие почтовые серверы запрашивают её. Проверить MX-запись любого домена можно, например, на MXToolbox.

Вот MX-записи почтовых серверов Gmail:

MX-записи Gmail
MX-записи почтовых серверов Gmail

Аутентификация

Мы только что поставили письмо в очередь на почтовом сервере — и для этого не потребовалось никакой аутентификации. Так как же работает проверка подлинности? Здесь в игру вступают DKIM и SPF.

DKIM: цифровая подпись письма

DKIM — это механизм аутентификации на основе пары открытого и закрытого ключей. Отправляющий сервер подписывает письмо, а принимающий — проверяет подпись. В нашем случае отправитель — сервер Gmail, получатель — сервер Yahoo.

  1. Письмо поступает на Gmail через SMTP
  2. Gmail сохраняет его
  3. Gmail вычисляет хеш заголовков и тела письма, подписывает его закрытым ключом и добавляет заголовок DKIM-Signature
  4. Когда письмо доставляется на сервер-получатель, тот расшифровывает подпись открытым ключом, вычисляет хеш самостоятельно и сравнивает результаты
  5. Если проверка не пройдена — письмо не доставляется

Вот как выглядит заголовок DKIM-Signature:

Заголовок DKIM-Signature
Пример заголовка DKIM-Signature в письме

Но откуда получатель знает открытый ключ отправителя?

Снова на помощь приходят DNS-записи. Домен отправителя (gmail.com в нашем примере) публикует DNS-запись с открытым ключом и селектором. Селектор нужен для выбора нужного ключа, если у сервера их несколько.

Вот как выглядит DNS-запись с публичным ключом DKIM:

DNS-запись с публичным ключом DKIM
DNS-запись DKIM: публичный ключ для проверки подписи

Таким образом, сервер Yahoo запрашивает DNS-записи для gmail.com и получает открытый ключ для проверки подписи.

SPF: проверка IP-адреса отправителя

Эта проверка происходит на стороне получателя. SPF определяет, имеет ли данный IP-адрес право отправлять почту от имени домена.

Когда Gmail передаёт письмо john@gmail.com на kevin@yahoo.com, он открывает SMTP-соединение с сервером Yahoo. В этот момент Yahoo знает, с какого IP пришло соединение (это IP сервера Gmail).

Yahoo извлекает домен отправителя (gmail.com) из заголовка MAIL FROM и запрашивает DNS-запись SPF, которая выглядит так:

SPF-запись Gmail
SPF-запись: список IP-адресов, которым разрешено отправлять почту от имени gmail.com

В записи перечислены IP-адреса. Если IP, с которого пришло письмо, присутствует в этом списке — письмо принимается. Если нет — отклоняется или помечается как спам.

DMARC: что делать, если проверка не пройдена

DMARC — это не метод аутентификации, а политика, которая определяет, что делать, если DKIM или SPF не прошли проверку.

Проверка выполняется на сервере-получателе по тому же принципу: запрашивается DNS-запись DMARC домена отправителя, и на основе политики письмо либо отклоняется, либо помечается как спам.

Финальный этап: доставка

Если все проверки пройдены, сервер Yahoo Mail сохраняет письмо в хранилище — будь то файловая система или распределённое хранилище. Письмо попадает во входящие Кевина.

Как мы видим письма?

Закономерный вопрос: как мы видим письма, которые хранятся на почтовом сервере? Для этого используются два других протокола:

  • IMAP — синхронизация почтового ящика (письма остаются на сервере)
  • POP3 — загрузка писем на устройство

Эти протоколы — тема для отдельной статьи.

Частые вопросы
1
Можно ли отправить письмо через telnet?

Технически да — именно это мы показали в разделе про SMTP. Однако современные серверы требуют шифрование (TLS) и аутентификацию, поэтому отправить письмо «от чужого имени» через голый telnet на порт 25 уже не получится. Для тестирования SMTP-команд можно использовать порт 587 с STARTTLS.

2
Зачем нужны и DKIM, и SPF одновременно?

DKIM проверяет целостность содержимого письма (не было ли оно изменено по пути), а SPF проверяет право IP-адреса отправлять почту от имени домена. Это два разных вектора атаки: SPF защищает от подмены отправителя, DKIM — от модификации письма в транзите. Вместе они дают более надёжную защиту, а DMARC определяет, что делать, если один из них «упал».

3
Почему письма иногда попадают в спам?

Причин может быть несколько: SPF-запись не включает IP сервера-отправителя, DKIM-подпись не совпадает, DMARC-политика настроена на «reject», содержимое письма содержит признаки спама, IP отправителя в чёрном списке, или домен слишком «молодой» и ещё не заработал репутацию.

4
Чем отличается IMAP от POP3?

POP3 загружает письма на устройство и обычно удаляет их с сервера — удобно для работы с одного устройства. IMAP синхронизирует папки и письма между сервером и всеми устройствами — стандарт для современной работы с почтой на телефоне, ноутбуке и десктопе одновременно.

Перевод и адаптация статьи «How Email Actually Works» из блога Sushant Dhiman. Читайте также: DNS для начинающих, как работает интернет.