
- •7.1 Формат почтовых сообщений, мiме
- •7.2 Модель работы smtp
- •Пользователь
- •7.3 Ретрансляция сообщений
- •7.4 Расширения smtp-сервиса для передачи 8-битных данных
- •7.5 Взаимодействие smtp с транспортным протоколом tcp
- •7.6 Принципы работы
- •7.7 Протокол iмар4
- •7.8 Атрибуты сообщений системы (map)
- •Основные команды
7.2 Модель работы smtp
Протокол SMTPспроектирован на основе следующей модели взаимодействия: по запросу пользователя отправительSMTP(sender —SMTP) устанавливает двусторонний канал с получателемSMTP(receiver —SMTP). ПолучателемSMTPможет быть как хост назначения почтового сообщения, так и какой-либо промежуточный хост. КомандыSMTPгенерируются отправителем и отправляются получателюSMTP, который, .в свою очередь, отправляет ответы обработки полученных команд отправителюSMTP.
Схема работы SMTP-протоколаизображена на рис. 4.1.Простейший алгоритм работы протокола выглядит следующим образом:
После установления канала SMTP-соединенияпо любому из транспортных протоколов отправительSMTPпосылает командуMAIL, идентифицирующую атрибуты отправителя почты, например, его адрес. Если получательSMTPможет принять почтовое сообщение, он отправляет в ответ команду ОК.
После этого отправитель SMTPотправляет командуRCPT, идентифицирующую атрибуты получателя почты, например, адрес почтового ящика. Если получательSMTPготов принять почту в данный почтовый ящик, он отвечает командой ОК, если нет, он отвечает отказом принять почту в указанный почтовый ящик. Если отправитель указал несколько почтовых ящиков, в которые следует поместить сообщение, то получательSMTPможет отказать части из них, при этом транзакция соединения не заканчивается.
Отправитель 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были установлены:
Транспортное соединение, например, TCPилиUDP, или Х25.
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
Первая строчка приходит на хост отправителя SMTP(он же инициатор соединения) и сообщает о готовностиSMTPк работе.
Во второй строчке отправитель передает команду установления SMTP-каналаи открывает транзакцию.
В третьей строчке получатель 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>