[Dovecot] LDA and POP3/IMAP user_query

Kirill Miazine km at krot.org
Fri Jan 15 09:52:42 EET 2010


* Michael [2010-01-15 12:12]:
>How do I get IMAP+POP3 vs. LDA to use different user_query statements?
>
>The problem is that the input fields are different.

I don't understand what you mean.

>IMAP/POP3 is an email address
>
>LDA is a username

Again, sorry, but I don't understand what you mean.

>I have written a long statement to try and cater for both however it still
>only works 99% of the time, and the remaining 1% fails. The 1% that fails
>sees the mail being delivered to the wrong mbox. In this particular case the
>same client owned both mboxes so it was ok, but if this had not been the case
>things could have gotten real embarrassing.
>
>Think of the following:
>
>abcwidgets at theirdomain.tld		mailuser1
>mailuser1 at adomain.tld		mailuser2
>
>Now when using the Postfix LDA, email for each address is properly delivered
>to the specified mbox, however in this case because their is a matching name
>for the mbox and the email address lefthand content, the compound SQL query
>returns both results and the LDA will use the first one, which in this case
>was the wrong one.
>
>This is the query used:
>user_query = \
>SELECT mailboxes.username AS user, mailboxes.uid, mailboxes.gid, \
>concat('*:storage=',mailquota,'M') AS quota_rule \
>FROM mailboxes JOIN accounts ON accounts.username = mailboxes.username \
>WHERE ((mailboxes.username = '%n' AND accounts.active='1') || \
>(mailboxes.email = '%u' AND mailboxes.active='1' AND accounts.active='1') || \
>(mailboxes.email = CONCAT('@','%d') AND mailboxes.active='1' \
>AND (SELECT COUNT(email) FROM mailboxes WHERE email='%u') = '0'))

Eeek. This wasn't pretty. I've reformatted the query to make it more
readable.

SELECT
     mailboxes.username AS user,
     mailboxes.uid,
     mailboxes.gid,
     concat('*:storage=',mailquota,'M') AS quota_rule 
FROM
     mailboxes JOIN accounts
         ON accounts.username = mailboxes.username
WHERE
     ((mailboxes.username = '%n' AND accounts.active='1') ||
     (mailboxes.email = '%u' AND mailboxes.active='1' AND accounts.active='1') ||
     (mailboxes.email = CONCAT('@','%d') AND mailboxes.active='1' AND
         (SELECT COUNT(email) FROM mailboxes WHERE email='%u') = '0'));

A suggestion is that you replace the first line after WHERE with

     ((mailboxes.username = '%u' AND accounts.active='1') ||

That is, you replace %n with %u.

>which additionally caters for the few catch alls our users have.
>
>I think this is a massive oversight in the design of Dovecot to use one query
>to for 2 separate and distinct processes, that both use different parameters.

"I think this is a massive oversight in the design of" your query.

In any case, you can use CASE ... WHEN ... and check whether '%s'
(service) is deliver (for LDA) or not...

>From what I can tell it seems to assume that a mail system will always use
>username at domain addresses, and never anything more arbitrary.

What is the format of mailboxes.username in your setup? Will it be
unique?

-- 
     -- Kirill Miazine <km at krot.org>


More information about the dovecot mailing list