Для тех, кто не знает, VExim – это панели управления почтовым сервером exim. Аналог postfixadmin’a для postfix’a, но на мой взгляд более функциональна, в силу самого exim’a. Рассказывать о всех преимуществах не буду, а расскажу лишь о том, как правильно настроить блокировку писем по критериям. Их всего 4: отправитель, получатель, тема, почтовый клиент. Если вы ничего не меняли в маршрутах, то в конфигурации по умолчанию они выглядят вот так:
ditch_hdrmailer:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'x-mailer' \
and blocklists.blockval = '${quote_mysql:$h_x-mailer:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part
ditch_hdrto:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'to' \
and blocklists.blockval = '${quote_mysql:$h_to:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part
ditch_hdrfrom:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'from' \
and blocklists.blockval = '${quote_mysql:$h_from:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part
ditch_hdrsubject:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'subject' \
and blocklists.blockval = '${quote_mysql:$h_subject:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part
Но в такой конфигурации они мало удобны, так как требуют точного совпадения. То есть, например, нельзя занести в список домен, а только отдельных получателей, да и ещё не просто получателя, а в формате . (именно так: то есть вместе с угловыми скобками). Согласитесь, не совсем удобно. Поэтому, я решил немного подправить условия, что бы можно было заносить адреса в привычной для нас форме, возможность заносить не просто отдельный адрес, а целый домен, совпадение по ключевым словам в теме и т.д.
Ниже будет описание, какие изменения делаем для каждого маршрута.
1) По почтовому клиенту:
В роутере ditch_hdrmailer вместо строки
and blocklists.blockval = '${quote_mysql:$h_x-mailer:}' \
пишем такую
and '${quote_mysql:$h_x-mailer:}' like concat('%',blocklists.blockval,'%') \
2) По получателю
В роутере ditch_hdrto вместо строки
and blocklists.blockval = '${quote_mysql:$h_to:}' \
пишем такую
and '${quote_mysql:$h_to:}' like concat('%',blocklists.blockval,'%') \
3) По отправителю
В роутере ditch_hdrfrom вместо строки
and blocklists.blockval = '${quote_mysql:$h_from:}' \
пишем такую
and '${quote_mysql:$h_from:}' like concat('%',blocklists.blockval,'%') \
4) По теме письма
В роутере ditch_hdrsubject вместо строки
and blocklists.blockval = '${quote_mysql:$h_subject:}' \
пишем такую
and '${quote_mysql:$h_subject:}' like concat('%',blocklists.blockval,'%') \
После всех изменений перезапускаем exim.
5) Тестирование
Тестирование покажу на примере ротуера для почтового клиента. Заходим в админку vexim’a, выбираем нужного нам пользователя, заходим в редактирование настроек для него и опускаемся в самый низ, до надписи
Add a new header blocking filter for this user:
Выбираем X-mailer и в поле вписываем Outlook. Будем проверять на примере почтового клиента Microfost Outlook 2003. Пробуем отправить письмо. Вот что мы увидим в логах, при включённом режиме debug:
Как видим, наш фильтр сработал, и письмо заблокировалось. В режиме нормального логгирования получим такое сообщение:
2010-09-29 14:12:47 [33295] 1P0uaY-0008ez-5q => :blackhole: R=ditch_hdrmailer
2010-09-29 14:12:47 [33295] 1P0uaY-0008ez-5q Completed QT=5s
Напомню, что если мы имеем 4 роутера, и сработал первый по списку, то остальные не проверяются.