Поле преобразования в правой части правила подстановки определяет формат, в который переписывается адрес.
Формат определяется при помощи тех же элементов, что и шаблон: литералов, макроопределений и специальных метасимволов. Литералы в преобразованиях попадают в новый адрес без изменений. Для макроопределений выполняется подстановка. Метасимволы решают специальные задачи. Метасимволы преобразований и их функциональность описаны в табл. 10.4.
Таблица 10.4. Метасимволы преобразований
Символ | Значение |
$n | Подстановка неопределенной лексемы п |
$[name$] | Подстановка канонической формы имени пате |
Символ | Значение |
$map key$@argument $:default$) | Подстановка значения из карты тар по индексу key |
$>n | Вызов набора правил п |
$@ | Завершение набора правил |
$: | Завершение правила подстановки |
Си мвол $n, где n — число, используется для подстановки неопределенных лексем, обсуждавшихся выше. После подстановки неопределенная лексема ваписывается в «новый» адрес. Подстановка неопределенных лексем - важнейшая составляющая гибкого переписывания адресов. Она дает возможность простого переноса значений из исходного адреса в конечный адрес. Следующий пример иллюстрирует сказанное.
Адрес всегда обрабатывается рядом правил подстановки. Универсальных правил не бывает. Предположим, исходный адрес mccafferty@rodent подвергся некоторой предварительной обработке и принял вид:
kathy.mccafferty<@rodent>
Предположим, что текущее правило подстановки
R$+<0$-> $<1@$2.$D> user@host -> Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Адрес соответствует шаблону, поскольку содержит одну или более лексем перед литералом <@, ровно одну лексему после литерала <@, а также литерал >. Сопоставление с шаблоном при переписывании адреса приводит к созданию двух неопределенных лексем, используемых для преобразования.
Поле преобразования содержит неопределенную лексему $1, литерал <@, неопределенную лексему $2, литерал точки ( .), ссылку на макроопределение D, н также литерал >. После сопоставления с шаблоном $1 содержит kathy. mccafferty, а $2 содержит rodent. Предположим, что макроопределение D было создано ранее в файле sendmail.cf и хранит значение wrotethebook.com. В результате исходный адрес переписывается следующим образом:
kathy.mccafferty<@rodent.wrotethebook.com>
Рисунок 10.3 иллюстрирует данное конкретное преобразование адреса. Показаны лексемы, выделенные из исходного адреса, а также их сопоставление с шаблоном. Представлены также неопределенные лексемы, созданные при сопоставлении с шаблоном, и их использование наряду с другими значениями поля преобразования для создания конечного, измененного адреса. После подстановки адрес снова сравнивается с шаблоном. На этот раз с отрицательным результатом, поскольку адрес уже не содержит одну и только одну лексему между литералами <@ и >. Итак, адрес не подвергается дальнейшей обработке данным правилом подстановки, но передается следующему по очереди правилу. Правила набора выполняются последовательно, хотя для изменения порядка их обработки могут использоваться некоторые метасимволы.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Рис. 10.3. Переписывание адреса
Символ $>л вызывает набор правил п и передает этому набору адрес, созданный оставшимися инструкциями поля преобразования. Например:
$>9 $1 % $2
Это преобразование вызывает набор правил 9 ($>9) и передает этому набору для обработки содержимое лексемы $1, символ %, а также содержимое лексемы $2. Когда набор правил 9 заканчивает работу, он возвращает обработанный адрес вызвавшему его правилу. Этот адрес снова сравнивается с шаблоном вызывающего правила. Если соответствие найдено, набор правил 9 вызывается повторно.
Рекурсия, присущая правилам подстановки, потенциально позволяет создавать бесконечные циклы, sendmail, как может, старается обнаружить возможные циклы, однако ответственность за создание правил, ведущих к зацикливанию, лежит на их авторе.
Символы $@ и $: используются для управления обработкой и предотвращения зацикливания. Если преобразование начинается символом весь набор правил завершается и остаток поля преобразования возвращается набором правил. Если преобразование начинается символом $:, данное конкретное правило выполняется лишь единожды. Используйте $: для предотвращения рекурсии и зацикливания при вызове других наборов правил. Используйте для прерывания обработки набора правил на конкретном правиле.
Символ $[ла/пе$] преобразует псевдоним узла или его адрес IP в каноническое имя узла. С этой целью значение name передается для разрешения серверу имен. К примеру, при обращении к серверам имен домена wrotethebook.com $[mouse$] возвращает rodent.wrotethebook.com, а $[[172. 16.12.1]$] возвращает crab.wrotethebook.com.
Подобно тому как имя узла или адрес используется для поиска канонического имени в базе данных сервера имен, ключ {key) может использоваться для извлечения информации из базы данных (тар) при помощи конструкции $(шр кеу%). Здесь мы имеем дело с более сложным в применении и более общим синтаксисом работы с базой данных, чем в случае извлечения канонических имен. Прежде чем перейти к подробностям создания и использования баз данных для sendmail, закончим разбираться с синтаксисом правил подстановки.
— Разгрузит мастера, специалиста или компанию;
— Позволит гибко управлять расписанием и загрузкой;
— Разошлет оповещения о новых услугах или акциях;
— Позволит принять оплату на карту/кошелек/счет;
— Позволит записываться на групповые и персональные посещения;
— Поможет получить от клиента отзывы о визите к вам;
— Включает в себя сервис чаевых.
Для новых пользователей первый месяц бесплатно. Зарегистрироваться в сервисе
Существует специальный синтаксис правил подстановки, используемый в наборе правил 0. В наборе правил 0 определена тройка значений (mailer, host, user), указывающая программу доставки почты, узел-получатель, а также адресата почты.
Специальный синтаксис преобразования, решающий задачу, выглядит следующим образом:
$#mailer$@host$:user
Пример использования такой конструкции из файла generic-linux.cf:
R$*<@$*>$ » $#esmtp $@ $2 $: $1 < @ $2 > $3 Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Предположим, что данным правилом обрабатывается адрес электронной почты david<@ora.wrotethebook.com>. Этот адрес соответствует шаблону $*<@$+>$* по следующим причинам:
- Нуль или более лексем (david) соответствуют первому символу $*
- Адрес содержит литерал <@
- Нуль или более лексем (пять лексем фрагмента ora.wrotethebook.com) соответствуют требованиям второго символа $*
- Адрес содержит литерал >
- Нуль или более (в данном случае нуль) лексем соответствуют требованиям последнего символа $*
Сопоставление адреса с шаблоном приводит к созданию двух неопределенных лексем. Лексема $1 содержит david, а лексема $2 содержит ora.wrotethebook.com. Других соответствий не было, поэтому лексема $3 пуста. Эти неопределенные лексемы используются для переписывания адреса в следующую тройку значений:
$#smtp$@ora.wrotethebook.com$:david<@ora.wrotethebook.com>
Компоненты результата:
$#smtp smtp - внутреннее имя почтовой программы, доставляющей сообщение. $@ога.wrotethebook.com ога. wrotethebook. com - узел-получатель. $:david<@ora.wrotethebook.com> david<@ora.wrotethebook.com> - пользователь-адресат.
Существует ряд вариаций синтаксиса тройки значений почтовой программы, которые также используются в шаблонах некоторых правил. Две из таких вариаций содержат только составляющую «почтовой программы».
$#OK
Указывает, что исходный адрес прошел проверку безопасности. К примеру, адресу разрешена пересылка почтовых сообщений.
$#discard
Указывает, что исходный адрес не прошел тот или иной тест безопасности и сообщение электронной почты должно быть удалено.
Ни одно из значений - OK, discard и error - не фигурирует в командах М наряду с реальными почтовыми программами. Однако в документации по sendmail эти значения названы «почтовыми программами»; этой терминологии мы здесь и следуем.
Почтовые программы $#0К и $#discard используются в управлении пересылкой и в безопасности. Почтовая программа $#discard молча удаляет почту и не возвращает отправителю сообщение об ошибке. Почтовая программа $#error также работает с почтовыми сообщениями, не подлежащими доставке, однако, в отличие от $#discard, возвращает отправителю сообщение об ошибке. Конструкция шаблона для почтовой программы $#error сложнее, чем синтаксис $#0К и $#discard. Выглядит она следующим образом:
$#error $@dsn-code $:message
В качестве значения почтовой программы должно выступать $#ег г or. Поле $: message содержит текст сообщения об ошибке, который необходимо передать отправителю. Поле $@dsn-code необязательное. Если оно присутствует, то предшествует сообщению message и должно содержать корректный код DSN (Delivery Status Notification, уведомление о состоянии доставки). Коды DSN определены в RFC 1893 , Mail System Status Codes (Коды состояний почтовой системы).
Код DSN состоит из трех компонентов, разделенных точками:
клас с (class) - Всеобъемлющая классификация состояния. В RFC для класса определены такие значения: 2 означает успешное завершение, 4 означает времен- ный сбой, а 5 - постоянный сбой.
предмет (subject) - Соотносит сообщения об ошибках с одной из восьми категорий:
0 (Неопределенная)
Невозможно причислить ошибку к определенной категории.
1 (Адресация)
Проблема, связанная с адресом.
2 (Почтовый ящик)
Проблема, связанная с почтовым ящиком доставки.
3 (Почтовая система)
Проблема, связанная с системой доставки почты второй стороны.
4 (Сеть)
Проблема, связанная с сетевой инфраструктурой.
5 (Протокол)
Проблема, связанная с протоколом.
6 (Содержимое)
Содержимое сообщения вызвало ошибку преобразования.
7 (Безопасность)
Проблема, связанная с безопасностью.
подробност и (detail) - Содержит подробные сведения по конкретной ошибке. Значение detail осмысленно только в контексте кода subject. К примеру, х. 1.1 означает несуществующее имя пользователя-адресата, а х. 2.1 означает, что почтовый ящик заблокирован, тогда как х.2. 2 - что почтовый ящик полон. Значений detail слишком много, чтобы перечислять их здесь. Полный список содержится в RFC 1893.
Сообщение об ошибке, записанное в целевом представлении DSN, может выглядеть следующим образом:
R<@$+ > $#еггог$@5.1.1$:"user address required"
Это правило возвращает код DSN 5.1.1 и сообщение "user address required", если адрес соответствует шаблону. Код DSN состоит из значения 5 в поле класса (постоянная ошибка), значения 1 в поле предмета (сбой адресации) и значения 1 в поле подробностей (с учетом, что subject имеет значение 1, речь идет о некорректном адресе пользователя).
Коды ошибок и синтаксис ошибок - составная часть сложных параметров настройки, используемых для управления пересылкой и безопасностью. Эти значения генерируются макроопределениями ш4, предназначенными для работы со сложными механизмами. Очень редко эти значения добавляются в файл sendmail.cf напрямую системным администратором.