Я почти уверен, что Интернет у многих ассоциируется с
общением, а если точнее, то с общением по электронной почте. Эта служба самая
старая, можно сказать, ветеран Сети, так как была выдумана еще до создания
самого Интернета и использовалась на самом примитивном сетевом оборудовании,
т.е. «письма» передавались не по TCP/IP (Transmission Control Protocol/Internet
Protocol), а сугубо с сервера на клиент, причем сервер и клиент находились на
малюсеньком расстоянии друг от друга (максимум 2–3 метра). Но прогресс не
остановить, и уже через несколько лет после разработки TCP/IP, появился
усовершенствованный вид электронной почты. В наше же время e-mail — это основное
средство коммуникаций Интернета, сейчас трудно представить пользователя Сети,
который не знал бы, как отправить или получить письмо/файл от друга из далекой
Австралии или любого другого места.
Недавно мне подсунули заказ: написать программу, с помощью
которой можно было бы отправлять письма целой куче народа, т.е. создать
рассылочный модуль (не в целях спама). В то время о структуре электронной почты
я знал немного: что такое The Вat! и как его настроить :-). Было несложно
понять, что моих «знаний» не хватит для разработки этого проекта, и я решил
заняться изучением внутренностей электронной почты. Много было потрачено
бесценного unlimited’а и сил, бессонных ночей и нервов, пока я не понял всю
систему отправки и принятия писем по e-mail. Проект был завершен в сроки,
программа продалась :-). Теперь пришло время узнать и вам то, что узнал я — т.е.
узнать ВСЕ про электронную почту.
Состав письма. Виды протоколов
Каждое письмо состоит из двух частей: заголовка и тела.
Заголовок почтового сообщения содержит служебную информацию, то есть — дата и
время создания, кому адресовано письмо, от кого идет, данные об использованной
программе, в которой создавалось и отправлялось письмо. Тело хранит в себе текст
и вставленные файлы. Если передается простой текст, то его передавать лучше в
ASCII-кодах (размер письма явно уменьшается), а если вы хотите кому-то переслать
дистрибутив Windows XP :-), то одними ASCII-символами тут не обойтись. Чтобы
передать файлы, необходимо использовать двоичное кодирование, в котором можно
отсылать любую информацию. Большинство современных почтовых программ (Outlook
Express, Eudora, тот же the Bat!) обмениваются в кодировке MIME (аббревиатура
MIME означает Multipurpose Internet Mail Extensions, хотя я не
уверен — три изученных мною сайта выдали разные толкования).
Электронная почта во многом похожа на обычную почтовую службу,
разница лишь в том, что электронное письмо идет очень быстро, да и стоит намного
дешевле, так как марки и конверты не нужны :-).
Корреспонденция готовится примерно по такой схеме: написание
письма > передача программе-клиенту > передача на SMTP-сервер (читать ниже) >
программа-клиент > пользователь.
Для работы электронной почты в Интернете разработан специальный
протокол Simple Mail Transfer Protocol (SMTP), который является
протоколом прикладного уровня и использует транспортный протокол TCP.
SMTP — самый популярный и качественный вид протоколов для электронной почты,
хотя существуют и другие: UUCP, IMAP. В случае использования SMTP
почта достигает почтового ящика получателя за считанные секунды, и время
получения сообщения зависит только от того, как часто получатель просматривает
свой почтовый ящик. При использовании UUCP почта передается по принципу
stop-go, т.е. почтовое сообщение передается по цепочке почтовых серверов от
одной машины к другой, пока не достигнет машины-получателя или не будет
отвергнуто по причине отсутствия абонента-получателя. С одной стороны, UUCP
позволяет доставлять почту по плохим телефонным каналам, т.к. не требуется
поддерживать линию все время, пока сообщение доставляется от отправителя к
получателю, но с другой стороны, обидно получить возврат сообщения через
сутки-другие после его отправки из-за какой-нибудь неверной буквы в имени
пользователя. В целом же общие рекомендации таковы: если имеется возможность
надежно работать в режиме on-line, и это является нормой, то следует настраивать
почту для работы по протоколу SMTP; если же линии связи плохие или on-line
используется чрезвычайно редко, то лучше использовать UUCP.
Система адресов
Основой любой почтовой службы является система адресов. Без
точного адреса невозможно доставить почту адресату. В Интернете принята система
адресов, которая базируется на доменном адресе машины, подключенной к сети.
Рассмотрим мой e-mail: koshewoy@mail.ru. Мы видим, что адрес электронной почты
состоит из двух частей: идентификатора пользователя (koshewoy), который
записывается перед знаком коммерческого эт, или, как говорят в народе, «сабаки»
(пишется через «а») — @, и доменного адреса машины (mail.ru), который
записывается после знака @.
SMTP-сервер. Основные команды
Simple Mail Transfer Protocol был разработан для обмена
почтовыми сообщениями в сети Интернет. SMTP не зависит от транспортной среды и
может использоваться для доставки почты в сетях с протоколами, отличными от
TCP/IP и Х.25. Достигается это за счет концепции IPCE (InterProcess
Communication Environment). IPCE позволяет взаимодействовать процессам,
поддерживающим SMTP, в интерактивном режиме, а не в режиме stop-go.
Модель протокола
Взаимодействие в рамках SMTP строится по принципу двусторонней
связи, которая устанавливается между отправителем и получателем почтового
сообщения. При этом отправитель инициирует соединение и посылает запросы на
обслуживание, а получатель на эти запросы отвечает. Фактически, отправитель
выступает в роли клиента, а получатель — сервера.
Канал связи
устанавливается непосредственно между отправителем и получателем
сообщения. При таком взаимодействии почта достигает абонента в течение
нескольких секунд после отправки.
Дисциплины работы и команды протокола
Обмен сообщениями и инструкциями в SMTP ведется в ASCII-кодах. В
протоколе определено несколько видов взаимодействия между отправителем почтового
сообщения и его получателем, которые здесь называются дисциплинами.
Отправитель обозначен буквой S, а smtp-сервер — R.
Наиболее распространенной дисциплиной является отправка
почтового сообщения, которая начинается по команде MAIL, идентифицирующей
отправителя:
Следующей командой определяется адрес получателя:
После того как определен отправитель и получатель почтового
сообщения, можно отправлять последнее:
Команда DATA вводится без параметров и идентифицирует начало
ввода почтового сообщения. Сообщение вводится до тех пор, пока не будет введена
строка с точкой в первой позиции. Согласно стандарту почтового сообщения
RFC822, отправитель передает заголовок и тело сообщения, которые разделены
пустой строкой. Сам протокол SMTP не накладывает каких-либо ограничений на
информацию, которая заключена между командой DATA и . в первой позиции последней
строки. Приведем пример обмена сообщениями при дисциплине отправки почты:
Если вы заметили, после некоторых команд smtp-сервер выдает
трехзначные числа — это «реакция» сервера на ваши действия. В этих цифрах
отображаются ошибки, замечания, сообщения и т.д. и т.п. К этим «цифрам» мы
вернемся еще не раз.
Другой дисциплиной, определенной в протоколе SMTP, является
перенаправление почтового сообщения (forwarding). Если получатель не найден,
но известно его местоположение, то сервер может выдать сообщение:
Если сервер способен лишь сделать предположение о дальнейшей
рассылке, то ответ будет несколько иным:
Верификация и расширение адресов составляют дисциплину
верификации. В ней используются команды VRFY и EXPN. По команде VRFY сервер
подтверждает наличие или отсутствие указанного пользователя:
Используя команду EXPN, можно получить список местных
пользователей:
В список дисциплин, разрешенных протоколом SMTP, входит, кроме
отправки почты, еще и прямая рассылка сообщений. В этом случае сообщение будет
отправляться не в почтовый ящик, а непосредственно на терминал пользователя,
если пользователь в данный момент находится за своим терминалом. Прямая рассылка
осуществляется по команде SEND, которая имеет такой же синтаксис, как и команда
MAIL. Кроме SEND, прямую рассылку осуществляют SOML (Send or Mail) и SAML (Send
and Mail). Назначение этих команд легко понять из их названия.
Для инициализации канала обмена почтой и его закрытия
используются команды HELO и QUIT соответственно. Первой командой сеанса должна
быть команда HELO.
Протокол допускает рассылку почтовых сообщений в режиме
оповещения. Для этой цели отправитель в адресе получателя может указать
несколько пользователей или групповой адрес. Обычно программное обеспечение SMTP
выбирает эту информацию из заголовка почтового сообщения и на ее основе
формирует параметры команд протокола.
Если сообщение по какой-либо причине не может быть разослано,
получатель формирует об этом сообщение:
При использовании доменных имен следует использовать
канонические имена, т.к. некоторые системы не могут определить синоним по базе
данных named.
В дополнение к перечисленным выше дисциплинам протокол позволяет
отправителю и получателю меняться ролями друг с другом. Происходит это по
команде TURN.
Для отладки или проверки соединения по SMTP можно использовать
telnet. Для этого вслед за адресом машины следует ввести номер порта —
для примера, введите в командной строке ( Пуск > Выполнить): telnet
smtp.svitonline.com 25.
25 порт используется в Интернете для обмена сообщениями по
протоколу SMTP. В интерактивном режиме пользователь сам изображает клиента SMTP
и может посмотреть реакцию удаленной машины на его действия.
Формат почтового сообщения RFC-822
При обсуждении примеров отправки и получения сообщений уже
упоминался формат почтового письма. Разберем его подробнее. Формат почтового
интернет-сообщения определен в документе RFC-822 (Standard for ARPA Internet
Text Message). Это довольно большой документ объемом в 47 страниц
машинописного текста (найти его полный вариант мне не удалось, кто найдет —
напишите), поэтому рассмотрим формат сообщения на примерах. Почтовое сообщение
состоит из трех частей: конверта, заголовка и тела сообщения.
Пользователь видит заголовок и тело сообщения. Конверт используется только
программами доставки. Заголовок всегда находится перед телом сообщения и отделен
от него пустой строкой. RFC-822 регламентирует содержание заголовка сообщения.
Заголовок состоит из полей. Поля состоят из имени поля и
содержания поля. Имя поля отделено от содержания символом :. Минимальный
набор — поля Date, From, cc или To, например:
или
Поле Date определяет дату отправки сообщения, поле From —
отправителя, а поля сс и To — получателя(ей). Чаще заголовок содержит
дополнительные поля:
В данном случае поле Sender указывает, что дядя Вася не является
автором сообщения. Он только переслал сообщение, которое получил от Secy@SHOST.
Поле Message-ID содержит уникальный идентификатор сообщения и используется
программами доставки почты. Следующее сообщение демонстрирует все возможные поля
заголовка:
Поле Subject определяет тему сообщения, Reply-To — пользователя,
которому отвечают, Comment — комментарий, In-Reply-To — показывает, что
сообщение относится к типу «В ответ на Ваше сообщение, отвечающее на сообщение,
отвечающее...».
Следует сказать, что формат сообщения постоянно дополняется и
совершенствуется. В RFC-1327 введены дополнительные поля для совместимости с
почтой X.400. Кроме того, следует обратить внимание на поля некоторых довольно
часто встречающихся заголовков, которые не регламентированы в RFC-822. Так,
первое предложение заголовка, которое начинается со слова From, содержит
UUCP-путь сообщения, по которому можно определить, через какие машины сообщение
«пробиралось». Поле Received: содержит транзитные адреса почтовых серверов с
датой и временем прохождения сообщения. Вся эта информация полезна при разборе
трудностей с доставкой почты.
Выводы и заключения
В заключение хотелось бы отметить, что возможности почты не
ограничиваются только пересылкой корреспонденции. По почте можно получить доступ
ко многим интернет-ресурсам, которые имеют почтовых роботов, отвечающих на
запросы страждущих. Поэтому имеет смысл более детально изучить программное
обеспечение, поддерживающее e-mail (авторам — намек). Время, затраченное на
чтение документации и опыты, окупятся возможностью получения информации из
информационных архивов Сети.
И защити вас Бог от СПАМА. Аминь :-).