Скачиваний:
62
Добавлен:
22.01.2014
Размер:
258.56 Кб
Скачать

7.2 Модель работы smtp

Протокол SMTPспроектирован на основе следующей модели взаимодейст­вия: по запросу пользователя отправительSMTP(sender —SMTP) устанав­ливает двусторонний канал с получателемSMTP(receiver —SMTP). Полу­чателемSMTPможет быть как хост назначения почтового сообщения, так и какой-либо промежуточный хост. КомандыSMTPгенерируются отправите­лем и отправляются получателюSMTP, который, .в свою очередь, отправля­ет ответы обработки полученных команд отправителюSMTP.

Схема работы SMTP-протоколаизображена на рис. 4.1.Простейший алго­ритм работы протокола выглядит следующим образом:

  1. После установления канала SMTP-соединенияпо любому из транспорт­ных протоколов отправительSMTPпосылает командуMAIL, идентифи­цирующую атрибуты отправителя почты, например, его адрес. Если по­лучательSMTPможет принять почтовое сообщение, он отправляет в ответ команду ОК.

  2. После этого отправитель SMTPотправляет командуRCPT, идентифици­рующую атрибуты получателя почты, например, адрес почтового ящика. Если получательSMTPготов принять почту в данный почтовый ящик, он отвечает командой ОК, если нет, он отвечает отказом принять почту в указанный почтовый ящик. Если отправитель указал несколько почтовых ящиков, в которые следует поместить сообщение, то получательSMTPможет отказать части из них, при этом транзакция соединения не закан­чивается.

  3. Отправитель SMTPотправляет данные получателюSMTP. Если получа­тель успешно принял все данные, он отправляет команду ОК.

Пользователь

Файловая система

Sender - SMTP

Receiver - SMTP

SMTP

команды, ответы и данные

Файловая система

Отправитель SMTPПолучательSMTP

Рис. 4.1.Схема работы SMTP – протокола.

SMTPподдерживает несколько механизмов передачи почты: напрямую от хоста пользователя —отправителя к хосту пользователя —получателя, когда два хоста соединены между собой напрямую через один и тот же транспорт­ный сервис; или через серверыSMTP(т. е. хосты —посредники), когда от­правитель и получатель не могут соединиться напрямую.

Аргументы команды MAILсодержат имя домена отправителя почты, т. е.SMTP-адреспочтового ящика —обратный адрес. Аргументы командыRCPTсодержат адрес почтового ящика получателя сообщения. Эти параметры не изменяются в процессе передачи сообщения и используются SMTP-сер­верами,например, для возврата недоставленных сообщений.

SMTP-командыимеют строго определенный синтаксис. Ответы обработки команд имеют численные коды. Команды и ответы представляют собой строки из символовASCII. Команды и ответы не чувствительны к регистру символов (чего нельзя сказать об именах пользовательских почтовых ящи­ков). Если транспортный сервис не поддерживает 8-битный канал, каждый из 7-битных символов передается со старшим (нулевым) битом = 0.

Протокол работы, основные команды

Транзакция SMTPотправки почты состоит из трех шагов. Начало транзак­ции задает командаMAIL, идентифицирующая отправителя, затем следует серия команд RCPT,определяющих почтовые ящики получателей, затем подается командаDATAдля передачи текста сообщения. Завершает переда­чу данных командная строка закрытия транзакции.

  • Формат команды MAILвыглядит следующим образом:

MAIL <SP> FROM: <reverse-path> <CRLF>

где <SP> —символ пробела, <CRLF> —перевод строки, <reverse-path> —имя почтового ящика отправителя сообщения. Эта команда говорит получателюSMTP, что открывается новая транзакция передачи почты, и получатель должен очистить все старые таблицы и буферы данных для приема нового сообщения. В случае возникновения ошибки получательSMTPотправляет по адресу <reverse-path>уведомление о не­возможности открытия транзакции. Если транзакцияSMTPоткрыта ус­пешно, отправителю возвращается команда "согласен 250раз" — "250 OK", где 250 —код возврата успешного выполнения команды.

