Файлы прототипов из архива sendmail не готовы к мгновенному применению. Их необходимо отредактировать и обработать макропроцессором ш4 , чтобы получить собственно файлы настройки. Например, файл tcpproto.mc содержит такие макроопределения:

divert(0)dnl
VERSIONIDCSId: ch10,v 1.3 2002/03/01 21:02:23 sue Exp emily $')
OSTYPEC unknown)
FEATURE('nouucp', 'reject')
HAILERC local')
MAILER('smtp')

Эти макроопределения не являются командами sendmail; они представляют собой исходные данные для макропроцессора ш4. Приведенные строки файла прототипа активны, их предваряет блок комментариев (не отраженный в листинге), который ш4 игнорирует, поскольку этот блок следует за командой divert(-1), перенаправляющей вывод в «никуда». Данный блок файла начинается командой divert(O), то есть команды обрабатываются, а результаты направляются на стандартный вывод.

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

Макроопределение VERSIONID используется для управления версиями. Как правило, значение данного макровызова является номером версии в формате RCS (Release Control System) или SCCS (Source Code Control System). Данное макроопределение - необязательное, его можно смело игнорировать.

OSTYPE определяет специфичную для операционной системы информацию настройки. Каталог cf/ostype содержит почти 50 файлов макроопределений для различных операционных систем. Макроопределение OSTYPE - обязательное, и передаваемое в его вызове значение должно совпадать с именем одного из файлов упомянутого каталога. Примеры значений: bsd4.4, solarise, linux.

FEATURE определяет необязательные возможности, включаемые в файл sendmail.cf. В данном примере значение nouucp указывает, что адреса UUCP в этой системе не используются.


Аргумент reject предписывает отвергать локальные адреса в стиле UUCP, то есть содержащие символ ! в локальной части. Вспомним, что в предшествующем разделе мы описали tcpproto.mc как файл прототипа для систем без соединений UUCP. В другом файле прототипа будут иные значения FEATURE.

Файл прототипа завершается макроопределениями почтовой программы. В исходном файле они должны занимать последние места. Приведенный пример содержит макроопределения локальной почтовой программы и почтовой программы SMTP.

В макроопределении MAILER(local) фигурирует почтовая программа local, выполняющая доставку локальной почты между пользователями системы, а также программа prog, передающая почтовые файлы программам, работающим в системе. Все базовые файлы с макроопределениями содержат определение MAILER(local), поскольку почтовые программы local и prog реализуют необходимые службы локальной доставки почты. Определение MAILER(smtp) включает все почтовые программы, необходимые для передачи SMTP-почты по сети TCP/IP. В данный набор включены следующие почтовые программы:

smtp - Обрабатывает традиционную почту SMTP в формате ASCII 7-бит. Программа устарела, поскольку современные почтовые сети умеют работать с разнообразными типами данных.

esmtp - Поддерживает протокол Extended SMTP (ESMTP). Понимает расширения протокола ESMTP и способна работать со сложносоставными сообщениями и более совершенными типами данных MIME-почты. Для SMTP-почты это почтовая программа, используемая по умолчанию.

smtp8 - Передает удаленному серверу 8-битные данные, даже если удаленный сервер не подтвердил свою способность принимать такие данные. Обычно сервер, поддерживающий работу с 8-битными данными, поддерживает также ESMTP и способен сообщить о поддержке 8 битов в ответ на команду EHLO. (Описание протокола SMTP и команды EHLO содержится в главе 3.) Однако возможен случай подключения к удаленному серверу, который поддерживает 8-битные данные, но не поддерживает ESMTP. И для таких редких случаев существует почтовая программа smtp8.


dsmtp - Позволяет конечной системе получать почту из очереди на сервере. Обычно система-источник сама является инициатором передачи почты, как бы «выталкивает» ее на конечную систему, dsmtp, напротив, позволяет конечной системе получить почту с сервера по запросу, как бы «вытянуть» ее. Данная почтовая программа реализует команду ETRN, разрешающую доставку по запросу. (Команда ETRN описана в документе RFC 1985.)

relay - Эта почтовая программа используется, если требуется пересылка SMTPпочты через промежуточный почтовый сервер. Узлов промежуточной пересылки почты может быть несколько.

Каждый сервер, подключенный к Интернету или обменивающийся с ним данными, использует набор почтовых программ MAILER(smtp), как и большинство систем изолированных сетей, поскольку в сетях предприятий также используется TCP/IP. Большинство систем sendmail требуют присутствия этих почтовых программ, однако их установка не происходит по умолчанию. Поддержка почты SMTP требует присутствия макроопределения MAILER(smtp) в настройках, почему данное макроопределение и включается в файл прототипа.

Кроме этих двух важных наборов почтовых программ, команда MAILER предоставляет доступ еще к девяти наборам. Описания наборов содержатся в приложении Е. Большая их часть не представляет интереса для средней конфигурации. Двумя наборами почтовых программ, включенными в настройки tcpproto.mc, ограничивается большинство администраторов.

Чтобы создать пример файла sendmail.cf на основе файла прототипа tcpproto.mc, скопируйте файл прототипа в рабочий файл. Отредактируйте рабочий файл: необходимо подставить в строку OSTYPE корректное для вашей операционной системы значение вместо unknown (к примеру, solaris8 или linux). В следующем примере мы использовали sed, чтобы заменить unknown на linux. Результат мы сохраняем в файле под именем linux.mc:

