I spent much longer than I’d like to admit moving my mail server today. The Debian exim4 package is very easy to configure and setting up TLS and authentication is a snap with the help of a very good Debian Administration article. Also I’ve had to tweak the address_file transport to support Sieve and the fileinto action.
What I’m writing now is mostly for my own benefit so I don’t have to look this same crap up in a few years when I move my mail server again:
TLS and Auth
The howto above uses the standard exim auth from /etc/exim4/passwd but if you want to use something like the courier-authdaemon all you need to do is go further down in /etc/exim4/conf.d/auth/30_exim4-config_examples to uncomment a later section:
plain_courier_authdaemon: login_courier_authdaemon:
All authentication should be done over TLS and enabling this only requires a private key, a certificate and adding this file: /etc/exim4/main/000_localmacros:
MAIN_TLS_ENABLE = yes MAIN_TLS_CERTIFICATE = /etc/ssl/certs/example.org.cert MAIN_TLS_PRIVATEKEY = /etc/exim4/example.org.key
The Debian exim daemon is running as the user Debian-exim so it won’t be able to access files in /etc/ssl/private. You can either keep your secret key in /etc/exim4 as I’ve done above or add the Debian-exim user to the daemon group and make the group for /etc/ssl/private daemon. Either is reasonable but you’ll have to add Debian-exim to the daemon group anyway so it can use the authdaemon socket.
At this point you should check to be sure your mail isn’t an open relay and there are a number of tools available to test this. Some are websites that you can simply enter the IP/domain name of your mail server. Others are tools like swaks where you can test this for yourself. A good example of using swaks for testing exim4 can be found here.
Exim4 and Sieve
Finally it seems like the Exim4 package on Debian Squeeze may have a bug when it comes to delivering mail to users with Sieve filters in their .forward file. I kept getting an error stating:
R=userforward T=address_file defer (-21): appendfile: file or directory name "inbox" is not absolute
To debug this a cheetsheet for getting Exim to do your bidding essential. The best one I could find is here.
There are a number of mailing list posts out there discussing similar errors but none seemed to fix my problem. Basically the error message means that the appendfile transport isn’t able to figure out what the “inbox” from a sieve filter should be when converted to a file/directory name. I’m using maildir in a users home directory so I spent a few hours poking around that part of the configuration to no avail.
Eventually, in my old configuration, I found a patch to the address_file transport to help it figure out what “inbox” is:
--- a/conf.d/transport/30_exim4-config_address_file 2005-02-19 05:25:59.000000000 -0500 +++ b/conf.d/transport/30_exim4-config_address_file 2011-07-24 21:52:33.270494409 -0400 @@ -8,4 +8,8 @@ delivery_date_add envelope_to_add return_path_add + directory = ${if eq{$address_file}{inbox} + {$home/Maildir/new} + {$home/Maildir/.${sg{$address_file}{^inbox[.]}{}}/new} + }
Here comes the disclaimer: I’m no Exim hacker and I can barely figure out what this does. I found it two years ago when I was setting up my mail server and had to get Sieve filters working. When I moved this mail server today I upgraded from Lenny to Squeeze and figured this may have been fixed. It wasn’t though so I had to dig through my old configs to find it again.