Отправка и прием сообщения
Важной задачей электронной почты является непосредственно отправка сообщений от одного компьютера к другому. Для решения данной задачи используется протокол SMTP (Simple Mail Transfer Protocol) являющийся протоколом прикладного уровня, Данный протокол работает поверх протокола ТСР и использует для отправки почты. Протокол SMTP разработан на основе следующей модели взаимодействия: по запросу пользователя отправитель SMTP устанавливает двусторонний канал с получателем SMTP. Команды SMTP генерируются отправителем и отправляются получателю SMTP, который, в свою очередь, отправляет ответы обработки полученных команд отправителю SMTP.
Протокол SMTP поддерживает достоверную и надежную доставку сообщений между произвольными узлами сети Internet. Это протокол прикладного уровня. Над модулем SMTP располагается почтовая служба организаций. Протокол независим от транспортной подсистемы. Для работы необходим только транспортный канал передачи потока данных. Он может работать по любому транспортному каналу, удовлетворяющему требованиям передачи данных SMTP через различные сети или группы сетей, например, TCP, X.25.
Протокол SMTP может передавать не только текстовые сообщения, но и двоичную информацию, такую как рисунки, исполняемые файлы и др. Двоичные данные перед отправкой форматируются и, как правило, кодируются 7-битными комбинациями вид. Современные расширения протокола SMTP – ESMTP позволяют передавать данные в 8-битном виде. Форматирование и кодирование разнородной информации производится программным обеспечением оболочки электронной почты.
Схема работы протокола показана на рис.7.1. Простейший алгоритм работы протокола выглядит следующим образом:
- После установления канала SMTP-соединения по любому из транспортных протоколов (как, правило, SMTP используется совместно с протоколом ТСР) отправитель SMTP посылает команду MAIL, идентифицирующую атрибуты отправителя почты, например его адрес. Если получатель SMTP может принять почтовое сообщение, он отправляет в ответ команду ОК.
- Отправитель SMTP выдает команду RCPT, идентифицирующую атрибуты получателя почты, например, адрес почтового ящика. Если получатель SMTP готов принять почту в данный почтовый ящик, он отвечает командой ОК, если нет, он отвечает отказом принять почту в указанный почтовый ящик. Если отправитель указал несколько почтовых ящиков, в которые следует поместить сообщение, то получатель SMTP может отказать части из них при этом транзакция соединения не заканчивается.
- Отправитель SMTP отправляет данные получателю SMTP. Если получатель успешно принял все данные, он выдает команду ОК.
Транзакция SMTP отправки почты состоит из трех шагов. Начало транзакции задает команда MAIL, идентифицирующая отправителя, затем следует серия команд RCPT, определяющих почтовые ящики получателей, затем подается команда DATA для передачи текста сообщения. Завершает транзакцию передачи данных команда закрытия транзакции QUIT.
Чтобы лучше понять работу протокола SMTP рассмотрим простой пример. Отправителем почты является хост cs.prinston.edu, а получателем хост cisco.com. В нашем случае отправитель Боб из cs.prinston.edu пытается отправить почтовое сообщение пользователям Алисе и Тому на cisco.com. Строка отправителя начинается с буквы R (receive), а получателя с буквы S (send).
R 220 cisco.com Simple Mail Transfer Service Ready // код ответа 220 (соединение установлено), сервер cisco.com, протокол SMTP
S HELO cs.prinston.edu // Соединение установлено, "Я cs.prinston.edu ", идентификация производится по cs.prinston.edu
R 250 cisco.com // команда принята и обработана, идентификация прошла
S MAIL FROM: <Bob@cs.prinston.edu > // Начало почтовой транзакции, обратный адрес Bob@cs.prinston.edu.
R 250 OK // Сервер согласен принять сообщение от Bob@cs.prinston.edu
S RCPT TO:<Alice@cisco.com > // Кому отправить письмо, Alice@cisco.com
R 250 OK // Сервер согласен принять сообщение для Alice@cisco.com
S RCPT TO:<Tom@cisco.com > // Еще кому отправить письмо, Tom@cisco.com
R 550 No such user here // Сервер выдает ошибку 550, сообщая, что такого пользователя нет
S DATA // Запрос на передачу данных
R 354 Start mail input; end with <CRLF>.<CRLF> // Разрешение передачи данных, последняя строка должна содержать "точку"
S From: < Bob@cs.prinston.edu > //Текст сообщения (включая заголовок)...
S To: < Alice@cisco.com >
S Subject: С новым годом!
S Mime-Version: 1.0
S X-Mailer: mPOP Web-Mail 2.19
S Date: Fri, 19 Sep 2003 08:37:43 +0400
S Reply-To: < Alice@cisco.com >
S Content-Type: text/plain; charset=koi8-r
S Content-Transfer-Encoding: 8bit
S
S Текст сообщения
S . // Конец сообщения, клиент послал точку
R 250 OK // Сервер получил данные
S QUIT // Клиент делает запрос на закрытие соединения
R 221 cisco.com Service closing transmission channel // Сервер закрывает соединение
Как видно из приведенного примера, работа протокола SMTP представляет собой отправку клиентом последовательности команд, обработку этих команд сервером и отправку клиенту ответа на каждую принятую команду. Каждый ответ содержит трехзначное число, которое указывает на успешность выполнения команды клиента. Сервер также возвращает текстовую строку, которая поясняет код ответа.
Следующим этапом является прием (чтение) принятых сообщений из почтового ящика. Для этого используется протокол POP (Post Office Protocol) - протокол доставки почты пользователю из почтового ящика своего сервера РОР. Когда почта пришла на сервер (по SMTP), она раскладывается по почтовым ящикам. Чтобы забрать почту из ящика нужен протокол POP. Пользователь может получить доступ к РОР-серверу из любой точки доступа к Интернет. Данный протокол работает поверх протокола ТСР.
В протоколе РОРЗ оговорены три стадии процесса получения почты:
- авторизация
- транзакция
- обновление (завершение транзакции)
После того как сервер и клиент РОРЗ установили соединение, начинается стадия авторизации. На стадии авторизации клиент идентифицирует себя для сервера. Если авторизация прошла успешно, сервер открывает почтовый ящик клиента и начинается стадия транзакции. В ней клиент либо запрашивает у сервера информацию (например, список почтовых сообщений), либо просит его совершить определенное действие (например, выдать почтовое сообщение). Наконец, на стадии обновления сеанс связи заканчивается.
Ответ сервера может иметь два значения:
+OK - положительный ответ
-ERR - отрицательный