Протокол SMTP что такое и для чего он нужен

SMTP (Simple Mail Transfer Protocol) — простой протокол передачи почты. Протокол SMTP был создан в 1982 году, а расширенная версия SMTP (ESMTP, Extended SMTP) вышла в 2008 году и используется сейчас. 

Архитектура электронной почты

Протокол SMTP используется при передаче электронной почты, возможны два варианта использования:

Архитектура электронной почты

При передачи почты от агента пользователя почтовому серверу и при передачи писем между почтовыми серверами используется протокол SMTP. Для чтения почты используется протоколы POP3 и IMAP. 

Место протокола SMTP в стеке TCP/IP

В стеке протоколов TCP/IP протокол SMTP находится на прикладном уровне

Протокол smtp в стеке TCP IP

Теоретически SMTP может работать с любыми протоколами транспортного уровня, TCP, UDP или с другими возможными протоколами. За SMTP стандартами закреплено два номера порта:

  • Порт 25 для передачи почты между почтовыми серверами;
  • Порт 587 для передачи почты от почтового клиента на сервер. 

На практике, почти всегда используется один транспортный протокол TCP и порт 25.

Формат электронного письма

Электронное письмо состоит из трех частей, это конверт, заголовок и тело письма. Команды протокола SMTP находятся только в конверте, именно конверт используется при передачи почты между серверами и почтовыми клиентами и данные в конверты определяются, как почта будет передаваться. 

Заголовки и тело письма формально не являются частью протокола SMTP, они задаются в отдельном документе RFC2822. Так как заголовки используются при передаче писем, мы их рассмотрим. 

Протокол SMTP, также как и протокол HTTP работает в текстовом режиме, это означает, что нет специального формата пакета, клиент и сервер взаимодействуют друг с другом в режиме запрос-ответ передавая друг другу обычные текстовые строки.  

Команды SMTP

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

команды smtp

  • Команда HELO используется для установки соединения, при этом клиент должен указать свой домен и свой почтовый адрес (пример в таблице).
  • Команда MAIL используется для того, чтобы задать адрес отправителя. Полный формат команды в примере MAIL FROM и адрес отправителя. 
  • Команда RCPT используется для задания адреса получателя. Одно и то же письмо можно передать нескольким получателям для этого нужно использовать команду RCPT несколько раз. 
  • Команда DATA используется, чтобы сообщить принимающему серверу, что конверт закончился и дальше пойдет письмо. 
  • Команда QUIT служит для разрыва соединения с сервером, после того, как передача письма закончена. 

Ответы SMTP

Также как и протокол HTTP, SMTP использует ответы состоящие из двух частей:

  • код сообщения, который говорит о том, что произошло;
  • текстовое сообщение поясняющее, что именно произошло и больше предназначенное для людей, чем для серверов.

Ответы smtp

Коды сообщений которые начинаются на 2, говорят о том, что предыдущая команда выполнена успешно. Код сообщения который начинается на 3, говорит о том, что текущее состояние успешное, но для продолжения работы требуются дополнительные данные. Например ответ с кодом 354 (End data with <CR><LF>.<CR><LF>) выдается после того, как клиент ввел команду DATA. Сервер приглашает клиента вводить письмо и закончить письмо строкой, где находится одна точка. 

Сообщения, которые начинаются на 5, говорят о том, что произошла какая-то ошибка, например код сообщения 502 означает использование не реализованной команды, а 503 неправильную последовательность команд. Так как текст сообщений, которые должны быть в ответе не входят в стандарт, а для автоматической обработки используются только коды, то некоторые реализации серверов используют различные, смешные сообщения в ответах, например, есть почтовые серверы, которые в ответ на команду QUIT, предназначенную для разрыва соединения, выдают сообщения  221 2.0.0 So long, and thanks for all the fish

Заголовки письма

Заголовки письма формально не являются частью стандарта SMTP. 

заголовки письма в smtp

  • Заголовок from используется для указания отправителя. В отличии от команды mail from протокола SMTP, в заголовке письма from можно указывать не только почтовый адрес, но и имя отправителя. 
  • Заголовок To используется для указания получателя;
  • CC для указания копий письма;
  • BCC указывает такого получателя, кому нужно отправить копию, но при этом скрыть от других получателей, что копия письма была ему отправлена;
  • Заголовок Reply-To используется, чтобы указать адрес на который нужно отвечать, этот адрес может отличаться от того адреса, который указан в заголовке from. 
  • Subject используется для указания темы письма;
  • Date для указания даты отправки письма. 

Пример сеанса SMTP

Рассмотрим пример сеанса SMTP, который используется для отправки письма. 

Пример сеанса smtp

Подключаемся к почтовому серверу по адресу 220 smtp.example.ru ESMTP Postfix на 25 порт. Выдаем команду HELO в которой указываем свой домен. Сервер отвечает сообщением со статусом 250 это означает, что соединение установлено и в текстовом сообщении сервер еще раз пишет свое доменное имя.

Выдаем команду MAIL FROM для указания адреса отправителя. Сервер отвечает сообщением со статусом 250, текстовая часть сообщения ok, команда выполнена успешно.

