How to map email addresses to usernames?
Andreas Born
dovecot at abotech.de
Tue Oct 10 05:26:33 EEST 2017
Hello,
I have a general question about userdb and passdb lookups, in my case related
to driver=sql.
The documentation and most examples in the internet seem to assume that a
user's login username to access a mailbox is identical to his email-address,
or at least to the local-part of this email-address. This setup works fine.
But I don't understand how to setup dovecot, when login username and email
adresses differ. Or to say it in other words, how to map email-adresses to
mailbox users.
I need a sql password_query for passdb to validate the password for a given
login name during SMTP or SASL authentication. Lets say the credentials are
"user-1"/"anypassword", then the query is similar to "select password from
mailboxes where username='%u'".
The next step, user_query for userdb is executed to get storage information
for user "user-1". This query must also search for the username "user-1", not
for an email-adress: "select home, mail from mailboxes where username='%u'".
So far, so good. But:
For incoming mails via LMTP, my user_query from userdb is being executed with
the email-address as search parameter (instead of the login name), so it
fails. I miss a third query that maps one user to each email address for
delivery, prior to the userdb lookup. For Example:
bob at example.org => user-1
eve at example.org => user-1
ted at example.org => user-2
@catchall.org => user-3
"select username from addr_maps where addr='%n@%d'".
What is the correct setup for this szenario?
I've found two solutions that seem to work, but i'm not sure if they are
really failsafe.
I) I use driver=prefetch as a first userdb, so for authentication, only the
password_query from passdb is relevant and returns all mailbox details. A
second userdb does a user_query lookup against email-addresses and is only
called for incoming mails.
passdb {
driver = sql
args = /etc/dovecot/sql-check-user.conf
}
userdb {
driver = prefetch
}
userdb {
driver = sql
args = /etc/dovecot/sql-check-addr.conf
}
II) The second userdb performs lookups against usernames (as in the passwd
query), but I place a third userdb {} within the lmtp's protocol section,
which does a address lookup instead of a username lookup:
protocol lmtp {
userdb {
driver = sql
args = /etc/dovecot/sql-check-addr.conf
}
}
passdb {
driver = sql
args = /etc/dovecot/sql-check-user.conf
}
userdb {
driver = sql
args = /etc/dovecot/sql-check-user.conf
}
What do you think, is there a better solution?
- greetings
Andreas
Dovecot Version: 2.2.27 (c0f36b0)
More information about the dovecot
mailing list