PaperCut Blog

Inside PaperCutWayback

New mail server (debian + exim4 + dovecot IMAP)

I 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 folder
  • mbx — an updated version of mbox that make some common operations faster
  • maildir — 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:

debug_print = "T: maildir_home for $local_part@$domain"
driver = appendfile
directory = $home/Maildir
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

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:


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 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

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.


  • Gaea

    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.

  • 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?

  • Matt Doran

    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.

  • geos

    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

  • Matt Doran

    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

  • Pieter

    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.

  • Mark

    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?

  • Matt Doran

    No I haven’t. Thunderbird works almost flawlessly with our Dovecot IMAP server. I have no idea what could be causing this.

  • 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…

  • Jesse Hobart

    This config works if you like the maildir setup. However, mbox setup works just fine with a little config change.

    I use exim4 with config set to mbox: /var/mail

    Modify dovecot.conf

    sudo nano /etc/dovecot/dovecot.conf

    mail_location = mbox:~/mail:INBOX=/var/mail/%u

    #Your external mail will flow into /var/mail/ via exim4 and your mailboxes will be in ~/mail/.
    #I believe, however, that internal mail flows into ~/mail/ through dovecot via IMAP.

    #I use this config with RoundCube webmail and it works flawlessly.