Для преобразования адресов в правилах подстановки могут использоваться базы данных. База данных включается в часть правила, отвечающую за преобразование, посредством следующей конструкции:

$(map key [$@argument...] [$-.default] $)

Здесь map - имя, назначенное базе данных в файле sendmail.cf. Имена карт тар не ограничены теми соглашениями, которым подчиняются имена макроопределений. Подобно именам почтовых программ, имена карт используются только в файле sendmail.cf и могут быть произвольными. Выбирайте простые описательные имена, такие как «users» или «mailboxes». Имя карты назначается при помощи команды К, о которой мы скоро поговорим.

key - это значение индекса записи из базы данных. Значение, возвращаемое базой данных по этому ключу, используется для переписывания исходного адреса. Если значение отсутствует, исходный адрес не изменяется, если только не указано значение default.

argument - дополнительное значение, передаваемое подпрограмме работы с базой данных наряду с ключом. Аргументов может быть несколько, но каждый аргумент должен начинаться сочетанием символов Аргумент может использоваться подпрограммой для изменения значений, возвращаемых в sendmail. В базе данных ссылки на аргументы имеют формат %п, где п - цифра, указывающая порядковый номер аргумента в правиле подстановки - % 1, %2 и т. д. - для случаев, когда аргументов несколько. (Аргумент %0 - это ключ, key.)

Следующий пример прояснит использование аргументов. Рассмотрим такой исходный адрес:

torn.martin<@sugar>

Предположим, что существует база данных, хранящая внутренние имена sendmail для узлов пересылки:

oil %1<®relay.fats.com>
sugar %1<@relay.calories.com>
salt %1<@server.sodium.org>

Кроме того, предположим, что есть следующее правило подстановки:

R$+<@$-> $(relays $2 $@ $1 $:$1<@$2> $)

Исходный адрес tom.martin<@sugar> соответствует шаблону, поскольку содержит одну или более лексем (torn.martin) перед литералом <@ и ровно одну лексему (sugar) после этого литерала. Сопоставление с шаблоном приводит к созданию двух неопределенных лексем и передаче их в часть преобразования.


В преобразовании происходит обращение к базе данных (relays) с передачей лексемы $2 (sugar) в качестве ключа и лексемы $1 (torn.martin) в качестве аргумента. Если ключ не найден в базе данных, используется значение по умолчанию ($1<@$2>). В данном случае ключ в базе данных существует. Подпрограмма базы данных использует ключ для поиска значения «% Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.», подставляет аргумент %1 и окончательно возвращает sendmail значение «Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.». sendmail использует полученное значение для замены исходного адреса.

Прежде чем использовать базу данных в sendmail, ее необходимо определить. Этой цели служит команда К. Синтаксис команды К:

Кпате type [arguments]

name - это имя, по которому можно ссылаться на базу данных из настроек tiendmail. В приведенном выше примере фигурировало имя «relays».

type - это класс базы данных. Значение type в команде К должно соответствовать возможностям работы с базами данных, встроенным в sendmail при компиляции. Большинство исполняемых файлов sendmail поддерживает не все типы баз данных, однако ряд основных типов поддерживается достаточно широко. Общеупотребительные типы: hash, btree, nis. Типов существует гораздо больше, и все они описаны в приложении Е.

Аргументы (arguments) являются необязательными. Обычно единственным аргументом оказывается путь к файлу базы данных. Время от времени аргументы включают флаги, интерпретируемые подпрограммой базы данных. Полный перечень флагов команды К содержится в приложении Е.

Чтобы определить базу данных «relays» из приведенного выше примера, мы можем использовать следующую команду в файле sendmail.cf:

Krelays hash /etc/mail/relays

Имя relays - просто имя, выбранное пользователем в качестве описательного. Тип базы данных hash - это тип, поддерживаемый вашей версией sendmail, он использовался и для создания файла базы данных. Наконец, аргумент I etc I mail I relays - полное имя файла базы данных.

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