use dovecot to store mails with lmtp

After more than a year working on my mail setup, I think I have it running in a pretty good way. As some of the stuff is not documented at all in the wide of the internet, I will post parts here to make it accessible to others.

Many setups use the MTA (postfix, exim) to store mails on the filesystem. My setup lets dovecot take care of that. That way it is the only process able to change data on the filesystem.

to make this work, we first need a lmtp socket opened by dovecot. The configuration part looks like this

service lmtp {
  unix_listener /var/spool/postfix/private/delivery.sock {
    mode = 0600
    user = postfix
    group = postfix
  }
}

LMTP is a lightweight smtp protocol and most mail server components can speak it.

Next we need to tell postfix to send mails to this socket instead storing it on the filesystem. This can be done with with the following setting

mailbox_transport = lmtp:unix:/var/spool/postfix/private/delivery.sock

or for virtal accounts with

virtual_transport = lmtp:unix:/var/spool/postfix/private/delivery.sock

Now postfix will use the socket to deliver the mails.

It is also possible to use other services between these two like dspam. In my case postfix delivers the mails to dspam and that will deliver them to dovecot.

For dovecot change the path of the socket to something dspam can reach. I’m using /var/run/delivery.sock.

Then change the dspam.conf to use that socket as a delivery host

DeliveryProto LMTP
DeliveryHost  "/var/run/delivery.sock"

As postfix needs to speak to dspam, we set dspam to create a socket too

ServerMode auto
ServerDomainSocketPath "/var/run/dspam.sock"

ServerMode should be set to either auto or standard.

Now the only thing left to do is to tell postfix to use that socket to deliver its mails. For that, set the options from before to the new socket

virtual_transport = lmtp:unix:/var/run/dspam.sock

And with that, we have a nice setup where only dovecot stores mails.