публикации | рисунки | фотографии | программы | ссылки |
КомпьюТерра # 24-25 (104-105), Июль 4 1995 SENDMAIL -- электронная почта для всех и каждого.Никита КожекинПредлагаемая вашему вниманию статья описывает краткое устройство sendmail - популярного почтового агента ОС Unix Понятие электронная почта знакомо, пожалуй, всем и каждому. Но лишь понятие, а вот то, как она устроена, для тех же "всех и каждого" остается тайной за семью печатями. Хотя все не так уж и сложно. Функции распространения почты в Unix (да и почти везде) разделены между двумя утилитами - MUA (Mail User Agents, или пользовательские почтовые агенты, которые "отвечают" за управление всеми аспектами пользовательского интерфейса; это программы вроде maff, Mail, mailx, mailtool и т.п.) и МТА (Mail Transfer Agents, или агенты пересылки почты, чья "обязанность" - управление собственно пересылкой; как правило, это sendmail). Подобная дифференциация была введена в стандарте Х.400. Основой для программы sendmail послужил продукт delivermail, созданный в 1979 году под BSD Unix 4.0/4.1 и усовершенствованный позднее Эриком Алманом до вида sendmail. В отличие от delivermail, последняя программа не была специфицирована для одной сети, а поддерживала почти все, что открывало доступ в IAO-бальные сети (например, Internet), реально состоящие из нескольких ЛС. Последняя версия sendmail всегда доступна с ftp.cs.berkley.edu. Встречаются, правда довольно редко, и другие МТА. Например, рр, или mmdf, поддерживающий CSnet, используется в SCO Unix (фирма Santa Cruz Operation). Кроме того, МТА применяются в некоторых специфических случаях, например, при работе с DOS, а также с еще более "экзотическими" (для Internet) операционными системами. Останавливаюсь на этом специально, так как 2/3 (даже больше) ядра Internet состоят из Unix-машин, DOS же - это всего лишь 0.7 % ядра. В общем, все дальнейшее повествование будет касаться именно sendmail. Программа sendmail поддерживает два типа протоколов: UUCP (Unix-to-Unix Copy) и SMTP (Simple Mail Transfer Protocol). Адреса SMTP - это адреса типа: user@host, user@host.domain и user@host.domain.zone, а адреса UUCP - это host!user, host!host!user и user@host.uucp. Возможна и более "хитрая" адресация, например: hostA!user%hostB пересылает почту с машины hostA на hostB, a user!hostA@hostB, наоборот, с hostB на hostA. Отправка письма происходит в несколько этапов. Сначала вы составляете собственно текст вашей любимой MUA. Этот текст (письмо) состоит из двух частей: заголовка и сообщения. Заголовок включает в себя всю административную информацию о сообщении (кто, когда и кому) и обычно выглядит так: From: Boris Nikolaevitch EItsin eltsin@kremlin.gov (кто послал) To: grachev@army.gov (кому послал? ) cc: zhirinovsky@whitehouse.msk.ru (кому послал копию? ) Date: Mon Sep 21 18:11:24 1997 (когда послал? ) Content-Length: 512 (сколько строк послал) (Далее - пустая строка отделяющая заголовок от тела письма .)
Затем по этим данным составляются: конверт, заголовок и тело сообщения, которые передаются sendmail. Конверт, остающийся невидимым не только для получателя корреспонденции,но и ее отправителя,содержит адреса отправителя/получателя и внутренние данные для МТА. Для его оформления используется информация из заголовка сообщения. В случае применения протокола UUCP почта рассылается по принципу "stop-go", то есть сообщение передается от машины к машине, и то что письмо ушло, еще не значит, что оно обязательно дойдет до адресата. При использовании протокола SMTP рассылка почты происходит в режиме "on line". В этом случае применяется протокол "клиент-сервер" RFC-821 (Request for comments). Sendmail запускается в качестве демона и "слушает" порт TCP: если все нормально, то устанавливается прямое соединение с удаленным клиентом SMTP - другим sendmail. Немного отличается рассылка на удаленную и местную машины: заголовок, тело и конверт обычно передаются через pipe. Программа sendmail располагает собственной коллекцией различных файлов, которые необходимы для работы с ней. Файл конфигурации обычно носит имя /etc/sendmail.cf. Конфигурируется он довольно сложно, но, как правило, в поставке имеется готовый файл. Трудность самостоятельного обновления конфигурационного файла заключается прежде всего в том, что его команды сокращены до отдельных букв: - А - имя файла почтовых алиасов (по умолчанию /etc/aliases); - О - создание макросов; - С и F - определение классов имен; - Н - создание заголовка; - М - описание мэйлеров; - О - задание опций; - Q - файл почтовой очереди (по умолчанию /var/spool/mqueue); - S и R - правила преобразования адресов (набор правил/правило). Подготовив конфигурационный файл, необходимо выполнить команду sendmail sendmail, которая укажет sendmail обновить конфигурацию. Файл почтовой очереди носит имя /var/spool/mqueue. В него записываются письма, ждущие отправки. Бывает, что письма задерживаются (например, из-за неготовности машины получателя к приему). Возможность просмотра содержания почтовой очереди предоставляет программа mailq. Файл почтовых алиасов называется /etc/aliases. Он задает информацию о пересылке, сокращении адресов, добавлении писем в файлы и выводе их в другие программы. Обязательным алиасом является только задание имя обработчика почты MAILER_DAEMON - обычно что-то вроде pochtalion_pechkin или postmaster. Обновить почтовые алиасы можно командой newaliases. Это может выглядеть следующим образом (символ # в начале строки отделяет строку комментариев): # Обязательные алиасы: те, кто занимается проблемами электронной почты postmaster: root MAILER.DAEMON: postmaster * Персональный алиас: один пользователь под разными именами President_FSF: stolmann ft Список рассылки Pirates: john_silver, ben_gan@island.ocean.far # Направление письма в файл Billy_Gates: /dev/null * Перенаправление сообщения (декодировка сообщений, приходящих закодированными) crypt:|/user/local/bin/decode Как правило, файл почтовых алиасов предназначен для всей системы, однако каждый пользователь может иметь личный файл в домашней директории (.forward), который содержит информацию о дальнейшей рассылке писем. Например, программа vacation создает .forward-файл для вывода сообщения об отлучке пользователя, поэтому ваша почта будет поступать (записываться) в почтовый ящик, а отправители будут получать заранее заложенное вами сообщение, типа "Ну нету меня!" Вот как должен выглядеть подобный .forward-файл: \eltsin, "|/usr/ucb/vacation eltsin" Этот файл полезен и тогда, когда вы можете смотреть почту только с другого адреса (с другой машины). В этом случае выручит .forward-файл для автоматической пересылки поступающих писем по новому адресу. Программа sendmail имеет три режима работ:
Режим диагностики распечатывает этапы доставки почты, с тем чтобы выяснить, где случились проблемы. Режим отладки позволяет пользователю варьировать количество получаемой информации. Его вызов выглядит так: sendmail -dкатегория.уровень.категория..., где уровень - целое число от 0 до 127, причем более высокий уровень соответствует большему количеству отладочной информации, а категория - целое число или диапазон (например 0-99). По умолчанию используется режим -d0-99.1. Категория отладки -d0 является основной, -d6 включает информацию о не отправляемой почте, -d21 трассирует правила переписывания адресов, a -d30 трассирует создание заголовка. Сведения об основных категориях - см. man. Одна статья, естественно, не может объять такое необъятное, как программа sendmail, но автор надеется, что данный обзор хоть сколько-нибудь поможет читателям представить, как она устроена. Зачастую этого бывает достаточно, так как дальше... дальше "нет ничего тайного, что не стало бы явным". И еще одно: не забудьте ознакомиться с документацией вашей версии sendmail.
|