Dovecot LDA with Sendmail

The following describes how to configure Sendmail to use dovecot-lda where root permission is not granted and Dovecot runs under a single user ID. It may need some adjustment for more typical setups. Other assumptions are that Sendmail is configured for virtual hosting and that local-system mail delivery is not handled by dovecot-lda.

Allowing that sendmail.mc has MAILER(procmail)dnl included, edit sendmail.cf adding these lines after the Mprocmail definition:

######################*****##############
###   DOVECOT Mailer specification    ###
##################*****##################
Mdovecot,   P=/usr/local/libexec/dovecot/dovecot-lda, F=DFMPhnu9,
            S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
            T=DNS/RFC822/X-Unix,
            A=/usr/local/libexec/dovecot/dovecot-lda -d $u

If you’re using sendmail.mc then put the lines above into a new file /usr/share/sendmail-cf/mailer/dovecot.m4 and put MAILER(dovecot) into your sendmail.mc


Another method of doing the above is by editing your hostname.mc with the following three lines:

FEATURE(`local_procmail', `/usr/local/libexec/dovecot/dovecot-lda',`/usr/local/libexec/dovecot/dovecot-lda -d $u')
MODIFY_MAILER_FLAGS(`LOCAL', `-f')
MAILER(procmail)

After editing hostname.mc with the above, be sure to remake your hostname.cf file. This is confirmed to work with:

  • dovecot-1.0.7

  • FreeBSD 6.3-RELEASE-p3 i386

  • sendmail Version 8.14.2

  • Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF STARTTLS TCPWRAPPERS USERDB XDEBUG


If sendmail runs under a different non-root UID via

  • define(`confRUN_AS_USER', `sendmail')dnl

in sendmail.mc, then the env_put(t_strconcat("RESTRICT\_ lines in deliver.c must be commented-out.

Now add a

virtualdomain.example.com vmail:vmail

line for each virtual domain to mailertable.cf and run makemap hash mailertable.db < mailertable.cf. The dovecot (or some other random text) after the colon character is required, else sendmail will fail to pass command arguments to dovecot-lda correctly. Make sure all the virtual domains are in the virtuserdomains file.


(Fedora 14: dovecot 2.0.8 & sendmail 8.14.4)

Summing up all previous experience, one may keep all virtual user accounts under one system account.

The sendmail’s “U=” mailer option with changing the owner of lda (to “keeper” here for instance):

-rwxr-xr-x. 1 keeper mail 14536 Dec  7 16:43 /usr/libexec/dovecot/dovecot-lda

allows to run virtual users under one system account without applying SUID.

Sendmail can pass a user account to LDA with or without the domain. Passing a user name without the domain can be achieved with S=/R= rewriting rules of the local mailer. Finally, into /usr/share/sendmail-cf/mailer/dovecot.m4 goes the block of lines:

Mdovecot,      P=/usr/libexec/dovecot/dovecot-lda,
               F=l59DFMPhnuS,
               S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
               M=51200000,
               U=keeper:mail,
               T=DNS/RFC822/X-Unix,
               A=/usr/libexec/dovecot/dovecot-lda -d $u

Sendmail’s dovecot.m4 can be a bit more complex.