Мысль с address_data принесла свои плоды:
begin routers
smart_host:
driver = manualroute
transport = remote_smtp
domains = ! +local_domains
address_data = ${lookup{$domain}lsearch*{CONFDIR/smart-hosts}
{${extract{auth}{$value} {auth-key=${quote:$value}}}}}
route_data = ${lookup{$domain}lsearch*{CONFDIR/smart-hosts}
{${extract{endpoints}{$value} {${sg{${sg{$value}{\N\^\N}{::}}}{,}{:}}}}}{}}
verify = no
begin transports
remote_smtp:
driver = smtp
hosts_require_auth =
${extract{auth-key}{$address_data}{${lookup{${quote:$value}}lsearch{CONFDIR/auth-virtual-client}
{$host} {}}}}
begin authenticators
login:
driver = plaintext
client_send =
${extract{auth-key}{$address_data}{${lookup{${quote::$value}}lsearch{CONFDIR/auth-virtual-client}
{${extract{1}{::}{$value} {$value}{}}} {}}}} :
${extract{auth-key}{$address_data}{${lookup{${quote::$value}}lsearch{CONFDIR/auth-virtual-client}
{${extract{2}{::}{$value} {$value}{}}} {}}}}
public_name = LOGIN
server_condition = ${lookup{$auth1}lsearch{CONFDIR/auth-virtual-server}
{${if crypteq{$auth2}{$value}}} {false}}
server_prompts = User Name : Password
plain:
driver = plaintext
client_send =
${extract{auth-key}{$address_data}{${lookup{${quote::$value}}lsearch{CONFDIR/auth-virtual-client}
{${reduce{$value}{}{$value^$item}}} {}}}}
public_name = PLAIN
server_condition = ${lookup{$auth2}lsearch{CONFDIR/auth-virtual-server}
{${if crypteq{$auth3}{$value}}} {false}}
# cat smart-hosts
a: endpoints=a.org,b.org auth=mail.p.nyaka.org
b: endpoints=a.org,b.org^587,c.org^2025 auth="mail.p.nyaka org"
*: endpoints=mail.p.nyaka.org auth=mail.p.nyaka.org
# cat auth-virtual-client
mail.p.nyaka.org:login:password
login аутентификатор выглядит... несколько громоздко, но в целом работает все
так как и хотелось/ожидалось. Даже perl расчехлять не пришлось. :)
> On Jun 15, 2016, at 5:33 PM, Dmitry Bogun <[email protected]> wrote:
>
>
>> On Jun 15, 2016, at 3:04 PM, George L. Yermulnik <[email protected]> wrote:
>>
>> Hello!
>>
>> On Wed, 15 Jun 2016 at 14:23:17 (-0500), Dmitry Bogun wrote:
>>
>>> Проблема в том, что mail.p.nyaka.org - это CNAME(этого я изменить не могу)
>>
>> RFC уже не в моде =(
>
> Который именно? Это ж "ручной" роутинг, кто нам тут что запрещает?
> Единственный "запрет" на CNAME в отношении почты, который я помню - для MX
> записей. И то там не запрет, а "особое" поведение в случае CNAME.
>
>>> И вот я не могу придумать как это исправить... "убрать" cname из имени
>>> которое используется для smart-host'ов я не могу, отказаться от авторизации
>>> на них тоже, плюс cname время от времени меняется, что отменяет возможность
>>> "разрешить" его заранее и пользовать ip адрес вместо имени хоста.
>>
>> Как подручная затычка: с периодичностью меньше самого минимального ttl
>> из всех используемых smart-host'ов прогонять цикл, который будет
>> резолвить cname (например, с помощью `dig +norecurse +short smart-host')
>> и записывать в CONFDIR/auth-virtual-client
>> Судя по всему, в итоге получится не однострочник, а целый скриптик с
>> проверками, но, если цель оправдывает средства, то почему бы и нет =)
>
> Тоже вариант. Но мне он не нравится. Не люблю я poll скрипты.
>
> На сейчас есть 2 недодуманные идеи:
> - в smart_host роутере добавлять в address_data ключик, куда он нас отроутил,
> и потом уже по этому ключу искать login/password
> - извращаться через lookup dnsdb и "ловить" совпадение адресов. (Правда
> match_ip ограничили в возможностях, есть подозрение что теперь такой "трюк"
> будет уже невозможен).
>
> Еще можно зайти по крупному и "взять" в руки perl.
>
> _______________________________________________
> Exim-users mailing list
> [email protected]
> http://mailground.net/mailman/listinfo/exim-users
>
_______________________________________________
Exim-users mailing list
[email protected]
http://mailground.net/mailman/listinfo/exim-users