LINUX.ORG.RU
решено ФорумAdmin

Exim. Проверка заголовка To и Cc

 


0

1

Добрый день. Не подскажите как можно реализовать проверку заголовков на соответствие в нем адреса получателя нашего домена. Либо в To: либо в Cc:

Пробую такую конструкцию: # Помечаем письма как спам если заголовок To не наш домен
warn message = «Warning - Header „TO“ or „Cc“ is a prohibited domain name»
!hosts = +relay_from_hosts
!authenticated = *
condition = ${if match_domain{${domain:${address:$h_to:}}}{!+local_domains : !+white_domains}}
condition = ${if match_domain{${domain:${address:$h_cc:}}}{!+local_domains : !+white_domains}}
condition = ${if match{$h_to:}{(?i)undisclosed-recipients}{no}{yes}}

Отрабатывает не всегда правильно. Например если написать несколько получателей в To: и в копию поставить адрес другого домена, то правило срабатывает....



Последнее исправление: DeeMaas (всего исправлений: 1)

объедини оба условия в одно: если в $h_to нет нашего домена _И_ в $h_cc тоже нет нашего домена, тогда warn
condition = ${if and {
{ match_domain{${domain:${address:$h_to …}
{ match_domain{${domain:${address:$h_cc …}
}} ну и проверку на пустые заголовки с undisclosed-recipients лучше вынеси в отдельный warn

bass ★★★★★
()
Последнее исправление: bass (всего исправлений: 1)
Ответ на: комментарий от bass

Правильно ли я понимаю, что match_domain{${domain:${address:$h_to проверяет прямое вхождение адреса, т.е.
To: username@domain.ru

Или такого формата тоже обработает?
To: =?utf-8?B?tdCy0LfQQstCz0LXQvdC40Lkg0JvRjtC40Yc=?= <username@domain.ru>, =?utf-8?B?, =?utf-8?B?
tdCy0LfQQstCz0LXQvdC40Lkg0JvRjtC40Yc=?= <username2@domain.ru>, =?utf-8?B

DeeMaas
() автор топика
Ответ на: комментарий от DeeMaas

Есть 3 вида заголовков которыми можно оперировать: header, rheader и bheader их разница описана в документации 11.5 Expansion items
выведи в лог $h_to $rh_to и $bh_to чтобы увидеть для каких строк ты составляешь свои условия

bass ★★★★★
()
Ответ на: комментарий от bass

Вывел: X-ACL-Warn: «Warning - Header „TO“ or „Cc“ is a prohibited domain name h_to: username@domain.ru, username2@domain.ru rh_to: username@domain.ru, username2@domain.ru bh_to:

Похоже { match_domain{${domain:${address:$h_to …} здесь не подойдет, попробовал { match_domain{${domain:${addresses:$h_to …} тоже не подходит... Как попробовать обработать такую строку? Сравнить каждый элемент с +local_domains. Регулярными выражениями или есть способ проще?

DeeMaas
() автор топика
Ответ на: комментарий от bass

Идея в том, чтобы помечать письма как спам, если в заголовке To: или Cc: нет получателя из нашего домена. Многие рекламщики шлют письмо на свой альяс, в котором уже забиты адреса получателей.
Вот я и хочу $h_to сравнивать со всеми моими локальными доменами перечисленными в +local_domains
+white_domains список спамеров, которым можно слать через свой альяс.
Все это работало если в To: один получатель, если их несколько, строка раскрывается как username@domain.ru, username2@domain.ru и это уже не работает...

DeeMaas
() автор топика

Ещё немного описания проблемы

condition = ${if match_domain{${domain:${address:$h_to:}}}{!+local_domains : !+white_domains}}

1) Берется заголовок To:. Например To: Username <username@domain.ru>
2) Из него берется адрес (address) username@domain.ru
3) Далее domain выделяет из address имя домена
4) Далее match_domain проверяет, что домен не находится в +local_domains и +white_domains

Так вот, если адрес один то вся цепочка работает нормально, если адреса 2 и более, то правило не отрабатывает.

Использование addresses не помогло (находятся адреса разделенные двоеточием username@domain.ru : username2@domain.ru)

DeeMaas
() автор топика
Ответ на: комментарий от DeeMaas

Теперь понял. К сожалению exim не умеет сравнивать списки по списками, поэтому тебе придётся написать парсер и сравнение на perl

bass ★★★★★
()
Последнее исправление: bass (всего исправлений: 1)
Ответ на: комментарий от DeeMaas

Если тебя необязательно использования внутренних списков типа +local_domains, то на самом деле можно так:
warn
log_message = No our domains in $h_to:
condition = ${if match{$h_to:}{aaaa\.ru|bbb\.com|ccc\.org}{0}{1}}

bass ★★★★★
()
Последнее исправление: bass (всего исправлений: 1)
acl_check_data:
…
  # To: headers does not contain address of recipient
  warn    !condition     = ${if forany \
                             {${addresses:$rh_To:}} \
                             {match_domain \
                               {${domain:$item}} \
                               {+our_domains} \
                             } \
                           }
          add_header     = X-Spam-Score: 20.0 (++++++++++++++++++++)\n\
                           X-Spam-Score-Int: 200\n\
                           X-Spam-Bar: ++++++++++++++++++++\n\
                           X-Spam-Report: Message not addressed to You

…
MumiyTroll ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.