Почтовое отделение интернета
SMTP, Simple Mail Transfer Protocol, отвечает за одну задачу: доставить письмо от отправителя к серверу получателя. Он ничего не делает с чтением: за это отвечают IMAP и POP3, которым посвящены отдельные страницы. Аналогия с почтовым отделением почти дословная: SMTP забирает конверт у автора и передаёт из рук в руки между промежуточными узлами, пока он не окажется в ящике адресата.
Протокол текстовый и очень старый, его основа появилась в начале 1980-х. Из-за этого он изначально не содержал никакой проверки отправителя, и весь современный слой защиты от подделок добавлялся позднее, поверх него.
Путь письма от кнопки «Отправить» до ящика
Почтовая программа передаёт сообщение вашему исходящему серверу, обычно с аутентификацией. Тот выясняет, куда доставлять, запрашивая в DNS запись MX домена получателя: она перечисляет почтовые серверы с приоритетами. Затем сервер устанавливает соединение с самым приоритетным из них и передаёт письмо. Если сервер недоступен, письмо ставится в очередь и отправка повторяется несколько раз, пока не истечёт срок ожидания, после чего автору возвращается уведомление о недоставке.
Внутри сеанса стороны обмениваются короткими командами: приветствие EHLO, адрес отправителя MAIL FROM, адрес получателя RCPT TO и собственно данные DATA. Ответы сервера — трёхзначные коды: 250 означает успех, 4xx временную ошибку, при которой стоит повторить, 5xx постоянный отказ.
Когда сообщение не может быть доставлено сразу, различают временные отказы 4xx и постоянные 5xx. Первые часто относятся к серым спискам: сервер получателя просит повторить попытку позже, чтобы отсечь спамеров, не умеющих ставить письма в очередь. Вторые означают, что адреса не существует, ящик переполнен или письмо отклонено правилами получателя.
Порты 25, 465 и 587
Порт 25 традиционно используется для передачи почты между серверами. Порт 587 предназначен для отправки письма клиентом на свой сервер: обычно с обязательной аутентификацией и шифрованием, включаемым командой STARTTLS. Порт 465 применяется для варианта, где TLS включён сразу с первого байта.
Многие провайдеры и хостинги ограничивают исходящие подключения на порт 25 с домашних и облачных адресов, чтобы затруднить рассылку спама с заражённых устройств. Поэтому просто запустить почтовый сервер дома обычно не получится: помимо самого порта, приёмная сторона сомневается в репутации незнакомого адреса, и письма уходят в спам.
Ещё одна причина недоставки — отсутствие обратной DNS-записи, то есть PTR: получающие серверы часто сверяют, соответствует ли имя хоста адресу отправителя. Без неё, а также при отправке с динамических домашних адресов письма нередко отклоняются на первом рукопожатии, и в журнале видны коды 5xx с пояснением о репутации.
SPF, DKIM и DMARC: как защищают от подделки отправителя
Так как исходный SMTP не проверяет поле «От», подделать адрес было тривиально. Проблему решают три механизма, записываемые в DNS. SPF перечисляет серверы, которым домен разрешает отправлять от своего имени. DKIM добавляет к письму цифровую подпись, ключ проверки которой опубликован в DNS. DMARC указывает получателю, как поступить с письмом, не прошедшим проверки, и куда отправлять отчёты.
Все три записи хранятся как TXT-записи, о формате которых написано на странице про запись TXT. Крупные почтовые сервисы всё строже относятся к домену без этих настроек: сообщения от него легко попадают в спам или отклоняются.
Заблуждения и проверка вручную
Часто полагают, что если письмо дошло, то оно защищено. Шифрование между серверами бывает оппортунистическим: если удалённая сторона поддерживает STARTTLS, канал шифруется, если нет, письмо иногда уходит открыто, а само содержимое лежит на серверах в читаемом виде, если не применяется сквозное шифрование. Вторая ошибка — считать, что SMTP нужен и для чтения почты. Получение писем — задача других протоколов.
Увидеть заголовки уже полученного письма можно в почтовом клиенте через пункт «Показать исходный текст»: цепочки Received показывают, через какие серверы оно прошло, а строки Authentication-Results сообщают о результате SPF, DKIM и DMARC. В терминале записи MX домена покажет утилита dig или nslookup.