SMTP — простой протокол электронной почты и его расширения
В Интернете для доставки электронной почты машина-источник устанавливает TCP-соединение с портом 25 машины-приемника. Этот порт прослушивается почтовым демоном и их общение происходит с помощью протокола SMTP (Simple Mail Transfer Protocol — простой протокол передачи электронной почты). Этот сервер принимает входящие соединения, проверяет их безопасность и принимает сообщения для доставки. Если письмо невозможно доставить, отправителю возвращается сообщение об ошибке, содержащее первую часть этого письма.
Протокол SMTP представляет собой простой ASCII-протокол. Это не недостаток, а отличительная черта. Использование текста в формате ASCII позволяет легко модифицировать, тестировать и исправлять ошибки в протоколах. Они могут тестироваться отсылкой команд вручную, при этом записи сообщений легко читать. Сейчас так работает большинство интернет-протоколов прикладного уровня (например, HTTP).
Мы поговорим о простой передаче сообщений между почтовыми серверами, их доставляющими. Установив TCP-соединение с портом 25, передающая машина, выступающая в роли клиента, ждет запроса принимающей машины, работающей в режиме сервера. Сервер начинает диалог с того, что посылает текстовую строку, содержащую его идентификатор и сообщающую о его готовности (или неготовности) к приему почты. Если сервер не готов, клиент разрывает соединение и повторяет попытку позднее.
Если сервер готов принимать почту, клиент объявляет, от кого поступила почта и кому она предназначается. Если получатель почты существует, сервер дает клиенту добро на пересылку сообщения. Затем клиент посылает сообщение, а сервер подтверждает его получение. Контрольные суммы не проверяются, так как транспортный
протокол TCP обеспечивает надежный байтовый поток. Если у отправителя есть еще почта, она также отправляется. После передачи всей почты в обоих направлениях соединение разрывается. Пример диалога клиента и сервера при передаче сообщения из листинга 7.2 показан в листинге 7.3. Строки, посланные клиентом (то есть отправителем), помечены буквой C:, а посланные сервером (то есть получателем) — S:.
Сначала клиент, естественно, посылает приветствие серверу. Таким образом, первая команда клиента выглядит как HELO, что представляет собой наиболее удачный из двух вариантов сокращения слова HELLO до четырех символов. Зачем все эти команды было нужно сокращать до четырех букв, сейчас уже никто не помнит.
В нашем примере сообщение должно быть послано только одному получателю, поэтому используется только одна команда RCPT (сокращение от слова recipient — получатель). Использование этой команды несколько раз позволяет посылать одно сообщение нескольким получателям. Каждое из них подтверждается или отвергается индивидуально. Несмотря на то что попытки пересылки сообщения некоторым получателям оказываются неудачными (например, из-за отсутствия адресатов), это сообщение все равно может быть доставлено остальным адресатам, числящимся в списке рассылки.
Наконец, хотя синтаксис четырехсимвольных команд строго определен, синтаксис ответов не столь строг. Правила определяют только числовой код в начале строки. Все, что следует за этим кодом, может считаться комментарием и зависит от конкретной реализации протокола.
Базовый протокол SMTP работает хорошо, но он ограничен в некоторых отношениях. Он не включает аутентификацию. Это значит, что команда FROM в примере может выдать любой адрес отправителя, который ей понравится. Это крайне удобно для отсылки спама. Другое ограничение заключается в том, что SMTP передает сообщения ASCII, а не бинарные данные. Именно для этого была нужна кодировка base64 для передачи контента MIME. Однако с этой кодировкой при передаче почты недостаточно используется пропускная способность, что неприятно, если отправляется объемное сообщение. Третье ограничение заключается в том, что SMTP отсылает непосредственно сообщение. Оно не шифруется и никак не защищено.
Чтобы справиться с этими и многими другими проблемами, связанными с передачей сообщений, к SMTP было добавлено расширение. Оно является обязательной частью стандарта RFC 5321. Использование SMTP с расширениями называется ESMTP (Extended SMTP — расширенный SMTP).
Листинг 7.3. Передача сообщения от [email protected] для [email protected]
Клиенты, желающие использовать расширенную версию, в начале высылают EHLO вместо HELO. Если этот вариант отвергается, сервер работает с обычным SMTP, а пользователь должен идти по стандартному пути. Если EHLO принимается, сервер отвечает, какие расширения он поддерживает. После этого клиент может использовать любое из перечисленных расширений. Несколько стандартных расширений показаны в табл. 7.7. В ней даны ключевые слова, в том виде, в котором они используются в механизме расширения, и описание новой функциональности. Более подробно рассматривать расширения мы не будем.
Таблица 7.7. Некоторые расширения SMTP
Чтобы лучше понять, как работает SMTP и другие рассмотренные в этой главе протоколы, попробуйте сами поработать с ними. В любом случае, для начала найдите машину, подключенную к Интернету. В системе UNIX (или Linux) наберите в командной строке: telnet mail.isp.com 25
подставив вместо mail.isp.com DNS-имя почтового сервера провайдера. В системе Windows XP щелкните на кнопке Пуск, затем на кнопке Выполнить и наберите команду в диалоговом окне. На компьютерах с Vista или Windows 7 вам, возможно, сначала придется инсталлировать программу telnet (или ее эквивалент) и запустить ее. В результате выполнения этой команды будет установлено telnet-соединение (то есть соединение TCP) с портом 25 данной машины. Как было показано в табл. 6.4, порт 25 является SMTP-портом (см. табл. 6.4 с портами для других стандартных протоколов). В ответ на введенную команду вы получите что-то вроде этого:
Trying 192.30.200.66™
Connected to mail.isp.com Escape character is ‘Л]'.
220 mail.isp.com Smail #74 ready at Thu, 25 Sept 2002 13:26 +0200
Первые три строки посылаются telnet и поясняют для вас происходящее. Последняя строка посылается сервером SMTP удаленной машины и сообщает о готовности к общению с вашей машиной и приему почты. Чтобы узнать о доступных командах, наберите HELP
Начиная с этого момента, возможен обмен последовательностями команд, показанными в листинге 7.3, если сервер готов принимать от вас почтовые сообщения.
Подача почтовых сообщений
Первоначально пользовательские агенты запускались на том же компьютере, что и агенты передачи сообщений, пересылающие почту. При таком варианте все, что необходимо для отсылки сообщения, — возможность пользовательского агента связаться с локальным почтовым сервером, используя только что описанный диалог. Однако этот вариант уже не так широко распространен.
Пользовательские агенты часто работают на ноутбуках, домашних компьютерах и мобильных телефонах, а они не всегда подключены к Интернету. Агенты передачи сообщений работают на серверах провайдеров и крупных компаний, которые постоянно подключены к Интернету. Это различие означает, что пользовательскому агенту может понадобиться обратиться из Бостона к его обычному почтовому серверу в Сиэтле, чтобы послать почтовое сообщение, если пользователь отправился в путешествие.
Эта удаленная коммуникация не вызывает проблемы сама по себе. Именно для подобных случаев был разработан протокол TCP/IP. Однако провайдер или компания обычно без энтузиазма относятся к тому, что у удаленного пользователя будет возможность подавать сообщения на их почтовый сервер для доставки в какое-то иное место. Такой сервер не является общественным. Кроме того, этот вид открытой почтовой станции (open mail relay) привлекает спамеров. Это происходит из-за наличия возможности скрыть настоящего отправителя и таким образом затруднить идентификацию сообщения как спама.