Все ответы SMTP-серверовили получателей имеют код, который обо­значает статус обработки команды. Структура кодов строго определена, обработка определенной команды может вернуть только строго опреде­ленные для нее коды возврата. Все коды возврата построены по опреде­ленной структуре и образуют сложную иерархическую систему. Каждая цифра или комбинация цифр кода возврата несет в себе информацию о породивших ее условиях. К сожалению, описание структуры кодов воз­врата сообщенийSMTPвыходит за рамки данной книги. Но если вы хо­тите программировать какой-либо SMTP-сервис,вам необходимо тща­тельно изучить структуру кодов возврата. Подробное описание этой структуры вы можете ее найти вRFC, например,RFC-821.

  • Вторым шагом процесса передачи почты будет команда RCPT:

RCPT <SP> T0:<forward-path> <CRLF>

где <forward-path> —имя почтового ящика получателя почты. Данная команда может повторяться несколько раз для различных адресов полу­чателя сообщения. Если какой-либо из получателей неизвестен в пере­дающей системе, возвращается код 550 —"на указанный адрес почта не может быть отправлена —пользователь не существует". Если пользова­тель найден, отправителю возвращается код "250OK".

  • На третьем шаге транзакции передается команда DATA:

DATA <CRLF>

На эту команду получатель SMTPвозвращает код 354,означающий го­товность принимать данные. После этого отправитель начинает переда­вать текст сообщения: заголовок и тело сообщения. Каждая строка со­общения заканчивается символом <CRLF>.При получении строки окончания передачи текста —последовательности "<CRLF>.<CRLF>", получатель возвращает код "250OK". Это означает, что все данные при­няты. В противном случае получателем будет передан код ошибки не­верного завершения транзакции.

Примечание

Необходимо помнить, что длина строки данных SMTP-сообщения,вместе с симво­лами <CRLF>не должна превышать 1000байт.

Ниже приведен пример транзакции передачи сообщения, использующей описанные выше команды. Пример показывает передачу почты от пользо­вателя Smith, домена "Alpha-ARPA" пользователям домена "Beta.ARPA". (В данном и следующих примерах введены следующие обозначения:S — отправительSMTP,R —получательSMTP).

S: MAIL FROM:<Smith@Alpha.ARPA>

R: 250 OK

S: RCPT TO:<Jones@Beta.ARPA>

R: 250 OK

S; RCPT TO:<Green@Beta.ARPA>

R: 550 No such user here

S: RCPT TO:<Brown@Beta.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: hey hey hey...

S: ... how do you do. Beta ?

S: <CRLF>.<CRLF>

R: 250OK

В соответствии с представленной SMTP-транзакцией,почта получена поль­зователямиJonesиBrown, а у пользователяGreenнет почтового ящика в доменеBeta.

Может случиться так, что адрес почтового ящика “forward-path” содержит неверную информацию или находится в другом домене, а получательSMTPзнает правильный адрес. Тогда получательSMTPинформирует об этом от­правителяSMTPдвумя способами:

  • 251 User not local; -will forward to <forward-path>. Это ответное сообщение говорит отправителю, что получательSMTPзнает почтовый ящик адре­сата сообщения <forward-path>и берется самостоятельно переправить туда сообщение.

  • 551 User not local; please try <forward-path>. Этот ответ говорит отправите­лю, что получательSMTPзнает почтовый ящик получателя сообщения по адресу <forward-path>,но не берется переправить его туда самостоя­тельно и рекомендует это сделать отправителю.

Например, описанный выше сценарий мог развиваться следующим образом:

S: RCPT TO:<Green@Beta.ARPA>

R: 251 User not local; will forward to <Green@Batman.ARPA>

ИЛИ

S: RCPT TO:<Green@Beta.ARPA>

R: 551 User not local; please try <White@Gaimna.ARPA>

Для открытия простейшей SMTP-транзакцииотправки и получения почто­вого сообщения необходимо, чтобы между отправителемSMTPи получате­лемSMTPбыли установлены:

  1. Транспортное соединение, например, TCPилиUDP, или Х25.

  2. SMTP-соединение.

SMTP-соединениеустанавливается между отправителем и получателемSMTPпо готовому транспортному каналу. Этот процесс включает в себя обмен сообщениями открытия SMTP-канала.

HELO <SP> <domain> <CRLF>

Команда HELOотправляется инициирующим открытие соединения хостом, как правило, это хост отправителя, который идентифицирует себя через па­раметр <domain>.Ответом является код 250с именем отвечающего домена. Например, после того как установлено транспортное соединение с хостом получателяSMTP, происходит следующее:

R: 220 OH-UNIX.ARPA Simple Mail Transfer Service Ready

S: HELO AH-XENIX.ARPA

