Файлы прототипов из архива 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, хранимых в нем команд, а также инструменты его отладки одинаковы во всех случаях.