Exim LDAP AD запрос, перенаправление почты

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
McLeod095
рядовой
Сообщения: 11
Зарегистрирован: 2009-07-14 9:38:52

Exim LDAP AD запрос, перенаправление почты

Непрочитанное сообщение McLeod095 » 2011-11-28 11:52:36

Все добрый день!
Кручу exim и dovecot для работы с АД, уже многое настроил, как получение почты на адреса существующие в АД, также есть обработка alias, которое хранится в атрибуте otherMailbox АД. Также обрабатывается рассылка по группам которые заведены в АД. То есть уже многое настроено, но вот хочется как всегда большего. Теперь хочется что бы в АД можно было указать пересылку почты на другой адрес, и она туда отправлялась.
Если включена пересылка почты то в АД устанавливается атрибут altRecipient, где прописывается basename контакта, куда необходимо отправлять почту. Как выцепить этот атрибут и получить адрес получателя это понятно

Код: Выделить всё

${map  {${lookup ldap{user=ldap_user@domain.ltd pass=user_pass ldap:///dc=domain,dc=ltd?altrecipient?sub?          
(&(objectClass=user)(mail=${quote_ldap:${local_part}@{domain}})(!(userAccountControl:1.2.840.113556.1.4.803:=2))(altrecipient=*))}}\
} \
{${lookup ldap{user=ldap_user@domains.ltd pass=user_pass ldap:///${quote_ldapdn:$item}?mail?base?}}\
}\
}
Также когда необходимо не только перенаправить почту, но и оставить копию в ящике пользователя в АД устанавливается атрибут deliverAndRedirect, который устанавливается в true.
и вот тут-то и возникает вопрос, как написать условие которое бы обрабатывало два случая, то есть если установлен атрибут deliverAndRedirect получало почтовый адрес, не только контакта куда надо переслать но и самого пользователя(как выдернуть его из ад тоже знаю), а если не установлен то только адрес контакта.
Понятное дело что если результат выполнения такого условия присвоить переменной data маршрута exim, то получим или пустую строку, что приведет к отбросу данного маршрута, или получим адреса на которые надо перенаправить письмо, если там будет и адрес который находится в $local_part@$domain то механизм предотвращения зацикливания не должен будет для данного адреса второй раз обрабатывать данный маршрут.
Вот остается только правильно составить запрос, помогите кто как сможет.
Проверка условия def не подходит, т.к. там используются только переменные.
Если использовать eq то не понятно ч ем стравнивать.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

McLeod095
рядовой
Сообщения: 11
Зарегистрирован: 2009-07-14 9:38:52

Re: Exim LDAP AD запрос, перенаправление почты

Непрочитанное сообщение McLeod095 » 2011-11-28 17:21:12

Ну придется ответить на свой вопрос самому.
Кстати оказалось все довольно просто
Сразу оговорюсь, я для каждого маршрута делаю отдельный файл, и его уже включаю в конфиг exim. И для каждого запроса к LDAP в определенном файле где хранится все что связано с LDAP, тоже прописываю запросы и называю их каждый отдельно
поэтому здесь приведу просто переменные что бы было более понятно

Код: Выделить всё

LDAP_USER=ldap_user@domain.ltd
LDAP_PASS=pass
LDAP_BASE=dc=domain,dc=ltd
LDAP_CONN=user=LDAP_USER pass=LDAP_PASS ldap:///LDAP_BASE
ну и теперь сам файл для маршрута, опять же для понимания приведу его в более читаемом виде

Код: Выделить всё

cat ROUTER.forward_mail.conf 
forward:
        driver  =       redirect
        allow_fail
        allow_defer
        domains =       +local_domains
        data    = ${if eqi{\
                                                ${lookup ldap{LDAP_CONN?deliverAndRedirect?sub?(&(objectClass=user)(|(mail=${quote_ldap:${local_part}@${domain}})(otherMailbox=${quote_ldap:${local_part}@${domain}}))(!(userAccountControl:1.2.840.113556.1.4.803:=2))(!(msExchUserAccountControl=0))(altrecipient=*))}}}\
                                                {true}\
                                                {${map\
                                                {${lookup ldap{LDAP_CONN?altrecipient?sub?(&(objectClass=user)(|(mail=${quote_ldap:${local_part}@${domain}})(otherMailbox=${quote_ldap:${local_part}@${domain}}))(!(userAccountControl:1.2.840.113556.1.4.803:=2))(!(msExchUserAccountControl=0))(altrecipient=*))}}}\
                                                {${lookup ldap{user=LDAP_USER pass=LDAP_PASS ldap:///${quote_ldapdn:$item}?mail?base?}}}},$local_part@$domain}\
                                                {${map\
                                                {${lookup ldap{LDAP_CONN?altrecipient?sub?(&(objectClass=user)(|(mail=${quote_ldap:${local_part}@${domain}})(otherMailbox=${quote_ldap:${local_part}@${domain}}))(!(userAccountControl:1.2.840.113556.1.4.803:=2))(!(msExchUserAccountControl=0))(altrecipient=*))}}}\
                                                {${lookup ldap{user=LDAP_USER pass=LDAP_PASS ldap:///${quote_ldapdn:$item}?mail?base?}}}}\
                                                }\
}
В проверке LDAP есть такой атрибут как msExchUserAccountControl, он мне необходим что бы разделять пользователей которые находятся на exchange и тех которые находятся на dovecot. У нас плавная миграция с первого на второй, потому как дорого, а примочки первого не используются.
Если будут примечания, то пишите.