Опубликован: 10.10.2007 | Уровень: специалист | Доступ: платный
Лекция 2:

Протокол электронной почты

Аннотация: В данной лекции рассматриваются протоколы электронной почты. Приведены основные понятия, определения и свойства протоколов электронной почты. Основное внимание уделено многоцелевому расширению почты Интернет (MIME)

Протокол электронной почты

Главной целью протокола SMTP (Simple Mail Transfer Protocol, RFC-821, -822) служит надежная и эффективная доставка электронных почтовых сообщений. SMTP является довольно независимой субсистемой и требует только надежного канала связи. Средой для SMTP может служить отдельная локальная сеть, система сетей или весь Интернет.

SMTP базируется на следующей модели коммуникаций: в ответ на запрос пользователя почтовая программа-отправитель устанавливает двухстороннюю связь с программой-приемником (TCP, порт 25). Получателем может быть оконечный или промежуточный адресат. SMTP -команды генерируются отправителем и посылаются получателю. На каждую команду должен быть отправлен и получен отклик.

Когда канал организован, отправитель посылает команду MAIL, идентифицируя себя. Если получатель готов к приему сообщения, он посылает положительное подтверждение. Далее отправитель посылает команду RCPT, идентифицируя получателя почтового сообщения (таких команд можно выдать несколько, если число получателей более одного). Если получатель может принять сообщение для оконечного адресата, он выдает снова положительное подтверждение. В противном случае он отвергает получение сообщения для данного адресата, но не вообще почтовой посылки. Взаимодействие с почтовым сервером возможно и в диалоговом режиме, например:

tn dxmint.cern.ch 25 (команда telnet с использованием порта 25)
220 dxmint.cern.ch sendmail ready at sun, 9 jul 1995 11:13:57 +0200 
  (связь установлена, код отклика 220 является положительным)
EHLO dxmint.cern.ch (поддерживает ли сервер расширение mime?)
500 command unrecognized (не поддерживает)
HELO crnvma.cern.ch (команда выхода на конкретный сервер)
250 dxmint.cern.ch hello crnvma.cern.ch, pleased to meet you 
  (отклик 250 также является положительным)