R: 250 OH-UNIX.ARPA

  1. Первая строчка приходит на хост отправителя SMTP(он же инициатор соединения) и сообщает о готовностиSMTPк работе.

  2. Во второй строчке отправитель передает команду установления SMTP-каналаи открывает транзакцию.

  3. В третьей строчке получатель SMTPсообщает об успешном открытии транзакции.

Для того чтобы завершить сеанс SMTP, достаточно отправить командуQUIT. Например:

S: QUIT R: 221 AH-UNIX.ARPA Service closing transmission channel

Для того чтобы прервать текущую SMTP-транзакциюи очистить все буферы отправителя и получателя данной транзакции (т. е. перезагрузить SMTP-соединение),используется командаRSET. Она может применяться, напри­мер, при зацикливаниях квитирующих сообщений доставки.

Кроме описанных выше команд, SMTPподдерживает и другие команды, которые могут быть полезны при передаче почты, но не входят в минималь­ный список обязательных команд и могут не выполняться на всех SMTP-серверах:

  • VRFY. Аргументом этой команды является имя почтового ящика или пользователя. Команда проверяет наличие указанного пользователя или почтового ящика в текущем домене и либо возвращает сообщение об отсутствии информации, либо сообщает полные атрибуты почтового ящи­ка, либо переадресовывает поиск в другой домен1 Например:

S: VRFY Smith R: 250 Fred Smith <Smithl?USC-ISIF.ARPA>

S: VRFY Smith R: 251 User not local; will forward to <Smith@USC-ISIQ.ARPA>

S: VRFY Jones R: 550 String does not match anything.

S: VRFY Jones R: 551 Oser not local; please try <Jones@USC-ISIQ.ARPA>

S: VRFY Gourjygiolz R: 553 User ambiguous.

  • EXPN. Аргументом этой команды является строка-идентификатор спи­ска адресатов домена. Это может быть имя файла, содержащее список адресатов или какой-либо другой идентификатор списка, определенный в системе. По этой команде получательSMTPотправляет список адреса­тов домена или сообщение о невозможности по каким-либо причинам выполнить данную команду (может быть, из-за отсутствия достаточных прав). Например:

S: EXPN Example-People

R: 250-Fred Fonebone <Fonebone@OSC-ISIQ.ARPA>

R: 250-Sam Q. Smith <SQSmith@USC-ISIQ.ARPA>

R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R: 250-<joe@foo-unix.ARPA>

S: EXPN Executive-Washroom-List

R: 550 Access Denied to You.

Примечание

Команды VRFYиEXPNне входят в минимальный список обязательных команд и могут не выполняться на SMTP-серверах.

SMTPможет доставлять сообщения не только в почтовые ящики пользова­теля, но и позволяет обмениваться сообщениями между терминалами поль­зователей (т. е. в момент передачи сообщения на принимающем хосте полу­чатель являетсяактивнымпользователем). Для этих целей используются команды:SEND,SOMLиSAML —эти команды также не входят в минимальный список обязательных команд и могут не выполняться на SMTP-серверах.Все эти команды имеют ту же структуру, что и командаMAIL. Они отличаются друг от друга следующим:

  • Команда SENDработает только с терминалом получателя.

  • Команда SOML(SendOrMaiL), если активен терминал получателя, от­правляет сообщение на него, а если терминал получателя не активен, оставляет сообщение в почтовом ящике получателя.

  • Команда SAML(SendAnd MaiL)отправляет сообщение как на терминал (если он активен), так и в почтовый ящик получателя.

Поскольку речь зашла о работе в терминальном режиме, необходимо упо­мянуть еще о двух командах, которые могут быть очень полезны при такой работе:

  • Команда TURNможет быть использована для изменения ролей работы пользователей (отправитель —получатель) или программ по SMTP-каналу.Так, если отправительSMTP(А) отправляет командуTURNи получатель (В) отвечает "250OK", то А становится получателемSMTP, а В —отправителемSMTP.

TURN <CRLF>

  • Команда HELP. Эта команда особенно полезна при работе с SMTP-серверомв ручном (терминальном) режиме. Она возвращает отправите­люSMTPинформацию о поддерживаемых серверомSMTPкомандах. Если в качестве аргумента будет передано имя какой-либо команды, от­ветом будет подробное описание предназначения и синтаксиса интере­сующей команды.

HELP [<SP> <string>] <CRLF>