tt sed 's/unknown/linux/' < tcpproto.mc > linux.mc

Теперь выполним команду m4 :

m4 ../m4/cf.m4 linux.mc > sendmail.cf

Файл sendmail.cf, результат выполнения команды т4, имеет формат, подходящий для чтения программой sendmail. За исключением вопросов обработки адресов UUCP, полученный файл схож с файлом примера generic-linux.cf из дистрибутива sendmail.

OSTYPE - не единственный элемент файла макроопределений, поддающийся изменению с целью создания частного случая настройки. Существует большое число параметров настройки, и все они описаны в приложении Е. Для примера мы изменим некоторые параметры с целью создания настроек, приводящих к преобразованию почтовых адресов вида user@host, исходящих с нашей машины, в формат firstname.lastname@domain. С этой целью мы создадим два новых файла настройки: файл макроопределений с конкретными значениями для домена - под именем wrotethebook.com.m4, а также измененный файл управления макроопределениями, linux.mc, включающий новый файл wrotethebook.com.m4.

Файл wrotethebook.com.m4, который мы сохранили в каталоге cf/domain, со- держит такие строки:

$ cat domain/wrotethebook.com.ш4 
MASQUERADE_AS(wrotethebook.com)
FEATURE(masque rade_envelope)
FEATURE(genericstable)

Эти строки указывают, что мы хотим скрыть действительное имя узла и для исходящих писем в адресе электронной почты заменять его на wrotethebook.com. Помимо адресов из заголовков сообщений, мы предписываем то же действие для адресов «конвертов» (envelope). Первые две строки отвечают за преобразование имени узла в электронных адресах исходящих сообщений.

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

Формат базы данных может быть очень простым:

dan Dan.Scribner tyler Tyler.McCafferty pat Pat.Stover willy Bill.Wright craig Craig.Hunt


Каждая строка данного файла состоит из двух полей: первое поле содержит ключ, то есть регистрационное имя пользователя, а второе поле - имя и фамилию пользователя, разделенные точкой. В качестве разделителей полей выступают пробелы. Запрос по имени dan для этой базы возвращает результат Dan.Scribner. Небольшую базу данных вроде этой можно легко создать вручную. В системе с большим числом пользовательских учетных записей процесс лучше автоматизировать извлечением регистрационного имени, имени и фамилии пользователя из файла /etc/passwd. Поле gcos файла /etc/ passwd часто содержит настоящее имя пользователя. После сохранения данных в текстовом файле их необходимо преобразовать в базу данных посредством команды makemap. Программа makemap входит в состав дистрибутива sendmail. Ее синтаксис выглядит следующим образом:

makemap type name

makemap читает стандартный ввод и записывает базу данных в файл name. Поле type определяет тип базы данных. Наиболее распространенные типы баз данных для sendmail: dbm, btree и hash. Базы данных всех этих типов могут создаваться при помощи команды makemap. Предположим, что приведенные выше данные мы сохранили в файле realnames. Следующая команда преобразует этот файл в базу данных:

makemap hash genericstable < realnames

makemap читает текстовый файл и создает файл базы данных с именем genericstable. Эта база данных связывает регистрационные имена пользователей с их настоящими именами, то есть по ключу willy возвращается значение Bill.Wright.

После создания базы данных следует создать файл настройки, где она будет задействована. Все макроопределения, связанные с использованием базы данных, хранятся в файле wrotethebook.com.m4. Нам необходимо включить этот файл в настройки. С этой целью мы добавим строку DOMAIN(wrotethebook.com) в управляющий файл (linux.mc), а затем обработаем файл linux.mc процессором ш4. Следующая команда grep показывает, как выглядят макроопределения в файле после внесения изменений:


# flrep '"[A-Z]' linux.mc
VERSIONIDCSId: chlO.v 1.3 2002/03/01 21:02:23 sue Exp emily $")
v OSTYPE(linux)
DOMAIN("wrotethebook.com')
FEATURE("nouucp", "reject")
MAILERC local")
MAILERCsmtp")
# m4 ../m4/cf.m4 linux.mc > sendmail.cf

При установке sendmail из tar-архива используйте тс-файл прототипа в ка- честве отправной точки настройки. Чтобы использовать наиболее актуальную версию sendmail, необходимо создать совместимый файл sendmail.cf при помощи макроопределений ш4. Не пытайтесь использовать старый файл sendmail.cf с новой версией sendmail; этим вы только наживете неприятности. Как можно видеть из приведенных выше примеров, файлы настройки т4 весьма лаконичны и могут состоять из небольшого числа макроопределений. Используйте т4 для создания новых настроек при каждом обновлении sendmail.

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

В следующей части главы мы воспользуемся одним из примеров файла sendmail.cf из дистрибутива Linux. Если точнее, мы начнем с файла generic-linux.cf, расположенного в каталоге cf/cf, дистрибутива sendmail. Все сведения, приводимые на протяжении оставшейся части главы, применимы в равной степени и к файлам sendmail.cf, созданным при помощи т4. Структура файла sendmail.cf, хранимых в нем команд, а также инструменты его отладки одинаковы во всех случаях.