Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
net_tech / Лабораторнаработа 5 (E-mail).doc
Скачиваний:
27
Добавлен:
10.12.2013
Размер:
269.82 Кб
Скачать

Правила

R - описать правило, описания правил выглядят как

Rшаблон действие

Левая (шаблон) и правая (действие) части разделяются символом табуляции. Пробелы недопустимы.

Каждое правило применяется к некоторому рабочему пространству (workspace), которое представляет собой строку, представленную в виде упорядоченного списка токенов (элементов). Пример "токенизации": рабочее пространство "m2@vvsu.ru" интерпретируется в правилах как список из 5 токенов: "m2", "@", "vvsu", ".", "ru".

Левая часть правила содержит образец (шаблон), также интерпретируемый как список токенов. Правило работает следующим образом: если рабочее пространство соответствует шаблону, то оно принимает значение правой части правила (кроме правил выбора агентов доставки, которые будут рассмотрены ниже). Правило аналогично циклу "while" - оно выполняется до тех пор, пока рабочее пространство не перестанет соответствовать шаблону.

Правила группируются в наборы правил, начало набора правил обозначается меткой S, за которой следует идентификатор набора (число или строка), например, S0 или Smy_ruleset (строчные и прописные буквы различаются). Один набор правил кончается там, где начинается другой. Правила в наборе выполняют какую-либо общую задачу.

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

В левой части правил, помимо токенов с буквальным текстом, могут встречаться регулярные выражения:

$*   ноль и более токенов,

$-   один токен,

$+   один и более токенов,

$@   ноль токенов,

$=X   один токен из класса X,

$~X   один токен не из класса X.

Пример:

R$+.vvsu.ru vvsu.ru

Это правило для адресов из домена vvsu.ru исключает из рабочего пространства все, кроме собственно имени домена.

В правой части правила, помимо буквального текста, могут встречаться специальные операторы. Некоторые из них ниже:

$N ($1,$2,...) - подстановка значения N-го регулярного выражения из левой части. Например:

R$*. $1

это правило удаляет все точки с конца рабочего пространства, если они там есть: $1 производит подстановку 1-го регулярного выражения из левой части ($*), которая соответствует всему рабочему пространству за исключением замыкающей точки, после этого рабочее пространство опять сравнивается с шаблоном.

R$* <@$-.vvsu.ru> $* $1 <@vvsu.ru> $3

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

$[ name $] - вместо этого оператора подставить каноническое имя DNS для name.

$>N - вызвать набор правил N (о группировке правил в наборы см. ниже). Набор правил можно рассматривать как функцию. Рассмотрим пример: пусть правая часть правила выглядит "$1 $>33 $2". Имеет место следующая последовательность действий: правая часть вычисляется как если бы "$>33" отсутствовало, т.е. формируется новое рабочее пространство, состоящее из подстановок значений $1 и $2. После этого вызывается набор правил 33, а в качестве рабочего пространства в него передается то, что стоит справа от "$>33" (т.е. значение подстановки $2). Набор 33, последовательно применяя правила, из которых он состоит, как-то модифицирует переданное ему рабочее пространство. После завершения его работы полученный результат помещается в рабочее пространство текущего правила вместо того, что стояло справа от "$>33".

$: - применить это правило один раз ("while" превращается в "if"). Оператор используется как префикс правой части. Пример (заключение рабочего пространства в скобки):

R$* $: <$1>

(иначе возник бы бесконечный цикл).

$@ - применить это правило один раз ("if") и прервать выполнение набора правил (аналогично досрочному выходу из функции). Оператор используется как префикс правой части. Пример:

R$* <@$-> $* $@ $1<@ $[ $2 $] > $3

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