Намедни понадобилось добавить в Exim проверку отправителей почты для того, чтобы требовать авторизацию. Решение простое, но так как последний раз я конфигурировал exim более года назад, то потратил кучу времени на чтение документации. Мое решение выглядит следующим образом.
Добавил список поиска адресов локальных отправителей:addresslist local_senders = ${lookup pgsql{SELECT m.name||'@'||d.localdomain \ FROM mail m \ LEFT JOIN localdomains d ON d.id = m.localdomain \ WHERE d.localdomain='${quote_pgsql:$sender_address_domain}' and \ m.name='${quote_pgsql:$sender_address_local_part}' and \ not m.block}}
Сначала забыл о существовании $sender_address_domain и $sender_address_local_part пытался использовать $domain и $local_part.
В секцию acl_smtp_rcpt списков контроля доступа добавил следующие проверки:
deny message = $sender_address must be authenticated. !authenticated = * senders = +local_senders deny message = sender $sender_address has \ authenticated as $authenticated_id authenticated = * condition = ${if eq {$authenticated_id}{$sender_address}\ {no}{yes}}
Первая запрещает отправлять сообщения подписанные от имени локальных пользователей без авторизации. Второе запрещает авторизованным пользователям подписываться отлично от имени авторизованного пользователя.
Вывод: не следует недооценивать временные затраты на выполнение действий в областях, с которыми редко имеешь дело.
Вот-спасибо-хорошо! Именно то, что нужно.
ОтветитьУдалитьНемного переделал запрос для vexim:
addresslist local_senders = ${lookup mysql{SELECT m.name||'@'||d.localdomain \
FROM users m LEFT JOIN domains d ON d.id = m.localdomain \
WHERE d.localdomain='${quote_mysql:$sender_address_domain}' and \
m.name='${quote_mysql:$sender_address_local_part}' and not m.block}}
Рад, что пригодилось.
ОтветитьУдалить