Я пытаюсь добавить маршрут с перенаправлением на основе записи mx.
Но мое регулярное выражение никогда не работает.
Exim 4.90, os ubontu 18.04.
Моя конфигурация:
non_mydom_mx:
driver = manualroute
#condition = ${lookup dnsdb{mxh=^mx\d\.mydom\.net}{true}fail}
condition = ${lookup dnsdb{mxh=^.*\$}{true}fail}
transport = non_mydom
route_list = * 192.168.0.11
Не удалось выполнить тестовую маршрутизацию:
mk@mydom.net
<-- mk@mydom.net
router = dnslookup, transport = remote_smtp
host mx1.mydom.net [xxxx] MX=10
host mx2.mydom.net [xxxx] MX=20
Здесь есть несколько проблем. Меньший из них в том, что $
в конце регулярного выражения не экранируется, поэтому exim думает, что это начало переменной. Из-за этого выражение не может расшириться.
Более серьезная проблема в том, что dnsdb
поиск выполняет простой DNS-запрос, и все. Задавать регулярное выражение в поиске не имеет смысла, поскольку в этом случае запрос будет неоднозначным. В вашем случае поиск выглядит примерно так: «дайте мне MX-адрес, мне все равно, какой», и он явно не работает. Даже если вы избежите $
sign, exim даже не расширяет данное регулярное выражение, вместо этого пытается найти запись MX для хоста с именем ^.*$
.
Маршрутизация на основе записи MX может быть выполнена следующим образом:
non_mydom_mx:
driver = manualroute
condition = ${if match {${lookup dnsdb{>: mxh=$domain}}}{[^:]\d\.mydom\.net}{yes}{no} }
transport = non_mydom
route_list = * 192.168.0.11
Здесь вы запрашиваете имя хоста MX для домена получателя. Поскольку в домене обычно имеется больше записей MX, поиск объединяет результаты, разделенные :
(это указано >:
в начале поискового значения). Значение, данное dnsdb
поиск используется в match
, который сравнивает результат с регулярным выражением (которое учитывает :
символ как начало новой строки). Если результат совпадает, то условие приводит к yes
в противном случае no
, в этом случае маршрутизатор отказывается.
Возможно, стоит упомянуть, что exim имеет отличный вывод для отладки, поэтому, если вы застряли, просто запустите exim в режиме отладки следующим образом:
exim4 -d+all -bd -oX 25252 2>&1|tee exim-debuglog.txt
После этого подключение к заданному порту (25252
) и попытка отправить простое сообщение заставит exim записать всю информацию об обработке сообщения, включая ACL, маршрутизаторы и этапы раскрытия переменных. Это может пригодиться, если вы попытаетесь выяснить, почему определенное правило не работает.