mail from:<> (так как на моей PC нет резидентной почтовой программы, я
не указываю обратного адреса, по этой причине принимающая программа
может счесть данное сообщение SPAM'ом)
250 <>... sender ok (команда прошла успешно)
RCPT TO: ysemenov@cernvm.cern.ch (указываем адрес места назначения)
250 ... recipient ok
DATA (начало ввода текста сообщения)
nu-i-nu... (текст сообщения)
. (знак конца сообщения)
QUIT (прерывание или завершение процедуры)
221 dxmint.cern.ch closing connection 
   (сообщение об успешном завершении процедуры)

Почтовое сообщение отправлено без использования доступа к локальной почтовой программе. Следует отметить, что работа через порт 25 в данном случае открывает богатые возможности для хакеров. Вообще опытный программист может многого достичь, умело используя номера портов. Здесь есть над чем поработать людям, ответственным за безопасность сетей. Аналогично, не имея авторизации, можно выявить клиентов почтового сервера, используя команду VRFY (если она не блокирована административно):

tn ns.itep.ru 25
220 ns.itep.ru 5.67a8/ida-1.5 sendmail is ready at sat, 29 jul 1995 13:53:03
vrfy bobyshev
250 andrey bobyshev
и т.д.
quit

SMTP -отправитель и SMTP -получатель могут вести диалог с несколькими оконечными пользователями ( рис. 2.1). Любое почтовое сообщение завершается специальной последовательностью символов. Если получатель успешно завершил прием и обработку почтового сообщения, он посылает положительное подтверждение.

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

Схема взаимодействия различных частей почтовой системы

Рис. 2.1. Схема взаимодействия различных частей почтовой системы

Для решения поставленной задачи SMTP -сервер должен знать имя конечного получателя и название почтового ящика места назначения. Аргументом команды MAIL является адрес отправителя (обратный адрес). Аргументом команды RCPT служит адрес конечного получателя. Обратный адрес используется для посылки сообщения в случае ошибки.

Все отклики имеют цифровые коды. Команды, отклики и имена ЭВМ не чувствительны к тому, строчные или прописные символы использованы при их написании, но это не всегда справедливо при написании имен и адресов получателя.

Почтовый протокол SMTP работает только с ASCII-символами. Если транспортный канал работает с октетами, 7-битные коды будут дополнены нулевым восьмым битом. Именно здесь коренилась проблема пересылки почтовых сообщений на русском языке (русский алфавит требует 8-битового представления). Проблема усугубляется тем, что для русского алфавита принято 4 кодовых представления, здесь мы впереди планеты всей…

Как уже было сказано, процедура отправки почтового сообщения начинается с посылки команды MAIL, которая имеет формат:

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

где <SP>пробел, <CRLF> — комбинация кодов возврата каретки и перехода на новую строку, а <reverse-path>обратный путь (имя почтового ящика отправителя). Именно этот адрес используется, если получатель сообщения воспользуется командой reply.

Эта команда сообщает SMTP -получателю, что стартует новая процедура и следует сбросить в исходное состояние все статусные таблицы, буферы и т.д. Если команда прошла, получатель реагирует откликом: 250 OK.

Аргумент может содержать не только адрес почтового ящика — в общем случае он является списком адресов ЭВМ-серверов, через которые пришло данное сообщение, включая, разумеется, и адрес почтового ящика отправителя. Первым в списке <reverse-path> стоит адрес ЭВМ-отправителя. После прохождения команды MAIL посылается команда RCPT:

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

Эта команда указывает адрес конечного получателя ( <forward-path> ). При благополучном прохождении команды получатель посылает кодотклик 250 OK, и запоминает полученный адрес. Если получатель неизвестен, SMTP -сервер пошлет отклик 550 Failure reply. Команда RCPT может повторяться сколько угодно раз, если адресат не один.

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

DATA <CRLF>

При правильном приеме этого сообщения SMTP -сервер реагирует посылкой отклика 354 Intermediate reply (промежуточный отклик), и рассматривает все последующие строки в качестве почтового текста. При получении кода конца текста отправляется отклик: 250 OK.

Признаком конца почтового сообщения является точка в самом начале строки, за которой следует <CRLF>. Пользователям почтовых UNIX-систем это уже известно.

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

1. 251 User not local; will forward to <forward-path>

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

2. 551 User not local; please try <forward-path>

Получатель знает правильный адрес и предлагает отправителю переадресовать сообщение по адресу <forward-path>.

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

Реакция на команду VRFY зависит от аргумента. Так если среди клиентов почтового сервера имеется два пользователя с именем Ivanov, откликом на команду "VRFY Ivanov" будет "553 User ambiguous". В общем случае команда VRFY Ivanov может получить в качестве откликов:

250 Vasja Ivanov Ivanov@cl.itep.ru
или:
251 User not local; will forward to Ivanov@cl.itep.ru
или:
550 String does not match anything (данная строка ничему не соответству-
ет).
или:
551 User not local; please try Vasja@ns.itep.ru
или:
VRFY Chtozachertovchina
553 User ambiguous (несуществующее имя)

В случае распечатки списка адресов отклик занимает несколько строк, например:

EXPN Example-People
250-Juri Semenov Semenov@ns.itep.ru
250-Alexey Sher Sher@suncom.itep.ru
250-Andrey Bobyshev Bobyshev@ns.itep.ru
250-Igor Gursky Gursky@ns.itep.ru

В некоторых системах аргументом команды EXPN может быть имя файла, содержащего список почтовых адресов.

Основной задачей почты служит доставка сообщений в почтовый ящик адресата. Сходную форму услуги оказывают некоторые ЭВМ, доставляя сообщения на экран терминала (в рамках SMTP ). Для посылки сообщений на экран терминала адресата предусмотрено три команды:

1. SEND <SP> FROM:<reverse-path> <CRLF>

Команда SEND требует, чтобы почтовое сообщение было доставлено на терминал. Если терминал адресата не активен в данный момент, то откликом на команду RCPT будет код 450.

2. SOML <SP> FROM:<reverse-path> <CRLF>

Команда Send Or MaiL (SOML) пересылает сообщение на экран адресата, если он активен, в противном случае сообщение будет уложено в его почтовый ящик.

3. SAML <SP> FROM:<reverse-path> <CRLF>

Команда Send And MaiL (SAML) предполагает доставку сообщение на экран терминала адресата и занесение в его почтовый ящик. Для открытия и закрытия коммуникационного канала используются команды:

HELO <SP> <domain> <CRLF>, где <domain> — имя запрашивающего домена. 
QUIT <CRLF>

Выражение <forward-path> может быть маршрутом, имеющим вид "@ONE,@TWO:VANJA@THREE", где ONE, TWO и THREE — имена ЭВМ. Это подчеркивает различие между адресом и маршрутом. Концептуально элементы из <forward-path> переносятся в <reverse-path> при пересылке сообщений от одного SMTP -сервера к другому.

Если SMTP -сервер обнаружит, что доставка сообщения по адресу невозможна, тогда он формирует сообщение о "недоставленном письме", используя <reverse-path>. Следует также помнить, что и прямой, и обратный адреса-маршруты, вообще говоря, могут не иметь ничего общего с текстом заголовка почтового сообщения.

При определенных условиях и ошибках в задании прямых и обратных адресов-маршрутов возможно зацикливание сообщений об этих ошибках. Чтобы заведомо избежать этого, можно выдавать команду MAIL c нулевым обратным маршрутом:

MAIL FROM:< >

Если вы или ваша программа не указали обратного адреса, не следует думать, что это помешает работе почтовой программы и она не будет знать, куда посылать отклики. Практически все почтовые программы позволяют произвольно модифицировать поле <reverse-path>. Это может быть удобно, если вы собираетесь в командировку, но эта возможность широко используется и спамерами.

Поле <reverse-path> применяется почтовой программой, когда вы отвечаете на полученное сообщение с помощью утилиты Reply. Таким образом, ваш возмущенный ответ спамеру может прийти, например, к вам самому.

Следует помнить, что обратный IP-адрес (адрес отправителя) указан в каждом пакете, посылаемом адресату!

Некоторые другие команды, используемые в SMTP

Команда TURN нужна для того, чтобы поменять местами функции программ, взаимодействовавших по телекоммуникационному каналу. Программа-отправитель становится получателем (после того как она выдаст команду TURN и получит отклик 250 ), а программа-получатель — отправителем. Если программа не хочет или не может поменять свою функцию, она пошлет отклик 502. Эта команда позволяет организовать диалог между отправителем и получателем в реальном масштабе времени.

Команда RESET (RSET) прерывает текущую процедуру отправки почтового сообщения. Все буферы и таблицы очищаются, получатель должен послать отклик 250 OK.

Команда HELP вынуждает получателя послать справочную информацию отправителю команды HELP. Команда может содержать аргумент (имя команды). Она не изменяет состояния таблиц или буферов.

Команда NOOP не оказывает влияния на какие-либо параметры или результаты предшествующих команд, она только вынуждает получателя послать отклик 250 OK. Может использоваться для проверки работоспособности TCP-канала.

Допустимо написание команд строчными или прописными символами, например: MAIL, Mail, mail, MAil или mAil.

Для того, чтобы программа SMTP -сервера была работоспособна, она должна понимать следующий минимум команд: HELO, MAIL, RCPT, DATA, RSET, NOOP, QUIT.

Предельная длина имени пользователя или домена равна 64 символам. Максимальная длина <reverse-path> или <forward-path> составляет 256 символов, включая разделители (пробелы, точки, запятые и пр.). Командная строка не должна быть длиннее 512 символов. Максимальный размер строки отклика не должен превышать 512 символов, включая его код и <CRLF>. Максимальная длина строки составляет, включая <CRLF>, 1000 символов. Предельно допустимое число адресатов равно 100, последнее полезно помнить, если вы храните этот список в файле.

Наталья Шульга
Наталья Шульга

Курс "информационная безопасность" .

Можно ли на него записаться на ПЕРЕПОДГОТОВКУ по данному курсу? Выдается ли диплом в бумажном варианте и высылается ли он по почте?

Нияз Сабиров
Нияз Сабиров

Здравствуйте. А уточните, пожалуйста, по какой причине стоимость изменилась? Была стоимость в 1 рубль, стала в 9900 рублей.

Антон Шавергин
Антон Шавергин
Россия
Степан Крупа
Степан Крупа
Украина, Львів, СЗШ №65, 2012