Можно ли проверить псевдоним отправителя на соответствие аутентифицированного пользователя БЕЗ перезаписи поля От? Например, с учетом (значительно упрощенного) файла псевдонима, например:
a1@example.com: user1@mydomain.com
a2@other.example.com: user1@mydomain.com
a3@example.com: a4@example.com
a4@example.com: user1@mydomain.com
a5@example.com: user2@mydomain.com
Я хочу, чтобы аутентифицированный user1 мог отправлять как a1, a2, a3 или a4@example.com, но НЕ a5@example.com, и я хочу, чтобы аутентифицированный user2 мог отправлять как a5@example.com И Я хочу, чтобы они могли использовать псевдонимы в поле From: отправляемых им писем (т.е. я не хочу, чтобы Exim переписывал поля From / Sender, как для «control = submission»).
Функционально это потребует, чтобы Exim уменьшил псевдоним отправителя до конечного маршрутизируемого адреса, а затем разрешил мне доступ к этому значению в acl, чтобы сравнить его с аутентифицированным пользователем. Я думал, что это сделает verify = sender, но тестирование не показывает, что это так.
В моем acl_check_rcpt я пробовал следующее, но безрезультатно, так как любой аутентифицированный пользователь все еще может отправлять как любой действительный псевдоним или другой локальный пользователь, а $ sender_address является псевдонимом, а не базовой реальной учетной записью:
accept
authenticated = *
verify = sender
logwrite = authenticated user '$authenticated_id' sending as '$sender_address' which \
is '$sender_address_data' or '$address_data', if error: '$sender_verify_failure'
Согласно Документация Exim (Раздел 26), $ sender_address_data должен содержать результат поиска отправителя после verify = sender, но журналы показывают, что эта переменная всегда пуста:
authenticated user 'user1' sending as 'a5@example.com' which is '' or '', if error: ''
(Обратите внимание, что control = submission мало влияет на это, за исключением перезаписи заголовков From / Sender.)
Я просто ошибаюсь? Есть ли способ проверить, может ли аутентифицированный пользователь правильно отправить псевдоним, с которого он отправляет?
У меня это работает, и вот что я сделал.
Во-первых, во ВСЕХ маршрутизаторах, которые обрабатывают локальных пользователей, установите для переменной exim address_data значение $ {local_part}:
real_local:
driver = accept
domains = +local_domains
local_part_prefix = real-
check_local_user
transport = LOCAL_DELIVERY
# Set this so acl can use it
address_data = ${local_part}
Затем настройте acl для проверки отправителя и аутентифицированного пользователя:
acl_smtp_mail = acl_check_sender_vs_auth
И пусть этот новый acl сравнит аутентифицированного пользователя со значением переменной address_data и убедитесь, что оно такое же:
# Ensure that the MAIL FROM: address matches what the authenticated
# user is, if authentiation is used
acl_check_sender_vs_auth:
accept
authenticated = *
# verify MUST be above condition to resolve $sender_address_data
verify = sender
condition = ${if eqi{$authenticated_id}{$sender_address_data}{yes}{no}}
endpass
logwrite = AUTH OK - authenticated user '$authenticated_id' sending email from '$sender_address', which belongs to '$sender_address_data'
deny
authenticated = *
# verify MUST be above condition to resolve $sender_address_data
verify = sender
!condition = ${if eqi{$authenticated_id}{$sender_address_data}{yes}{no}}
message = User '$authenticated_id' tried to send mail from '$sender_address', but that email address belongs to someone else
logwrite = AUTH ERROR - authenticated user '$authenticated_id' tried sending from '$sender_address', but that address belongs to '$sender_address_data'
accept