Адреса конверта и заголовков
Практикум разбирает базовый SMTP по полному RFC 5321 от октября 2008 года. Клиент передаёт письмо, сервер принимает этот обмен; relay затем сам становится клиентом. TLS, AUTH, MIME, SMTPUTF8 и настройки конкретного продукта требуют своих источников.
Объект SMTP состоит из конверта и содержимого. Адреса MAIL FROM и RCPT TO не обязаны совпадать с адресами заголовков From, To или Cc; промежуточный SMTP-сервер не должен выводить конечный маршрут из заголовков письма.
SMTP должен сохранять регистр локальной части адреса: принимающий домен может различать smith и Smith, хотя такое устройство ящиков не рекомендуется. Доменная часть регистронезависима; для специального имени Postmaster действует отдельное регистронезависимое правило.
Один MAIL, несколько RCPT и отмена
До DATA сервер хранит ещё незавершённую транзакцию. Ответы отдельных RCPT нужно читать по адресатам, а сброс отличать от команды, которая только проверяет отклик сервера.
MAIL начинает новую почтовую транзакцию, очищает буферы прежнего обратного пути, получателей и данных и записывает новый обратный путь. Клиент не должен посылать MAIL, пока предыдущая транзакция ещё открыта.
Каждый RCPT TO задаёт одного получателя. Успешный RCPT добавляет его в буфер адресатов; отказ одному адресату сам по себе не отменяет уже принятых других. В примере RFC после одного 550 передача продолжается для двух получателей с ответом 250.
RSET отменяет текущую транзакцию: сервер должен удалить сохранённые сведения об отправителе, получателях и данных, ответить 250 и оставить соединение открытым. NOOP лишь запрашивает ответ 250 и не очищает эти буферы.
Принятие адресата и обратное уведомление
Положительный RCPT фиксирует этап приёма адресата. Поздняя ошибка доставки обрабатывается отдельно. Здесь рассматривается обычная почта; специальные решения о враждебных сообщениях не превращаются в правило для любого письма.
Некоторые SMTP-серверы откладывают проверку адресатов до получения содержимого; relay может не иметь доступа к конечной системе. Поэтому положительный ответ RCPT не доказывает окончательную доставку или полную проверку ящика в реальном времени.
При обычной ошибке доставки уже принятого письма уведомление направляют на обратный адрес его конверта, а само уведомление отправляют с пустым обратным путём MAIL FROM. Если исходный обратный путь пуст, сообщение о недоставке отправлять запрещено.
Клиент SMTP не должен передавать содержимое DATA до ответа 354. Этот ответ промежуточный: он разрешает передачу данных, а итог обработки сервер сообщает после признака конца данных.
Точка в тексте и граница DATA
Строки данных начинаются после 354. Дополнительная точка защищает строку содержимого от смешения с концом письма; приёмник снимает её по отдельному правилу.
В DATA конец письма обозначается строкой с единственной точкой: CRLF, точка, CRLF. Первый CRLF уже завершает последнюю строку содержимого; лишний CRLF добавлять нельзя. Последовательность LF, точка, LF без CR не является допустимой заменой.
Перед отправкой строки DATA, начинающейся с точки, клиент добавляет ещё одну точку в начало. Сервер распознаёт одиночную точку как конец DATA, а у иной строки с точкой в начале удаляет первую точку.
Один итог DATA и последующие доставки
Число в ответе определяет переход протокола. Успех целого SMTP-приёма может предшествовать нескольким дальнейшим доставкам и их отдельным результатам.
Положительный итоговый ответ после конца DATA означает, что сервер принял ответственность за доставку или дальнейшую передачу письма. Это не подтверждение чтения адресатом и не требование уже завершить все следующие SMTP-переходы.
После итогового 4xx или 5xx на конец DATA сервер не должен позднее доставлять эту отклонённую копию. Ответственность остаётся у клиента: временная ошибка допускает возврат или очередь; после постоянной ошибки повтор тому же серверу без разбора пользователем и вмешательства не рекомендуется.
Если после приёма нескольких адресатов и данных сервер успешно доставил письмо части адресатов, но не всем, итог DATA должен быть положительным. Для неудачных доставок сервер формирует уведомление; один общий отказ DATA не описывает такой частичный результат.
В общем случае SMTP-клиент выбирает действие по числовому коду ответа, а не по свободному поясняющему тексту. Для неизвестного кода допустимого диапазона он должен интерпретировать первую цифру: 2 — завершение, 3 — промежуточный ответ, 4 — временный отказ, 5 — постоянный.
Разные таймеры одного письма
Минимальное рекомендуемое ожидание ответа — не обещанная задержка доставки. Таймер команды, передача блока и длительность всей очереди требуют разных настроек.
SMTP-клиент должен иметь отдельные таймауты команд, а не один таймер всей почтовой транзакции. Для передачи данных таймер устанавливают также на каждый передаваемый блок; перенастройка таймаутов без перекомпиляции рекомендуется.
RFC рекомендует минимальные ожидания: 5 минут для начального 220, MAIL и RCPT; 2 минуты для 354 на DATA; 3 минуты для завершения отправки каждого блока; 10 минут для итогового ответа на конец DATA. Серверу рекомендуется ждать следующую команду не менее 5 минут.
Очередь и неопределённый итог
Оборвавшийся канал показывает, что увидел клиент, но не раскрывает последнюю запись на другой стороне. Повтор решает задачу надёжности ценой возможного дубля.
Неподконтрольный клиенту обрыв связи рекомендуется обрабатывать как временную ошибку 451. Если обрыв или преждевременный таймаут произошёл в ожидании итогового ответа на конец DATA, повтор может дать дубликат: сервер мог уже принять письмо.
Письмо, которое не удалось передать сразу, отправитель должен поставить в очередь и периодически повторять передачу. Запись очереди включает само письмо и сведения конверта.
После неудачной попытки к той же цели отправитель должен выдержать паузу. Обычно рекомендуется интервал не менее 30 минут; более сложные стратегии допускаются. До отказа от доставки обычно нужно не менее 4–5 дней, а параметры алгоритма повторов должны настраиваться.
Что переносить на следующую попытку
Не всякая запись журнала пригодна для кэша решений. Завершённая транзакция также имеет более устойчивый результат, чем последующее закрытие транспортного соединения.
SMTP-клиент не должен кэшировать ответы 5xx на команду MAIL. Недоступность узла и отрицательный ответ конкретной почтовой транзакции нельзя считать взаимозаменяемыми основаниями для пропуска новых попыток.
При преждевременном закрытии соединения SMTP-сервер должен отменить ожидающую транзакцию, но не отменять уже завершённые. QUIT завершает соединение и прерывает ещё незаконченную транзакцию; подтверждённую передачу он не отзывает.
MX, адреса узла и ошибка DNS
Список адресов одной выбранной цели и набор разных MX обрабатываются на разных шагах. Неисправность явного маршрута не создаёт разрешения обойти его адресом самого домена.
SMTP-клиент должен уметь пробовать и повторно пробовать подходящие альтернативные адреса до успешной попытки. Допускается настраиваемый предел числа проверяемых адресов; в любом случае рекомендуется попробовать как минимум два.
Когда выбранное имя SMTP-узла имеет несколько IP-адресов, resolver возвращает упорядоченный список альтернатив. Отправитель SMTP должен пробовать их в предоставленном порядке.
При временной ошибке DNS во время выбора почтовой цели сообщение должно остаться в очереди для повторной попытки. Ответ о несуществующем домене должен обрабатываться как ошибка; он не равен пустому успешному списку MX.
Если MX домена существуют, SMTP не должен использовать A или AAAA самого домена в обход этих MX. Когда все найденные MX непригодны, требуется сообщить об ошибке; правило неявного MX действует только при отсутствии MX.
Сам relay среди MX и следующий обмен
Перед дальнейшей пересылкой relay проверяет, не возвращает ли выбранный путь письмо к нему. Даже успешный первый приём не подменяет отдельную работу этого relay по следующему переходу.
Relay, пересылающий письмо без изменения адресата, должен найти в списке MX собственные имена или адреса. Обнаружив себя, он исключает все MX с тем же числом предпочтения и с большими числами.
Если после исключения собственного уровня MX и менее предпочтительных уровней у relay не осталось кандидатов, возникает ошибка и письмо должно быть возвращено как недоставляемое. Если кандидаты остались, их рекомендуется пробовать начиная с наиболее предпочтительных.
Приняв задачу дальнейшей передачи, relay сам становится SMTP-клиентом и открывает следующий обмен с выбранным сервером. Успех первого обмена не означает, что следующий уже состоялся: в примере RFC резервный MX принимает письмо и затем отдельно передаёт его основной цели.
Проверьте инженерное мышление
Вопросы проверяют не память на аббревиатуры, а умение не делать лишних выводов.
Следующий шаг
Сформулируйте задачу, затем уточните требования перед выбором оборудования.
Подготовить подбор с ДелектусомОткроется черновик вопроса. Отправьте его, когда будете готовы.
Источники курса
Ссылки приведены один раз для всего курса, чтобы не мешать чтению каждого тезиса.
- Первичная спецификация
Simple Mail Transfer Protocol
Internet Engineering Task Force · RFC 5321, October 2008
Полная локальная копия RFC 5321, октябрь 2008: прочитаны все 95 страниц, включая приложения A–F, 09.09.2026. Сверены конверт, DATA, ответственность, повторы и выбор MX. retrieved_on сохраняет дату офлайн-очереди. Позднейшие errata, расширения и реализации не проверялись.
Открыть первоисточник