Как на самом деле работает электронная почта: путь письма от отправителя к получателю
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, и письмо попадает во входящие Кевина.
Архитектурная диаграмма
Разбор по шагам
Теперь разберём каждый этап подробно. Стоит отметить, что описан наиболее распространённый сценарий работы почтовых серверов. У разных компаний реализация может отличаться, но базовая идея одна и та же.
SMTP: как письмо попадает на сервер
Simple Mail Transfer Protocol определяет, как письмо передаётся на почтовый сервер. Для передачи почты между серверами SMTP использует порт 25. Для отправки от клиента к серверу (submission) применяются порты 587 (STARTTLS) или 465 (implicit TLS). Подключиться к серверу можно через утилиту telnet. Вот что вы увидите при подключении к серверу Gmail:
После подключения мы можем отправлять серверу команды:
HELO / EHLO
Команда для приветствия — вы представляетесь почтовому серверу. В ответ сервер отправляет приветствие:
MAIL FROM
Сообщает серверу, кто отправляет письмо. Сервер отвечает 250 2.1.0 OK:
RCPT TO
Указывает, кому адресовано письмо. Сервер снова отвечает OK:
DATA
Сервер сообщает клиенту, что можно начинать передачу тела письма:
Затем отправляются данные самого письма:
Точка (.) на отдельной строке означает «конец сообщения». Сервер отвечает подтверждением (Accepted):
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:
Аутентификация
Мы только что поставили письмо в очередь на почтовом сервере — и для этого не потребовалось никакой аутентификации. Так как же работает проверка подлинности? Здесь в игру вступают DKIM и SPF.
DKIM: цифровая подпись письма
DKIM — это механизм аутентификации на основе пары открытого и закрытого ключей. Отправляющий сервер подписывает письмо, а принимающий — проверяет подпись. В нашем случае отправитель — сервер Gmail, получатель — сервер Yahoo.
- Письмо поступает на Gmail через SMTP
- Gmail сохраняет его
- Gmail вычисляет хеш заголовков и тела письма, подписывает его закрытым ключом и добавляет заголовок DKIM-Signature
- Когда письмо доставляется на сервер-получатель, тот расшифровывает подпись открытым ключом, вычисляет хеш самостоятельно и сравнивает результаты
- Если проверка не пройдена — письмо не доставляется
Вот как выглядит заголовок DKIM-Signature:
Но откуда получатель знает открытый ключ отправителя?
Снова на помощь приходят DNS-записи. Домен отправителя (gmail.com в нашем примере) публикует DNS-запись с открытым ключом и селектором. Селектор нужен для выбора нужного ключа, если у сервера их несколько.
Вот как выглядит 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, которая выглядит так:
В записи перечислены IP-адреса. Если IP, с которого пришло письмо, присутствует в этом списке — письмо принимается. Если нет — отклоняется или помечается как спам.
DMARC: что делать, если проверка не пройдена
DMARC — это не метод аутентификации, а политика, которая определяет, что делать, если DKIM или SPF не прошли проверку.
Проверка выполняется на сервере-получателе по тому же принципу: запрашивается DNS-запись DMARC домена отправителя, и на основе политики письмо либо отклоняется, либо помечается как спам.
Финальный этап: доставка
Если все проверки пройдены, сервер Yahoo Mail сохраняет письмо в хранилище — будь то файловая система или распределённое хранилище. Письмо попадает во входящие Кевина.
Как мы видим письма?
Закономерный вопрос: как мы видим письма, которые хранятся на почтовом сервере? Для этого используются два других протокола:
- IMAP — синхронизация почтового ящика (письма остаются на сервере)
- POP3 — загрузка писем на устройство
Эти протоколы — тема для отдельной статьи.
Частые вопросы
Можно ли отправить письмо через telnet?
Технически да — именно это мы показали в разделе про SMTP. Однако современные серверы требуют шифрование (TLS) и аутентификацию, поэтому отправить письмо «от чужого имени» через голый telnet на порт 25 уже не получится. Для тестирования SMTP-команд можно использовать порт 587 с STARTTLS.
Зачем нужны и DKIM, и SPF одновременно?
DKIM проверяет целостность содержимого письма (не было ли оно изменено по пути), а SPF проверяет право IP-адреса отправлять почту от имени домена. Это два разных вектора атаки: SPF защищает от подмены отправителя, DKIM — от модификации письма в транзите. Вместе они дают более надёжную защиту, а DMARC определяет, что делать, если один из них «упал».
Почему письма иногда попадают в спам?
Причин может быть несколько: SPF-запись не включает IP сервера-отправителя, DKIM-подпись не совпадает, DMARC-политика настроена на «reject», содержимое письма содержит признаки спама, IP отправителя в чёрном списке, или домен слишком «молодой» и ещё не заработал репутацию.
Чем отличается IMAP от POP3?
POP3 загружает письма на устройство и обычно удаляет их с сервера — удобно для работы с одного устройства. IMAP синхронизирует папки и письма между сервером и всеми устройствами — стандарт для современной работы с почтой на телефоне, ноутбуке и десктопе одновременно.
Перевод и адаптация статьи «How Email Actually Works» из блога Sushant Dhiman. Читайте также: DNS для начинающих, как работает интернет.