Немного истории
Посылка почтового сообщения
Функции sendmail
Различные части sendmail
Конфигурационный файл
Почтовая очередь
Файл почтовых алиасов
Пользовательский почтовый список
Режимы работы sendmail
Заключение

В статье приводится краткое описание программы sendmail - одной иэ основных процедур обработки электронной почты в ОС UNIX.

В давние-давние времена, перед возникновением компьютерных сетей, электронная почта была внутренним делом каждой машины. В UNIX существовала единственная программа mail, являвшаяся интерфейсом к почтовой системе и использовавшаяся для посылки почты (получения данных от пользователя-отправителя и помещения их в почтовый ящик пользователяполучателя) и чтения поступивших сообщений (распечатки на экране содержимого почтового ящика).

По мере роста сетей наметилось некоторое разделение функций между утилитами, заправляющими системой электронной почты. Появилось множество программ (и даже наборов программ), управляющих общением пользователя с почтовой системой. Стандарт Х.400 называет их MUA (Mail User Agents - пользовательские почтовые агенты). Функция MUA состоит в управлении всеми аспектами пользовательского интерфейса к почтовой системе. Примерами MUA служат программы типа mail, Mail, mailx, mailtool, elm и т. п.

Существует также заметно меньшее количество программ, которые получают почту от MUA и посылают ее в почтовые ящики пользователей на той же машине или вообще в другую точку мира. Эти программы называют МТА (Mail Transfer Agents - агенты пересылки почты). Для UNIX-систем, имеющих корни в BSD, наиболее популярным МТА является sendmail. Примерами других МТА для UNIX служат mmdf, развиваемый для поддержки CSnet и стандартно используемый в SCO UNIX, и рр, развиваемый в Великобритании для поддержки протоколов Х.400. Но поскольку темой данной статьи является именно sendmail, то все дальнейшее повествование будет сконцентрировано вокруг этой программы.

В заключение необходимо отметить, что деление на MUA и МТА несколько условно, и поэтому порой бывает трудно однозначно классифицировать ту или иную программу.

Немного истории

Оригинал программы sendmail был написан Эриком Аллманом (Eric Allman) еще в пору его обучения в Калифорнийском Университете в Беркли для решения следующей проблемы: одна из университетских машин использовалась в проекте INGRESS и была включена в ARPAnet, другая же использовалась в разработке BSD Unix и имела UUCP-соединение с удаленными сетями. Эти компьютеры, а также несколько других были соединены некоей сетью, созданной Эриком Шмидтом (Eric Schmidt) и названной Berknet. Существовало также программное обеспечение, позволявшее отправлять почту отдельно по каждой из этих сетей, но не поддерживавшее их все одновременно.

Основой для sendmail послужила программа delivermail, созданная в 1979 году и работавшая под BSD Unix 4.0 и 4.1. Однако delivermail не обладала достаточной универсальностью, что и привело в 1980 году к появлению первой версии sendmail, работавшей под BSD Unix 4.1с (это первый BSD UNIX, включающий TCP/IP). С тех пор программа постоянно совершенствовалась как своим создателем, так и другими программистами.

В настоящее время наиболее распространенными версиями программы являются: sendmail, развиваемый в Беркли (последняя версия - 8.x, или сокращенно V8); созданная в 1987 году Леннартом Ловстрандом (Lennart Lovstrand) - Университет Линчепинга - версия IDA ( "Institutionen Datavetenskap"), впоследствии развитая Нейлом Рикертом (Neil Rickert) - Университет Северного Иллинойса - и Полом Помсом (Paul Pomes) - Университет Иллинойса в Урбана-Чампэйн - и названная UIUC IDA (последняя версия - 5.65с, не изменялась с 1991 года); а также версия IDA, развитая Полом Викси (Paul Vixie) - Digital Equipment Corporation - названная KJS (King James) и представляющая более консервативный вариант IDA, нежели у Леннарта Ловстранда. Кроме этого, многие производители модифицировали sendmail для собственных нужд.

