Привет,

Потому что сейчас девелоперы exim'а работают над соблюдением типизации.

Если раньше конструкции типа condition = {lookup} (без if) работали, то сейчас 
- с очень переменным успехом.

Я вот такого типа конструкции проверяю через exim -be - выпадаешь в консоль 
expression'ов и можно тестировать, только вместо expansion variables надо 
использовать живые значения. Лукапы как минимум в mysql он в консоли делает ок. 
Можно включить дебаг - покажет что он с чем сравнивает и почему факап.

Да, в консоли я хз что там за редактор (если он вообще есть), лучше копипастой 
вставлять готовые строки и enter.

вторая тема - я бы врапнул вот эти длинные лукапы в named list - легче читать

и третья тема (смое важное) - результат лукапа - это value, которое при bool 
сравнении всегда будет или false или true - уже не помню;
если вам надо "есть или нет" надо использовать конструкцию типа 
{bool{${lookup{$item}nwildlsearch{some_file}...}

Вот над этой конструкцией я потел часа два:
condition = ${if forall{<\n ${lc:${lookup dnsdb{ptr=$sender_host_address}}}} 
{bool{${lookup{$item}nwildlsearch{/lists/HOSTS_REGEX}{1}{0}}}}}

Тут все три секса сразу: и цикл forall, и передача $item в lookup, и приведение 
к boolean результата лукапа.

njoy


1 жовтня 2020, 15:04:09, від "Victor Sudakov" <[email protected]>:

[email protected] wrote:
> > Пришел к такому варианту с бессчетными скобочками, но и он не работает.
> > 
> >   accept condition =  ${if or{\
> >                       
> > {${lookup{$local_part@$domain}lsearch{/etc/dovecot/aliases}{yes}}} \
> >                       
> > {${lookup{$local_part@$domain}lsearch{/etc/dovecot/users}{yes}}} \
> >                       } {yes}}
> 
>   accept condition = ${if or{\
>     {bool{${lookup{$local_part@$domain}lsearch{/etc/dovecot/aliases}{1}{0}}}}\
>     {bool{${lookup{$local_part@$domain}lsearch{/etc/dovecot/users}{1}{0}}}}\
>                             }}

OMG, тут что-то вроде приведения типа надо делать? Работает, очень
большое спасибо.

Я уже в попытках до такого дошел:

 accept condition =  ${if or {\
                      
{eq{${lookup{$local_part@$domain}lsearch{/etc/dovecot/aliases}{yes}}{yes}}} \
                      
{eq{${lookup{$local_part@$domain}lsearch{/etc/dovecot/users}{yes}}{yes}}} \
                      } {yes}}

И всё равно не работало (интересно почему. Или уже не интересно).

> 
> Скобочки удобно проверять во встроенном редакторе Midnight Commander.
> Его можно вызвать и отдельно: mcedit имяфайла
> При наведении курсора на скобочку подсвечивается другая соответствующая 
> скобочка.

А, спасибо, мне vim хорошо подсвечивает скобочки. Даже прямо при
написании этого письма.

> 
> В ACL можно обойтись без {1}{0} перед самой последней скобочкой
> (закрывающей or). А в роутерах надо.

Пусть уж будет везде единообразно.

Мне сбивает с толку мысль, что в выражении
accept condition = 
${lookup{$local_part@$domain}lsearch{/etc/dovecot/users}{yes}}
правая часть - вполне себе condition (так и написано же - "condition" :-) ). Но
оказывается чтобы сделать AND или OR между такими conditions - надо их
обернуть в bool{...} - почему?


-- 
Victor Sudakov,  VAS4-RIPE, VAS47-RIPN
2:5005/49@fidonet http://vas.tomsk.ru/

_______________________________________________
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

Ответить