August 24, 2004
New mail server (debian + exim4 + dovecot IMAP)
Matt @ 7:00 pmI spent quite a bit of time over the weekend configuring the new Papercut mail server. We’re running Debian Linux on our servers. It’s a great distribution that makes it damn easy to get almost any linux application working…
apt-get install app-name
… wait a few seconds while apt-get downloads the package and any of it’s dependencies and installs and you’re done.
Choice of mailbox format
The key decision you need to make before choosing the IMAP server is the mail folder format. Each IMAP server has a preferred mail box format, so choosing the right format first time, could save you a lot of time down the track. You have the choice of:
mbox— the traditional UNIX format. One file contains all mail in the foldermbx— an updated version of mbox that make some common operations fastermaildir— each message is stored in a separate file within a directory
To me the idea of storing all mail in a single text file sounds a horrible. When you delete a single message from a huge mail folder, the whole file could have to be rewritten. Care must also be taken so that 2 processes don’t try to update the mail folder at once, otherwise corruption could occur. The mbox/mbx vs. maildir issue seems to be fairly contentious, but to me maildir seemed the more natural way to go. It also allows us to write simple scripts to move mail between folder (… something we do when setting up the spam filtering below).
Choice of IMAP server
Now that we’ve chosen maildir as the mail box format, we need to choose an IMAP server. The main choices are:
- Courier — very popular but complex
- Dovecot — simple and uses indexing to make folder and message access fast
Simple and fast sounded good to me … so Dovecot got the nod.
The MTA — Exim4
The server started it’s life as a Debian 3 “Woody” which used Exim3 as its MTA. Exim3 was doing a fine job, but given that Exim 4 is the default for the upcoming Debian release and Exim3 was no longer developed I chose to upgrade.
apt-get install exim4
… answer a couple of questions … and it’s working perfectly! Lovely.
The only thing we need to do to tell Exim to deliver to a maildir instead of the mbox default. In Debian it’s just a matter of setting the LOCAL_DELIVERY=maildir_home in the exim config file. The result of this is that an exim router for local mail is configured to deliver mail to the following transport:
maildir_home: debug_print = "T: maildir_home for $local_part@$domain" driver = appendfile directory = $home/Maildir delivery_date_add envelope_to_add return_path_add maildir_format mode = 0600 mode_fail_narrower = false
Make sure you restart exim …
~$ /etc/init.d/exim4 restart Restarting MTA: exim4.
To test that things are working correctly try something like this:
~$ sendmail localuser hello .
If all went well, a maildir should be created for the user you sent the mail to in . The new/ subdirectory should contain a file containing the message you just sent.
If that didn’t work, you might have to look through some logs to see what went wrong. On Debian, look for:
/var/log/mail.info /var/log/mail.err /var/log/exim4/exim4.log
OK, now for the IMAP setup…
Installing Dovecot IMAP
Some more Debian magic …
apt-get install dovecot
… connect to the server with Mozilla Thunderbird using IMAP. Hey, presto … it works!! I can see the test email in the inbox.
OK, so local mail delivery is now working. But that’s not very exciting. All our mail gets delivered to POP accounts on the hosting service. To deliver the mail locally I use fetchmail which periodically polls one or more POP inboxes and delivers the mail to local users via the local MTA. (I actually have more than one POP account … but fetchmail can handle that with ease.
Setting up fetchmail
Once fetchmail is installed it’s a simple of matter of telling it where to fetch the mail from. Create a file in your home directory called .fetchmailrc, and for each POP account you want to collect mail from add a line:
poll mail.myisp.com protocol pop3 user "username" pass "password" is "localuser" here keep
The keep option tells fetchmail to keep the mails on the POP server. This is recommended until you’re sure it’s all working. Otherwise an incorrect mail server setup my cause you to lose mail.
To test that it’s working ok type:
~$ fetchmail fetchmail: No mail for username at mail.myisp.com
It will output details of the connection to your mail server(s) and whether it retrieved any mail. It’s probably a good idea to send some test mail to your account and then re-run fetchmail. If all goes well the mail will end up in the ~/Maildir/new directory. (NOTE: Try to send mail from a different account … because if something goes wrong you won’t be able to easily see the delivery failure message.)
If you call fetchmail with the -F option it will delete any messages that it’s already downloaded. So I’ve set up a crontab to call fetchmail every 5 mins and leave the mail on the server. Then once a day I call fetchmail -F to clear mails from the POP account. This way if something goes wrong with the mail server, then the mail will be stored safely on the POP server for 24 hours. So nothing will get lost.



October 1st, 2004 at 12:24 am
Thanks very much for the tips! I’ve been trying to get pop –> fetchmail –> exim4 –> spamassassin –> etcetera –> squirrelmail for the past day or so, found this entry googling, and a few of your tips were really handy. I now have external and internal mail in ~/Maildir/new, so that’s something, eh? I set up IlohaMail with an sql backend the other day, but the no folders thing got to me and I decided it was time to really make myself miserable apt-getting and –purge-ing, going back and forth between courier and dovecot and uw and so forth. :>
Thanks again.
October 19th, 2004 at 10:45 pm
This follow up about speed suggests that other MUAs will not enjoy the speed benefits of Dovecot’s indexing, due (I assume) to client-side caching. I, and most of my users, use Mozilla Thunderbird for IMAP access. I’m curious what MUA you use, and what your perceived performance has been like?
October 20th, 2004 at 8:27 am
I do use Mozilla Thunderbird, and it performs excellently. I switched to Thinderbird about 2 months ago and won’t go back.
My largest mail folder has about 3200 messages and sorting it is almost instantaneous. Searching is messages is also very fast. If I search message the message bodies in this folder it takes only about 1-2 seconds.
March 14th, 2005 at 11:04 am
for the life of me i cant find where this goes
“The only thing we need to do to tell Exim to deliver to a maildir instead of the mbox default. In Debian it’s just a matter of setting the LOCAL_DELIVERY=maildir_home in the exim config file. The result of this is that an exim router for local mail is configured to deliver mail to the following transport”
I recomend when you say change “this” you mention what to change
March 14th, 2005 at 4:04 pm
On Debian this is in one of the files in /etc/exim4/. grep the files in there to find it. I’m using Debians split up exim config files, so for me it’s in /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs.
The section of the file you’re looking for looks like this …
# The default delivery method. See CONFDIR/conf.d/transports/ for other
# possibilities
LOCAL_DELIVERY=maildir_home
March 28th, 2005 at 5:09 pm
I had to jump through the following hoops.
Edit /etc/exim/update-exim4.conf.conf
and add
> dc_localdelivery=maildir_home
run dpkg-reconfigure exim4-config
I think it is because dpkg is managing my config.
July 25th, 2006 at 7:41 pm
Matt, have you every had any issues regarding Thunderbirds IMAP clientside caching of the mail. I seem to be getting this quite regularly on my daughters windows box. The mail header that is highlighted in the top/right pane doesn’t relate to the lower/right mail body. Manually deleting the cache fixes the problem, as the mail is IMAPed down again, but it is still annoying! Any ideas?
August 7th, 2006 at 8:56 am
No I haven’t. Thunderbird works almost flawlessly with our Dovecot IMAP server. I have no idea what could be causing this.
September 12th, 2006 at 9:55 pm
Mark, I think I’ve had this caching problem on thunderbird a few time, but I use POP3. restarting thunderbird seemed to resolve it… strange though…