Программа является свободным продуктом и доступна по ftp. UIUC IDA Version 5.65c - с ftp.uu.net, последние изменения в 1991 году BSD V8 sendmail - с ftp.cs.berkeley.edu . Эта версия продолжает совершенствоваться, последняя редакция (на ноябрь 1993 геда) - Version 8.6.

Посылка почтового сообщения

Если мы посмотрим на простейшее почтовое сообщение, то мы уже можем себе представить некоторые аспекты выполняемой sendmail роли. Для начала вы с использованием вашей любимой MUA-программы составляете письмо, состоящее из двух частей - заголовка и содержания. В заголовке собрана вся административная информация о сообщении: кто, кому, когда послал, данные о пересылке и многое другое. Обычно это выглядит примерно так:

From: Sergey Dobretsov sergey@open.sptu.ru
To: staff@open.sptu.ru
сс: postmaster
Subject: Mail server
Date: Mon Sep 19 16:42:28 1994
Content-Length: 319

Содержимое письма, отделенное одной пустой строкой, следует за заголовком.

После того как вы дали вашему MUA команду отправки сообщения, оно поступает под юрисдикцию sendmail. Каким образом это непосредственно происходит, зависит от 1VlUA - некоторые начинают ветвиться и запускают sendmail напрямую, задавая при этом необходимые опции в командной строке, другие используют SMNP (Simple Mail Transfer Protocol) для сообщения с процессом sendmail. Но так или иначе, ваше письмо попадает в распоряжение sendmail, где и происходит основная обработка сообщения.

Функции sendmail

В чем же причина успеха sendmail? Во-первых, sendmail обрабатывает любые сообщения, не привязываясь к конкретным протоколам передачи данных. Во-вторых, авторы очень грамотно ограничились функцией маршрутизатора, не создавая собственных средств для пользователя или для непосредственной доставки почты, а используя для этого стандартные средства. В-третьих, необходимо отметить наличие внешнего конфигурационного файла, достаточно гибкого для адаптации к быстро меняющемуся миру: хотя восьмидесятые годы принесли новые протоколы, сети и т. п., sendmail сравнительно легко приспособился и к ним.

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

если получатель находится на данной машине, использовать программу /bin/mail для локальной доставки;

если получатель находится на другой машине в сети, использовать встроенные сетевые возможности для отправки почты по SMPT через TCP/IP;

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

Кроме того, почта может передаваться с помощью UUCP по телефонным линиям или по другим сетям (например, BITNET и т. п.)

Если, к тому же, учесть, что возможно использование различной нотации адресов (например, интернетовской user@ subdomain2.subdomain1.topleveldomain и банговой host1!host2!host3! user), то возникающая задача оказывается далеко не тривиальной. Поэтому конфигурирование sendmail обычно доставляет немало трудностей даже высококвалифицированным системным администраторам, несмотря на то, что создатели предлагают несколько готовых конфигурационных файлов в составе пакета.

Различные части sendmail

Sendmail - не просто программа, а коллекция программ, файлов, каталогов и сервиса. Ключевое значение имеет конфигурационный файл, определяющий положение и поведение остальных частей и включающий правила преобразования адресов. Каталог очереди содержит почту, ожидающую отправки. Файл алиасов хранит альтернативные имена для пользователей и позволяет создавать почтовые списки. Кроме этого, имеются файлы для ведения журнала работы (обычно syslog), для записи статистики ( sendmail.st), возможно подключение внешних списков имен.

Конфигурационный файл

Конфигурационный файл содержит информацию, в которой нуждается sendmail для правильной работы. Его обычное имя - /etc/sendmail.cf; оно может быть изменено опцией -С в строке аргументов при запуске программы. Файл содержит следующие разделы (в скобках указаны команды):

Определение макросов (D)
Определение классов имен (С и F)
Задание опций (0)
Формирование заголовка (н)
Описанме агентов по доставке почты - мэйлеров (М)
Правила преобразования адреса (S - набор правил, R - правило)

