[Exim-users] Exim forany

4 views
Skip to first unread message

Mikhail Golub

unread,
Jan 27, 2022, 5:32:42 AM1/27/22
to exim-...@mailground.net
Доброго времени суток.

Такое выражение:
exim -be -d+all '${if forany { :Mail:Admin:test:: } {inlisti
{$item}{test}}}'

Т.е. список начинается с пустого значения и заканчивается двумя пустыми
значениями.

И вот в конце два пустых значения подряд не обрабатывает.
12:25:11 11880 forany: $item = ""
12:25:11 11880 forany: $item = "Mail"
12:25:11 11880 forany: $item = "Admin"
12:25:11 11880 forany: $item = "test:"

Суть всего этого - отсекание спама с моими доменами в поле "От:" в
конверте, не в адресе.

Например:
"Mail-Admin mydomain.ua" <ri...@pramac.cam>

Варианты могут быть с разделением через пробел, дефис, косую черту ...
Это решил через sg и extract.

А вот с forany засада получается :(

Вот полное условие:
condition = ${if forany {<;
${sg{${extract{1}{<}{$h_From:}}}{\N"|\s+|-|\/\N}{;}} } {match_domain
{$item}{+virtual_domains}}}

P.S. Exim version 4.95 #1 (FreeBSD 12.3)


_______________________________________________
Exim-users mailing list
Exim-...@mailground.net
http://mailground.net/mailman/listinfo/exim-users

Victor Ustugov

unread,
Jan 27, 2022, 6:16:48 AM1/27/22
to Mikhail Golub
Mikhail Golub wrote on 27.01.2022 12:31:
> Доброго времени суток.

доброго

> Такое выражение:
> exim -be -d+all '${if forany { :Mail:Admin:test:: } {inlisti
> {$item}{test}}}'
>
> Т.е. список начинается с пустого значения и заканчивается двумя пустыми
> значениями.

по идее, в конце там не два пустых значения. задвоение двоеточия
позволяет указать, что двоеточие является частью элемента списка.


6.20 List construction
----------------------
...
If a colon is actually needed in an item in a list, it must be
entered as two colons.


> И вот в конце два пустых значения подряд не обрабатывает.
> 12:25:11 11880  forany: $item = ""
> 12:25:11 11880  forany: $item = "Mail"
> 12:25:11 11880  forany: $item = "Admin"
> 12:25:11 11880  forany: $item = "test:"
>
> Суть всего этого - отсекание спама с моими доменами в поле "От:" в
> конверте, не в адресе.

это не конверт. по крайней мере не то, что в SMTP называется envelope.

и как спам-то отсекается в данном случае? это способ поиска слова "test"
в заголовке From перед адресом?

> Например:
> "Mail-Admin mydomain.ua" <ri...@pramac.cam>
>
> Варианты могут быть с разделением через пробел, дефис, косую черту ...
> Это решил через sg и extract.
>
> А вот с forany засада получается :(
>
> Вот полное условие:
> condition = ${if forany {<;
> ${sg{${extract{1}{<}{$h_From:}}}{\N"|\s+|-|\/\N}{;}} } {match_domain
> {$item}{+virtual_domains}}}
>
> P.S. Exim version 4.95 #1 (FreeBSD 12.3)


--
Best wishes Victor Ustugov
mailto:vic...@corvax.kiev.ua
JID: vic...@corvax.kiev.ua
public GnuPG/PGP key: https://victor.corvax.kiev.ua/corvax.asc

Le...@lena.kiev.ua

unread,
Jan 27, 2022, 6:21:26 AM1/27/22
to Exim MTA на русском
> {\N"|\s+|-|\/\N}

{\N["\s-/]+\N}

Mikhail Golub

unread,
Jan 27, 2022, 6:35:10 AM1/27/22
to exim-...@mailground.net

On 27.01.2022 13:16, Victor Ustugov wrote:
> Mikhail Golub wrote on 27.01.2022 12:31:
>> Доброго времени суток.
>
> доброго
>
>> Такое выражение:
>> exim -be -d+all '${if forany { :Mail:Admin:test:: } {inlisti
>> {$item}{test}}}'
>>
>> Т.е. список начинается с пустого значения и заканчивается двумя пустыми
>> значениями.
>
> по идее, в конце там не два пустых значения. задвоение двоеточия
> позволяет указать, что двоеточие является частью элемента списка.
>
>
> 6.20 List construction
> ----------------------
> ...
> If a colon is actually needed in an item in a list, it must be
> entered as two colons.

Так тоже не исправляет ситуацию:
exim -be '${if forany {<; ;Mail;Admin;test;; } {inlisti {$item}{test}}}'

Именно в конце списка такое поведение. Делимитер роли не играет (что
";", что запятая).

>
>
>> И вот в конце два пустых значения подряд не обрабатывает.
>> 12:25:11 11880  forany: $item = ""
>> 12:25:11 11880  forany: $item = "Mail"
>> 12:25:11 11880  forany: $item = "Admin"
>> 12:25:11 11880  forany: $item = "test:"
>>
>> Суть всего этого - отсекание спама с моими доменами в поле "От:" в
>> конверте, не в адресе.
>
> это не конверт. по крайней мере не то, что в SMTP называется envelope.

Да, это "From:", не envelope-from:


>
> и как спам-то отсекается в данном случае? это способ поиска слова "test"
> в заголовке From перед адресом?

Да, поиск своего домена в поле "От:" перед адресом.
Это фишинговые письма ...

Правилом ниже вот такие From: отсекаются.
From: Documents-mydomain.ua <in...@bgvillas.cam>

А вот так уже нет.
From: "Mail-Admin mydomain.ua" <us...@duchemfrwd.cam>

Потому как в конце кавычки и пробел, что дает "два пустых значения" в
списке.
Можно, конечно, перед обработкой удалять кавычки ...
Но может как-то изхитриться с forany можно?

>
>> Например:
>> "Mail-Admin mydomain.ua" <ri...@pramac.cam>
>>
>> Варианты могут быть с разделением через пробел, дефис, косую черту ...
>> Это решил через sg и extract.
>>
>> А вот с forany засада получается :(
>>
>> Вот полное условие:
>> condition = ${if forany {<;
>> ${sg{${extract{1}{<}{$h_From:}}}{\N"|\s+|-|\/\N}{;}} } {match_domain
>> {$item}{+virtual_domains}}}
>>
>> P.S. Exim version 4.95 #1 (FreeBSD 12.3)
>
>

Mikhail Golub

unread,
Jan 27, 2022, 6:41:58 AM1/27/22
to exim-...@mailground.net
да, оно. Спасибо.
Убирает двойные значения...

Victor Ustugov

unread,
Jan 27, 2022, 7:00:06 AM1/27/22
to Mikhail Golub
Mikhail Golub wrote on 27.01.2022 13:34:

>>> Такое выражение:
>>> exim -be -d+all '${if forany { :Mail:Admin:test:: } {inlisti
>>> {$item}{test}}}'
>>>
>>> Т.е. список начинается с пустого значения и заканчивается двумя пустыми
>>> значениями.
>>
>> по идее, в конце там не два пустых значения. задвоение двоеточия
>> позволяет указать, что двоеточие является частью элемента списка.
>>
>>
>> 6.20 List construction
>> ----------------------
>> ...
>> If a colon is actually needed in an item in a list, it must be
>> entered as two colons.
>
> Так тоже не исправляет ситуацию:
> exim -be '${if forany {<; ;Mail;Admin;test;; } {inlisti {$item}{test}}}'

так замена разделителя ничего не даст. под "задвоением двоеточия"
подразумевалось "задвоение разделителя списка".

> Именно в конце списка такое поведение. Делимитер роли не играет (что
> ";", что запятая).

не только в конце списка такое поведение.
если список указать не в виде

;Mail;Admin;test;;

, а в виде

;Mail;Admin;;test;;

, то последним элементом списка будет Admin;test;


--
Best wishes Victor Ustugov
mailto:vic...@corvax.kiev.ua
JID: vic...@corvax.kiev.ua
public GnuPG/PGP key: https://victor.corvax.kiev.ua/corvax.asc

_______________________________________________

Le...@lena.kiev.ua

unread,
Jan 27, 2022, 7:06:48 AM1/27/22
to Exim MTA на русском
> > {\N"|\s+|-|\/\N}
>
> {\N["\s-/]+\N}

Вернее так:
{\N["\s/-]+\N}

Victor Ustugov

unread,
Jan 27, 2022, 7:10:13 AM1/27/22
to Exim MTA на русском
Le...@lena.kiev.ua wrote on 27.01.2022 14:06:
>>> {\N"|\s+|-|\/\N}
>>
>> {\N["\s-/]+\N}
>
> Вернее так:
> {\N["\s/-]+\N}

а там точно минус нужен?
он может быть частью названия домена из +virtual_domains

--
Best wishes Victor Ustugov
mailto:vic...@corvax.kiev.ua
JID: vic...@corvax.kiev.ua
public GnuPG/PGP key: https://victor.corvax.kiev.ua/corvax.asc

_______________________________________________

Mikhail Golub

unread,
Jan 27, 2022, 7:12:27 AM1/27/22
to exim-...@mailground.net

On 27.01.2022 14:09, Victor Ustugov wrote:
> Le...@lena.kiev.ua wrote on 27.01.2022 14:06:
>>>> {\N"|\s+|-|\/\N}
>>>
>>> {\N["\s-/]+\N}
>>
>> Вернее так:
>> {\N["\s/-]+\N}
>
> а там точно минус нужен?
> он может быть частью названия домена из +virtual_domains

Так адрес же отсекается через extract по разделителю "<".

Victor Ustugov

unread,
Jan 27, 2022, 7:21:59 AM1/27/22
to Mikhail Golub
Mikhail Golub wrote on 27.01.2022 14:11:
>
>>>>> {\N"|\s+|-|\/\N}
>>>>
>>>> {\N["\s-/]+\N}
>>>
>>> Вернее так:
>>> {\N["\s/-]+\N}
>>
>> а там точно минус нужен?
>> он может быть частью названия домена из +virtual_domains
>
> Так адрес же отсекается через extract по разделителю "<".

extract отсекает из заголовка From адрес отправителя.
а я имею ввиду, что минус может быть частью названия домена из
именованного списка +virtual_domains, т. е. частью названия одного из
доменов получателей.

тогда при использовании минуса в качестве одного из возможных
разделителей текста из From такой домен будет разделён на две части.

т. е. если в +virtual_domains присутствует домен my-domain.ua, а
заголовок From выглядит как

"Mail-Admin my-domain.ua" <ri...@pramac.cam>

, то при использовании минуса в качестве разделителя текста из From на
части получится


# exim -be '${sg{${extract{1}{<}{"Mail-Admin my-domain.ua"
<ri...@pramac.cam>}}}{\N["\s/-]+\N}{;}}'
;Mail;Admin;my;domain.ua;


и на наличие в +virtual_domains домен my-domain.ua проверен не будет.
будут проверены отдельно my и domain.ua


--
Best wishes Victor Ustugov
mailto:vic...@corvax.kiev.ua
JID: vic...@corvax.kiev.ua
public GnuPG/PGP key: https://victor.corvax.kiev.ua/corvax.asc

_______________________________________________

Victor Ustugov

unread,
Jan 27, 2022, 9:37:08 AM1/27/22
to Mikhail Golub
Victor Ustugov wrote on 27.01.2022 14:21:
> Mikhail Golub wrote on 27.01.2022 14:11:
>>
>>>>>> {\N"|\s+|-|\/\N}
>>>>>
>>>>> {\N["\s-/]+\N}
>>>>
>>>> Вернее так:
>>>> {\N["\s/-]+\N}
>>>
>>> а там точно минус нужен?
>>> он может быть частью названия домена из +virtual_domains
>>
>> Так адрес же отсекается через extract по разделителю "<".

кстати, не факт, что это тоже удачная идея

например, для вот такого случая:

From: "Mail-Admin <mail...@mydomain.ua>" <ri...@pramac.cam>

в том же Thunderbird и в списке писем и при просмотре письма в колонке и
соответственно поле "От" будет указано:

Mail-Admin <mail...@mydomain.ua>


если пытаться сооружать длинную конструкцию, которая будет из $h_From:
убирать не просто первую встретившуюся открывающуюся угловую скобку и
всё за ней, а то, то находится между последней открывающейся угловой
скобкой и последней закрывающейся, а также все пробельные символы до и
после, то при интерпретации всей конструкции (включая forany) в exim -be
тот может выдать вот такое сообщение об ошибке:

exim: length limit exceeded (286 > 256) for: recipient

всё зависит от общей длины конструкции, которая зависит от длины
заголовка From. но даже не очень длинные заголовки проверить не получилось.

как вариант - можно вынести логику получения текста перед адресов
отправителя из заголовка From в отдельный acl.


acl_addr_text:
accept message = ${if match{$acl_arg1}\
{\N^\s*(.*)\s*<[^<>]+@[^<>]>\s*$\N}\
{$1}\
{${if match{$acl_arg1}{\N^\s*(.*)\s\S+?\s*$\N}{$1}{}}}}


тогда само условие будет выглядеть как-то так:

condition = ${if forany {<; \

${sg{${acl{acl_addr_text}{$h_From:}}}{\N[@"'\s/<>]+\N}{;}}\
}{match_domain{$item}{+virtual_domains}}}

такое условие отловит и текст в виде полноценных почтовых адресов перед
адресом отправителя и минусы в названиях доменов.

Mikhail Golub

unread,
Jan 27, 2022, 9:48:46 AM1/27/22
to exim-...@mailground.net
Спасибо, посмотрю.

Я на столько не успел заморочиться :(
Что в голову пришло - сделал. Спам, который шел в то время, был отсеян.

Reply all
Reply to author
Forward
0 new messages