Перезапись может быть
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 принимает. (т.е. проверяется адрес и при необходимости меняется)
Также можно удалять и добавлять заголовки сообщения во время
системной фильтрации, роутинга, пользовательской фильтрации, транспорта.
Подробности смотри в документации.