Поскольку конфигурационный файл создан для обеспечения максимальной скорости работы, то на обычного человека производят впечатление криптограммы:

S3
RS+@S- $:$1<$2> ставим фокус
RS+ $1$2<$3> сдвигаем вправо

После редактирования конфирурационного файла необходимо запустить sendmail с аргументом sendmail. После этого возникнет так называемый "замороженный" файл конфигурации sendmail, с которым sendmail и будет работать.

Почтовая очередь

Не все послания могут быть отправлены немедленно. В случае задержки они сохраняются в почтовой очереди, которая обычно располагается в /var/spool/mquene (что можно изменить опцией Q в командной строке или в конфигурационном файле). Сообщения могут задерживаться по разным причинам:

Машина получателя не готова к приему

Когда письмо имеет много получателей, некоторые из них могут оказаться временно недосягаемы. Часть сообщения (например, отправляемого по медленным линиям связи) может быть задержана для более поздней отправки.

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

Посмотреть содержание почтовой очереди поможет команда mailq, которая является эквивалентом sendmail -bp.

Файл почтовых алиасов

Почтовые алиасы позволяют перенаправлять корреспонденцию, приходящую на один адрес, на другой или несколько других адресов. Они также позволяют пропускать сообщения через другие программы или добавлять их в файлы. Обычное расположение файла алиасов - /etc/aliases, но его также можно изменять опцией А в конфигурационном файле или в командной строке при запуске sendmail. Ниже приводится пример файла с различными формами алиасов (символ # означает строку комментариев):

#Обязательные алиасы
#Postmaster - тот, кто занимается проблемами электронной почты на вашем узле
 postmaster. root
#Имя обработчика почты MAILER-DAEMON
 postmaster
# Пять различных форм алиасов
# Персональный алиас, чтобы пользователь мог получать почту под разными именами
 President: eltsyn
# Список рассылки - посылать письмо к несколькии пользователям
 democrates. sobtchak, traffkin, shakhray, luzkoff, rutskoy@prison.msk.su
# Внешний список рассылки, включаемый из файла partocrates:
:include:/usr/local/communists
# Добавление писем в файл
 Zirinovsky: /dev/null
# Отправка сообщения на стандартный ввод программы (pipe)
 crypt:I/usr/local/bin/decode

В алиасах большие и маленькие буквы не имеют значения (т.е. имена postmaster, Postmaster и POSTMASTER эквивалентны).

После изменения файла алиасов необходимо выполнить команду newaliases, которая эквивалентна sendmail -bi, для перестройки базы данных алиасов.

Пользовательский почтовый список

Файл почтовых алиасов предназначен для администрирования всей системы. Однако каждый пользователь может иметь специальный файл .forward в своем домашнем каталоге. В этом файле хранится список рассылки для корреспонденции, приходящей данному пользователю. Если sendmail находит $sim$/.forward файл, то он пытается интерпретировать содержимое файла как список адресов для дальнейшей рассылки корреспонденции. Вот пример такого файла:

yekaterina:~>cat .forward.
billy-bons
john-silver
benngann@island.ocean.far
yekaterina:~>

Если в процессе чтения у sendmail возникают проблемы, файл $sim$/.forward молча игнорируется.

Другую возможность использования файла $sim$/.forward демонстрирует программа vacation. После того как вы создали текст сообщения о вашей отлучке, vacation создает $sim$/. forward файл примерно такого содержания:

yekaterina:~>cat .forward
sergey, "I/usr/ucb/vacation sergey"
yekaterina:~>

Обратный слэш backslash перед именем получателя предотвращает использование данного имени в других алиасах направляя почту непосредственно в почтовый ящик, поэтому приходящая почта будет аккуратно сохраняться до вашего прихода, а отправителю будет отсылаться заготовленное вами сообщение (типа "Меня не будет до конца года").

При использовании $sim$/.forward файла необходимо соблюдать некоторую аккуратность, чтобы не создать зацикливания почтового потока между несколькими машинами. К счастью, большинство sendmail имеют возможность выявления подобных эксцессов, и когда письмо проходит слишком много машин, его копия вместе с соответствующим сообщением попадает к почтовому администратору (postmaster), а движение самого письма останавливается.

Режимы работы sendmail

При запуске sendmail понимает два типа аргументов командной строки: если аргумент начинается с символа "-", он воспринимается как ключ, в противном случае аргумент рассматривается как адрес получателя. Основными режимами работы программы являются:

-b - "become" (режим выполнения команд)
-v - "verbose" (режим диагностики работы программы)
-d - "debugging" (режим отладки)

Кроме этого, имеется командная строка с большим количеством ключей для установки опций, конфигурации и т. п.

Режим "become" (-b). Программа sendmail может работать различным образом в зависимости от вида -b аргумента. Ниже приводится список возможных форм:

-ba - использовать устаревший ARPAnet протокол
-bd - работать в режиме daemon, т. е. выполняться в фоновом режиме, слушая порт 25 и контролируя тем самым приходящие по SMTP сообщения (синоним smtpd). Обычно в этом режиме sendmail стартует при загрузке системы (например, у меня в SunOS 4.1.2 из файла /etc/rc.local)
-bi - инициализация базы данных алиасов (синоним newaliases)
-bm - стать отправителем почты
-bp - печатать почтовую очередь (синоним mailq)
-bs - запуск SMTP на стандартный вывод (синоним bsmtpd)
-bt - тестирование: проверка разрешимости адреса
-bv - проверка (verify) без отсылки
-bz - "заморозить" конфигурационный файл

Режим диагностики ( -v - Verbose). В этом режиме sendmail печатает описание всех шагов по обработке и отправке почты.

В простейшем случае (при локальной доставке) это выглядит так:

ned:~>sendmail -v sergey < mymail
sergey... Connecting to ned (local)...
sergey... Sent

В случае связи с удаленной машиной с именем remote через UUCP:

yekaterina:~>sendmail -v you@remote < mymail
you@remote... Connecting to remote (uucp)...
you@remote... Sent

При доставке по SMTP (в данном случае с машины ned на машину yekaterina) сообщения более колоритны:

ned.~>/sendmail -v you@yekaterina < mymail
you@remote... Connecting to yekaterina.
220 yekaterina 5.65c8 Sendmail is ready at Thu,
2 Jun 1994 14:22:50 +0400
>>> HELO ned
250 Hello ned, pleased to meet you
>>> VERB
200 Verbose mode
>>> ONEX
200 Only one transaction
>>> MAIL Prom.
250 ... Sender ok
>>> RCPT To.
250 ... Recipient ok
>>> DATA
354 Enter mail, end with "с.
on а line by itself
250 Ok
>>> QUIT
221 yekaterina closing connection
you@yekaterina... Sent

Здесь видны все основные шаги диалога двух машин по протоколу SMTP, даже с соответствующими комментариями (которые, кстати, находятся в файле sendmail.hf).

Режим отладки ( -d - Debugging). Программа имеет очень богатые возможности отладки. Запуск sendmail в этом режиме выглядит так:

sendmail -d категория. уровень, категория. уровень,...)
что позволяет получать детерминированную информацию с различной подробностью.
категория - это целое неотрицательное число (например, 0),
либо диапазон целых чисел в виде меньшее-большее (например, 0-10).

Некоторые категории отладки:

-d0 - основной режим отладки
-d1 - показать информацию об отправителе
-d3 - информация о средней загруженности
-d6 - информация о неотправляемой почте
-d21 - трассировка правил переписывания адресов
-d30 - трассировка создания заголовка

уровень - это целое неотрицательное число в диапазоне от 0 до 127. Нулевой уровень означает, что не надо выдавать никакой информации, 127 соответствует максимальному уровню отладочной информации.

По умолчанию sendmail использует режим отладки -d0-99.1. Если опущен уровень, то для него берется значение 1, если пропущена категория (но уровень имеется) - используется категория 0.

Заключение

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