Затем задаем адрес получателя письма с помощью команды RCPT TO. Сервер снова отвечает сообщением 250 ok и мы выдаем команду DATA для ввода письма. Ответ сервера 354 приглашение вводить текст письма, которое должно закончиться отдельной строкой содержащей одну точку. 

Само письмо состоит из двух частей, заголовок и тело сообщения.  

Пример сеанса smtp

Тело сообщения должно быть отделено от заголовка пустой строкой. Используем заголовок FROM адрес отправителя, причем указываем не только почтовый адрес, но и имя. И заголовок subject, который используется для указания темы. Пустая строка, отделяет заголовки от тела сообщения.

Тело состоит из двух строк Hello, email world! и Hello, SMTP! Завершается письмо строкой в которой находится одна точка, эта строка не является частью письма и будет удалена при передаче. А если Вам нужна в строке точка, то вы должны указать две точки, одна из этих точек будет удалена при передаче. 

После того, как введена точка, сервер понимает, что письмо закончено и выдает сообщение со статусом 250 2.0.0 Ok: queued as 7FD9DC2E0060 сообщение поставлено в очередь для передачи. Выдаем команду QUIT, чтобы закончить сеанс связи. Сервер отвечает сообщением со статусом 221 пока. 

Расширение SMTP

В 2008 году появилось расширение SMTP — ESMTP. Там появились новые команды. Вместо команды HELO предлагается использовать команду EHLO — Extended HELO. Если мы хотим использовать расширенную версию SMTP, то при установки соединения вместо команды HELO мы должны указывать команду EHLO. 

Примеры других новых команд: 

  • Команда STARTTLS используется для того, чтобы начать зашифрованное соединение. 
  • SIZE может использоваться для того, чтобы узнать максимальный размер письма, который принимает почтовый сервер. 
  • DSN применяется, чтобы получить подтверждение о доставки письма. 

Другое важное изменение в расширенной версии протокола SMTP это возможность использования 8-битных наборов символов. В обычном SMTP можно использовать коды символов состоящие из 7 бит, это латинские буквы, цифры и другие символы из набора. Для того, чтобы передавать кириллицу необходимо было применять различные ухищрения. В расширенной версии SMTP ничего такого делать не надо, можно передавать кириллицу напрямую. 

Команда EHLO

Если мы хотим использовать расширенную версию протокола SMTP, то для установки соединения, мы должны использовать команду EHLO и после нее указывать домен отправителя, также, как и для обычной команды HELO. 

При получении этой команды, почтовый сервер понимает, что мы хотим использовать расширенную версию протокола SMTP и он выдает нам перечень команд расширенной версии, которые он поддерживает. 

Команда EHLO в smtp

Например сервер поддерживает шифрование с помощью операции STARTTLS. Он сразу указывает максимальный размер письма, которое принимает 250 SIZE 100000000. Можно получить подтверждение о доставке 250 DNS. И можно использовать другие команды, а также те команды, которые используются в обычном SMTP. 

Безопасность и спам

Протокол SMTP не содержит механизмов для защиты данных. Адреса, которые вы вводите в поля MAIL FROM в конверте и FROM в заголовке никак не проверяются. Во-первых значения этих полей могут отличаться друг от друга. Во-вторых можно использовать любой почтовый адрес, не обязательно ваш, в том числе другие люди, если знают ваш email адрес могут подставить его в эти поля и отправлять почту якобы от вашего имени. 

По умолчанию, протокол SMTP не использует шифрование и все письма, которые передаются через интернет могут быть прочитаны. В расширенной версии протокола SMTP появилась возможность использовать шифрование с помощью команды STARTTLS, но эту возможность мало кто использует. 

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

Например, когда клиент подключился к почтовому серверу, выдал команду HELO, указал свое доменное имя, почтовый сервер выполняет проверку соответствия этого доменного имени IP-адресу клиента. Для этого почтовый сервер выполняет реверсивный DNS запрос на IP-адрес с которого подключился клиент и сравнивает полученное доменное имя с тем, которое указал клиент в команде HELO. Если доменные имена отличаются, то в зависимости от настроек почтовый сервер может не принять сообщение. 

Многие почтовые серверы настроены так, чтобы принимать почту только для локальных пользователей, т.е. для тех, у которых есть почтовые ящики в том домене, который они обслуживают. Серверы, которые работают в другом режиме и позволяют передавать почту на любые email адреса в интернете называются открытые релеи. Спамеры с помощью специальных программ ищут открытые релеи в интернете и используют их с помощью массовой рассылки писем. Если почтовый сервер работает в режиме открытого релея, это серьезная недоработка администратора этого сервера. 

Также есть возможность проверки адреса отправителя с помощью цифровой подписи, для этого также используются взаимодействия с системой DNS. В DNS записях специального вида хранится открытый ключ электронной подписи для данного домена и этот открытый ключ можно использовать для проверки подлинности адреса отправителя. 

Заключение

Протокол SMTP — простой протокол передачи почты. Он используется для передачи почтовых сообщений от агента пользователя на почтовый сервер или для передачи почты между разными почтовыми серверами.

Ссылка на основную публикацию