Перезапись адресов
Перезапись может быть
1. Автоматическая
2. Глобальная или основная (Main)
3. Транспортная
Рассмотрим глобальную перезапись.
Она настраивается в секции перезаписи конфигурации Exim.
Начинается строкой
begin rewrite
После чего идут правила перезаписи.
Глобальная перезапись применяется
1. Во время приема сообщения по SMTP (флаг S, подробности смотри ниже)
2. После того как сообщение принято, но еще не доставлено
(наиболее распространенный случай настройки)
3. После того как сгенерирован новый адрес в результате
форвардинга или алиасинга
В конфиге задаются (подробности формата правил перезаписи смотри ниже)
1. Адрес (шаблон), который нужно заменить
2. Адрес, на который нужно заменить
3. Флаги, воздействующие на поведение перезаписи (где менять адрес, как менять и пр.)
Перезапись может находить и менять адрес в
(Находит и перезаписывает адрес во всех этих местах, если не указаны флаги)
1. В конверте сообщения
2. В строках заголовка сообщения (сокращенно заголовки):
Bcc:, Cc:, From:, Reply-To:, Sender:, и To:
Как действуют правила:
Exim полностью перезаписывает адрес, потом переходит к следующему правилу перезаписи.
Примечание:
Так как в глобальной перезаписи обычно сообщение уже принято, но перед доставкой,
то по всей видимости такие переменные как
$domain и $local_part не будут еще установлены, поэтому их использование
в правилах глобальной перезаписи не рекомендуется.
К тому же вместо них нужно использовать $domain_data и $local_part_data,
и если вы хотите использовать их, то используйте их в транспортной перезаписи,
когда они становятся доступны. Иначе вы получите результат,
когда правило может работать не так как вы думаете или запланировали.
Примечание:
В транспортной перезаписи не доступна перезапись адресов в конверте,
кроме отправителя в конверте опцией return_path в транспорте.
Также в документации Exim не рекомендуется использовать правила перезаписи
для маршрутизации сообщений, хотя это возможно.
Формат правил перезаписи
pattern replacement flags
pattern - это шаблон который проверяется на совпадение с адресом
replacement - на то что меняется совпавший адрес
flags - флаги, воздействующие на перезапись
Какие бывают флаги:
- флаги которые указывают на строки заголовка и поля конверта:
E, F, T, b, c, f, h, r, s, t
- флаги которые контролируют процесс перезаписи
Q, q, R, w
- флаг который указывает перезапись во время SMTP
S
Примечание:
Для транспортной перезаписи, правила применяются только к строкам заголовка.
Флаги для транспортной записи E, F, S и T не применяются.
Флаги к выбранным адресам:
E Перезаписать все поля в конверте F Перезаписать поле From в конверте T Перезаписать поле To в конверте b Перезаписать заголовок Bcc: c Перезаписать заголовок Cc: f Перезаписать заголовок From: h Перезаписать все заголовки r Перезаписать заголовок Reply-To: s Перезаписать заголовок Sender: t Перезаписать заголовок To:
Флаги контроля перезаписи
Q Разрешает неполный адрес (без домена), квалифицируется
доменом в опции qualify_recipient
q Дальнейшие правила перезаписи не будут рассматриваться,
даже если перезаписи не было
R Заставляет правило перезаписи быть перепременимым
к новым адресам до 10 раз
w Обычно перезапись применяется только к рабочей части адреса,
не затрагивая комментарий. Чтобы поменять и комментарий
нужен флаг w
Например, нужно поменять адрес
Ford <fp42@restaurant.hitch.example>
на
"F.J. Prefect" <prefect@hitch.example>
S Флаг перезаписи S указывает правило которое применяется к входным адресам конверта во-время-SMTP, как только каждая команда MAIL или RCPT принята и перед любой другой обработкой, даже перед проверкой синтаксиса. Эта форма правила перезаписи позволяет обрабатывать адреса которые не соответствуют RFC 821
Если используется звездочка в шаблоне:
$0 относится к полному адресу,
$1 относится к первой звездочке, и
$2 относится ко второй звездочке,
если она представлена.
Например:
*queen@*.example
к этому шаблону подходит адрес
hearts-queen@wonderland.example
с тремя переменными:
$0 = hearts-queen@wonderland.example
$1 = hearts-
$2 = wonderland
Примеры правил
Самый простой:
ph10@workshop.exim.example P.Hazel@exim.example
Посложнее, с поиском в индексном файле
*@*.exim.example $1@exim.example
*@exim.example ${lookup{$1}dbm{/etc/realnames}\
{$value}fail}@exim.example frsF
С условиями
*@*.hitch.example "${if !eq {$sender_host_address}{}\
{$1@hitch.example}fail}"
Шаблон с регулярным выражением (это пример шаблона - не правило)
ˆ(red|white)\.king@(wonderland|lookingglass)\.example$
Перезаписать адрес отправителя: в конверте и в заголовках, если тема сообщения MN, для адресов отправителей имеющих домен domain.local
*@domain.local "${if eq{$h_subject:}{MN}{\"F.J. Prefect\" <mn@domain.local>}fail}" Ffrsw
Нужно понимать что глобальная перезапись применяется ко всем копиям сообщения,
если там есть перезаписываемый адрес.
Например:
Отправитель: admin@domain.local
Получатели: admin2@domain2.local admin3@domain3.local
Если вы перезаписываете отправителя admin@domain.local,
то это сообщение получат и admin2@domain2.local и admin3@domain3.local.
Также и с получателями, второй получатель также увидит
перезаписанного первого, если первый не в "скрытой копии".
Примечание:
Транспортная перезапись применяется только к сообщениям,
которые проходят через этот транспорт.
Правила глобальной перезаписи применяются ко всем сообщениям,
которые Exim принимает. (т.е. проверяется адрес и при необходимости меняется)
Примечание:
Также можно удалять и добавлять заголовки сообщения во время
системной фильтрации, роутинга, пользовательской фильтрации, транспорта.
Подробности смотри в документации.