Привет.
Подскажите как в Exim реализовать catchall - отправку/копирование всех приходящих писем на несуществующие адреса - на один ящик?
> Привет.
> Подскажите как в Exim реализовать catchall - отправку/копирование всех приходящих писем
> на несуществующие адреса - на один ящик?Привет!
Поясни задачу, а то не понятно.
Копирование (прием) на один ящик всех приходящих на несуществующие адреса писем - это легко, помогу.
А отправка - это что и куда?
> Привет!
> Поясни задачу, а то не понятно.
> Копирование (прием) на один ящик всех приходящих на несуществующие адреса писем -
> это легко, помогу.
> А отправка - это что и куда?Привет.
Да, прием на один (или несколько в будущем) всех приходящих на несуществующие адреса писем.
Главное, что бы спам не полетел.
Понятно.
Формализуем задачу:
Есть exim, который обслуживает домен dom.org
Есть реальные почтовые ящики u1@dom.org, u2@dom.org - они работают в нормальном режиме
Есть почтовый ящик any@dom.org в который сваливается почта для несуществующих (123@dom.org, mumu@dom.org etc) почтовых ящиков ДЛЯ ДОМЕНА dom.org (!) Для других доменов почту не принимаем (главное, что бы спам не полетел). Для авторизованной отправки все останется как было - мы ее не трогаем.
1) делаем новый транспорт доставки в секции begin transports в любом местеУ тебя уже есть delivery_local транспорт. Что-то типа:
delivery_local:
driver = pipe
command = /bin/deliver -d $local_part@$domain
timeout = 30s
force_command = true
message_size_limit = 50M
.....Полностью копируем его в
delivery_any:
driver = pipe
command = /bin/deliver -d any@$domain
timeout = 30s
force_command = true
message_size_limit = 50M
.....Меняем ему название на delivery_any и в command меняем $local_part на any (адрес почтового ящика сбора)
>[оверквотинг удален]
> command
> = /bin/deliver -d any@$domain
> timeout
> = 30s
> force_command =
> true
> message_size_limit = 50M
> .....
> Меняем ему название на delivery_any и в command меняем $local_part на any
> (адрес почтового ящика сбора)У меня есть delivery_local транспорт. Что-то типа:
procmail:
driver = pipe
command = "/usr/bin/procmail -d $local_part"
return_path_add
delivery_date_add
envelope_to_add
user = $local_part
initgroups
return_outputСкопировал, заменил:
delivery_any:
driver = pipe
command = "/usr/bin/procmail -d any"
return_path_add
delivery_date_add
envelope_to_add
user = $local_part
initgroups
return_outputНо есть еще какой то локальный транспорт, что из них актуальное? :
local_delivery:
driver = appendfile
maildir_format
maildir_use_size_file
user = ${extract{2}{:}{${lookup{$local_part}lsearch{/etc/exim4/domains/$domain/passwd}}}}
group = mail
create_directory
directory_mode = 770
mode = 660
use_lockfile = no
delivery_date_add
envelope_to_add
return_path_add
directory = "${extract{5}{:}{${lookup{$local_part}lsearch{/etc/exim4/domains/$domain/passwd}}}}/mail/$domain/$local_part"
quota = ${extract{6}{:}{${lookup{$local_part}lsearch{/etc/exim4/domains/$domain/passwd}}}}M
quota_warn_threshold = 75%
> Но есть еще какой то локальный транспорт, что из них актуальное? :С транспортами все просто. Они работают исключительно по вызовам из роутеров по имени и ни как по другому. Если какой-то транспорт не упоминается (transport = ..., file_transport = ...) ни в одном роутере, значит он не нужен и его можно смело удалять.
Судя по твоим роутерам у тебя не используется procmail (может быть он в других роутерах?), а используется транспорт local_delivery, в котором exim сам выступает в роли LDA (driver = appendfile)
Можешь сделать транспрорт delivery_any аналогично, только заменив
delivery_any:
driver = appendfile
......
user = any
......
directory = "/mail/$domain/any"
......А можно использовать /usr/bin/procmail в качестве LDA
delivery_any:
driver = pipe
command = "/usr/bin/procmail -d any"
return_path_add
delivery_date_add
envelope_to_add
user = any (здесть тоже надо $local_part изменить)
initgroups
return_output
2) делаем роутер в секции begin routers (порядок роутеров имеет значение!)Обычно ПОСЛЕДНИЙ роутер используется для локальной доставки. У тебя должно быть что-то типа:
local_user:
driver = accept
domains = +local_domains
local_parts = dsearch;/vmail (здесь у тебя наверное другое размещение - оставляй как было)
transport = delivery_local
cannot_route_message = No such mailbox here.Строку cannot_route_message комментируем. Вместо нее добавляем no_more (это чтобы почта для u1 и u2 так-же не сваливалась в any)
ПОСЛЕ этого роутера делаем свой
any_user:
driver = accept
domains = +local_domains (важное условие!)
transport = delivery_any
>[оверквотинг удален]
> transport = delivery_local
> cannot_route_message = No such mailbox here.
> Строку cannot_route_message комментируем. Вместо нее добавляем no_more (это чтобы почта
> для u1 и u2 так-же не сваливалась в any)
> ПОСЛЕ этого роутера делаем свой
> any_user:
> driver = accept
> domains = +local_domains (важное
> условие!)
> transport = delivery_anyРоутер local_user у меня такой, что делать? что менять?
localuser:
driver = accept
transport = local_delivery
condition = ${lookup{$local_part}lsearch{/etc/exim4/domains/$domain/passwd}{true}{false}}Ниже присутствует такой роутер: (его как то можно использовать для решения задачи?)
catchall:
driver = redirect
headers_add = X-redirected: yes
require_files = /etc/exim4/domains/$domain/aliases
data = ${extract{1}{:}{${lookup{*@$domain}lsearch{/etc/exim4/domains/$domain/aliases}}}}
file_transport = local_delivery
redirect_router = dnslookup
3) возможно придется внести коррективы в acl_check_rcpt
Что у тебя там наворочено я не знаю, поэтому могу дать только общие рекомендации.Например, у меня ПЕРЕД
require verify = recipient
используется
deny domains = +local_domains
!local_parts = lsearch;/etc/vpasswd (у меня вируальные пользователи в vpasswd)
message = No such address here.Если у тебя есть подобная проверка в acl_check_rcpt, нужно будет ее удалить
(Остальные проверки естественно должны оставаться на месте)require verify = recipient
можно оставить, т.к теперь есть роутер any_user и команда RCPT TO: director@dom.org нормально пройдет verifyМожет случиться, что тебе не придется подстраивать acl_check_rcpt, но в любом случае после внесения всех этих изменений ОБЯЗАТЕЛЬНО надо проверить корректность работы acl_check_rcpt на предмет open relay
Всё!
В общем добавил в роутерах:local_catchall:
debug_print = "R: catchall for $local_part@$domain"
driver = redirect
domains = +local_domains
allow_fail
allow_defer
data = мойадрес@domai.comРаботает.
Как в данном случае не принимать спам?
> Как в данном случае не принимать спам?Ты же сам поставил задачу принимать всю почту для несуществующих почтовых ящиков. Таким образом письма для info, sales, director, buhgalter, audit, office и т.п. ты будешь принимать.
Ну а для общей фильтрации спама есть масса универсальных средств: DNSBL (dnslists = sbl.spamhaus.org), greylist etc. Выбирай, комбинируй.
Спасибо за помощь! Всех благ тебе!