Здравствуйте.
Сперва некоторые пояснения. Используется postfix+openldap+dovecot и виртуальные пользователи.
Организована такая структура каталога LDAP, что возможен такой результат запроса:
# extended LDIF
#
# LDAPv3
# base <ou=Mail, dc=ph, dc=local> with scope subtree
# filter: (&(mail=someuser@p.ru)(|(AccountStatus=active)(accountStatus=shared)))
# requesting: mailMessageStore
#
dn: cn=lala,ou=Mail,dc=ph,dc=local
mailMessageStore: /var/mail/someuser/Maildir/
# Eset, Mail, ph.local
dn: cn=Eset,ou=Mail,dc=ph,dc=local
# admins, Mail, ph.local
dn: cn=admins,ou=Mail,dc=ph,dc=local
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
Что это означает? А означает следующее: dn «cn=Eset,ou=Mail,dc=ph,dc=local» и «cn=admins,ou=Mail,dc=ph,dc=local» — аккаунты, не хранящие ничего локально и являющиеся, по сути, списками рассылки. Соответственно, если послать письмо на адрес-алиас mailAlternateAddress такой рассылки, то оно будет разослано всем, кто указан в поле mail. Очень удобно. В данном конкретном случае, такое письмо попадёт к «dn: cn=lala,ou=Mail,dc=ph,dc=local», где и будет благополучно засунуто в mailMessageStore.
Разумеется, прямые письма к «dn: cn=lala,ou=Mail,dc=ph,dc=local» будут сразу ему доставлены локально.
Кроме того, некоторые пользователи электронной почтой не имеют почтовых адресов, совпадающих с их uid. Вообще никаких: ни mail, ни mailAlternateAddress.
Вся эта конструкция замечательно работала и работает, если использовать в postfix
virtual_transport = virtual
Захотелось, чтобы dovecot, кроме простой раздачи писем по IMAP, просеивал письма через sieve, следил за квотами и т.д. Соответственно, приходится настраивать dovecot-lda.
Соединение между dovecot и postfix настроено нормально, в целом всё прекрасно, за исключением вот таких, описанных выше случаев.
В main.cf:
dovecot_destination_recipient_limit = 1
virtual_transport = dovecot
#virtual_transport = virtual
В master.cf :
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
Соответствующее место в dovecot-ldap.conf:
user_filter = (&(objectClass=qmailUser)(|(AccountStatus=active)(accountStatus=shared))(|(mail=%u)(mailAlternateAddress=%u)))
pass_filter = (&(objectClass=qmailUser)(|(AccountStatus=active)(accountStatus=shared))(|(mail=%u)(mailAlternateAddress=%u)))
user_attrs = mailMessageStore=home
pass_attrs = uid=user,userPassword=password
Посылаю письмо указанному в самом начале someuser:
mutt -s "test $(date +%d/%m/%Y:%H.%M)" -- someuser@p.ru < /dev/null
dovecot: lda: Debug: Module loaded: /usr/lib64/dovecot/lib90_sieve_plugin.so
dovecot: auth: Debug: master in: USER#0111#011someuser@p.ru#011service=lda
dovecot: auth: Debug: ldap(someuser@p.ru): user search: base=ou=Mail, dc=ph, dc=local scope=subtree filter=(&(objectClass=qmailUser)(|(AccountStatus=active)(accountStatus=shared))(|(mail=someuser@p.ru)(mailAlternateAddress=someuser@p.ru))) fields=mailMessageStore
dovecot: auth: Debug: ldap(someuser@p.ru): result: mailMessageStore(home)=/var/mail/someuser/Maildir/
dovecot: auth: Error: ldap(someuser@p.ru): user_filter matched multiple objects, aborting
dovecot: auth: Debug: master out: FAIL#0111
dovecot: lda: Error: user someuser@p.ru: Auth USER lookup failed
dovecot: lda: Debug: auth input:
dovecot: lda: Fatal: Internal error occurred. Refer to server log for more information.
postfix/pipe[3259]: 89001846: to=<someuser@p.ru>, relay=dovecot, delay=0.15, delays=0.07/0.01/0/0.07, dsn=4.3.0, status=deferred (temporary failure)
Эта ситуация меня безмерно огорчает.
Вопрос: возможно ли заставить postfix через ${user} в master.cf передавать на dovecot-lda найденный postix'ом же uid, который будет искаться в LDAP для конкретного письма, а не тупо браться из адреса назначения, как вот тут: dovecot-ldap.conf
user_filter = %u %n %d
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${user}
dovecot: auth: Debug: ldap(someuser): user search: base=ou=Mail, dc=ph, dc=local scope=subtree filter=someuser someuser fields=mailMessageStore