Последняя из добавленных нами в исходный файл т4 возможностей - FE- ATURE (genericstable) - включает процесс работы с базой данных в задачу преобразования электронного адреса (регистрационного имени пользовате- ля в имя и фамилию пользователя). Чтобы повторить здесь те же действия, создайте текстовый файл регистрационных имен и имен/фамилий пользова- телей. На основе этого файла создается база данных посредством makemap.
# cd /etc/mail # cat realnames dan Dan.Scribner tyler Tyler.McCafferty pat Pat.Stover willy Bill.Wright craig Craig.Hunt # makemap hash realnames < realnames
Когда база данных создана, создайте определения для sendmail. С этой целью воспользуйтесь командой К. Чтобы воспользоваться только что соз- данной нами базой данных, добавьте следующие строки в раздел локальной информации (Local Information) файла sendmail.cf:
# define a database to ma p login names to firstname.lastname Krealnames hash /etc/mail/realnames
Команда К определяет realnames в качестве внутреннего имени sendmail для этой базы данных. Кроме того, она указывает, что база данных имеет тип hash, а ее полное имя - /etc/realnames. sendmail добавляет к именам файлов баз данных нужные расширения исходя из их типа, так что о расширениях можете не беспокоиться.
Наконец, мы добавляем новое правило, в котором база данных используется для перезаписи адресов. Добавляем мы его в наборы правил EnvFromSMTP и HdrFromSMTP - сразу после строк в этих наборах, вызывающих набор MasqHdr. В этом случае наше новое правило обрабатывает адрес сразу после того, как закончится его обработка набором правил MasqHdr.
# when masquerading convert login name to firstname.lastname R$-<@$M.>$* $:$(realnames $1 $)<@$M.>$2 user=>first.last
Данное правило обрабатывает вывод набора правил MasqHdr, отвечающего за перезапись раздела узла в адресе.
Адреса, соответствующие условиям перезаписи раздела узла, также должны подвергаться перезаписи раздела пользователя. Взгляните на вывод набора правил MasqHdr из приведенного ранее теста. Адрес craig<@wrotethebook.com.> соответствует шаблону $-<@$М >$*. В адресе ровно одна лексема (craig) перед литералом <@, за которым следует значение М (wrotethebook.com), литерал .>, а затем нулевое число лексем.
Секция преобразования этого правила использует первую лексему ($1) исходного адреса в качестве ключа базы данных realnames, на что указывает синтакси с $:$( realnames $ 1 $) . Дл я адрес а craig<@wrotethebook.com> $ 1 имеет значение craig. Запрос по этому индексу, обращенный к базе данных realnames, приводимой в начале данного раздела, возвращает значение Crаig.Hunt. Это значение предваряет литерал <@, значение макроопределения М ($М) , литерал .>, а также значение $2, как предписывается секцией преобразования <@$М. >$2. В результате действия этого нового правила регистрационное имя пользователя в адресе преобразуется в настоящее имя и фамилию пользователя.
Когда это правило добавлено в наборы EnvFromSMTP и HdrFromSMTP, тест дает следующие результаты:
# sendmail -bt -Ctest.cf AODRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > /tryflags HS > /try esmtp craig Trying header sender address craig for mailer esmtp canonify input: craig Canonify2 input: craig Canonify2 returns: craig canonify returns: craig 1 input: craig 1 returns: craig HdrFromSMTP input: craig PseudoToReal input: craig PseudoToReal returns: craig MasqSMTP input: craig MasqSMTP returns: craig < e * LOCAL* > MasqHdr input: craig < @ *LOCAL* > MasqHdr returns: craig < @ wrotethebook . com > HdrFromSMTP returns: Craig Hunt < @ wrotethebook . com final input: Craig Hunt < @ wrotethebook . com final returns: Craig Hunt @ wrotethebook . com Rcode =0, addr = Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. > /tryflags ES > /try esmtp craig Trying envelope sender address craig for mailer esmtp canonify input: craig Canonify2 input: craig Canonify2 returns: craig canonify returns: craig 1 input: craig 1 returns: craig EnvFromSMTP input: craig PseudoToReal input: craig PseudoToReal returns: craig MasqSMTP input: craig MasqSMTP returns: craig < 0 *LOCAL* > MasqEnv input: craig < @ *LOCAL* > MasqHdr input: craig < * LOCAL* > MasqHdr returns: craig < @ wrotethebook . com . > MasqEnv returns: craig < @ wrotethebook . com . > EnvFromSMTP returns: Craig Hunt < @ wrotethebook . com . > final input: Craig Hunt < @ wrotethebook . com . > final returns: Craig Hunt @ wrotethebook . com Rcode = 0, addr = Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. > /quit
Если тесты не приводят к получению нужных результатов, убедитесь, что вы правильно набрали новые правила подстановки и корректно создали базу данных. Может возникнуть также следующее сообщение об ошибке:
test.cf : line 116: readcf: ma p realnames: class hash not available
Сообщение свидетельствует о том, что ваша система не поддерживает ассоциативные базы данных. Можно попробовать изменить тип базы данных в строке команды К и повторно выполнить sendmail -bt, пока не будет найден тип, с которым работает sendmail. В этом случае необходимо также повторно выполнить makemap для каждого нового типа базы данных. Если ваша версия sendmail не поддерживает никакие типы баз данных, обратитесь к приложению Е за информацией о перекомпиляции sendmail с поддержкой баз данных.
Обратите внимание, что все изменения, вносимые непосредственно в sendmail.cf во второй половине этой главы (сокрытие адреса отправителя, сокрытие адреса конверта, преобразование имен пользователей), в исходном файле m4 отражены всего лишь тремя строками. Эти примеры демонстрируют использование инструментов тестирования sendmail. Если вам действительно нужны новые, специальные настройки, воспользуйтесь m4. Настройки sendmail проще всего сопровождать и развивать посредством исходного файла m4.