In a previous article I did an overview of how I learned a few tools to tune my emails storage (mostly how to classify them based on their provenance). Today we will do a quick dive into how to tweak a bit the configuration for
exim4 for local mail delivery.
exim4 is one of those old UNIX services that exists since the dawn of time: it's a mail server service and an MTA (basically it can process emails and transfer them from A to B, whatever "A" and "B" are).
I suspect virtually any Linux box has a mail delivery service active by default since it's so ingrained since the UNIX days (when the idea of being networked terminals was in the DNA of these workstations) and I guess we often ignore we have this thing running in our laptops in the background, mostly idling.
Historically these agents will save emails in a mbox format (that is: a single text file with all the mails concatenated). This
mbox file usually resides in
/var/mail/$USER and can be inspected with something like
less +G /var/mail/$USER. To handle this mailbox either use the command
mailutils) or delete the file altogether, it will be recreated.
Today, it is suggested to use the Maildir format (creates a hierarchy of directories and each mail is a single file). I use the
$MAILDIR env var to let everyone know where my maildir is.
The task at hand today will be telling exim4 to save them in our maildir directory.
Important note: since I am using Debian, most of content explained here is specific to Debian. The
exim4 package has some Debian maintainer scripts that makes things a little bit more opaque. I ignore why but I guess they had good reasons.
§ Configure exim4
exim4 configuration sits in
/etc/exim4. We can start by looking at
/etc/exim4/update-exim4.conf.conf. This is a Debian maintainer script which proxies the real
exim4 configuration and it's still unclear to me how
exim4 is actually configured on Debian. The config file will probably have this line:
exim4 to save messages in a single mbox file, as per
man 5 update-exim4.conf.conf:
dc_localdelivery name of the default transport for local mail delivery. Defaults to mail_spool if unset, use maildir_home for delivery to ~/Maildir/. Sets macro LOCAL_DELIVERY.
Let's change it! Reconfigure
choose the profile "local delivery only; not on a network" and "Maildir format in home directory":
1. internet site; mail is sent and received directly using SMTP 2. mail sent by smarthost; received via SMTP or fetchmail 3. mail sent by smarthost; no local mail 4. local delivery only; not on a network 5. no configuration at this time General type of mail configuration: 4 1. mbox format in /var/mail/ 2. Maildir format in home directory Delivery method for local mail: 2
(documentation online or read
/usr/share/doc/exim4-base/README.Debian.html). The Debian maintainer script
/etc/exim4/update-exim4.conf.conf will be updated. The line above will now be:
As mentioned in the man page, it will also set the macro
LOCAL_DELIVERY=maildir_home: this indicates that exim4 will use a Maildir and will save emails in
However, we want our mail delivered to another maildir so we will leverage another feature of the exim config file for customizations: macros.
You'll notice that in
/etc/exim4.conf is it defined the
maildir_home configuration block:
maildir_home: debug_print = "T: maildir_home for $local_part@$domain" driver = appendfile .ifdef MAILDIR_HOME_MAILDIR_LOCATION directory = MAILDIR_HOME_MAILDIR_LOCATION .else directory = $home/Maildir .endif
MAILDIR_HOME_MAILDIR_LOCATION is the macro we need to override. Let's create a file
/etc/exim4/conf.d/main/00_localmacros with the following line:
MAILDIR_HOME_MAILDIR_LOCATION = $home/.local/mail/.system
Please note the path
/.system (with a dot!).
This will tell
exim4 about our custom maildir. Let's regenerate the configuration with:
update-exim4.conf --keepcomments --output /etc/exim4/exim4.conf
And it's done. Now at the beginning of
/etc/exim4/exim4.conf we will find the content of our
00_localmacros that will overwrite the default maildir.
Let's test that emails are delivered in the right place (no need to restart exim4) by triggering a security alert and execute
sudo ls then CTRL+C at the password prompt. Let's check where we expect the emails to be stored:
$ find -f system $MAILDIR /home/$USER/.local/mail/.system/ /home/$USER/.local/mail/.system/tmp /home/$USER/.local/mail/.system/cur /home/$USER/.local/mail/.system/new /home/$USER/.local/mail/.system/new/1673815837.M248507P3365656.hostname.localdomain
Yay, it worked! The new maildir has been created automatically thanks to the directive
/etc/exim4/exim4.conf and we have a nice email about a failed
sudo command :)
exim4 logs are at
I now receive in my mailbox a couple of useful emails from my Debian installation (such as important news about updated packages or CVEs), which before I was missing (I was just blindly updating packages).
It took a good deal of time to figure out the above but the documentation is stellar, just not very easily discoverable.
Some minor issues I can think of:
I cannot have a local override config file,
exim4has only a global system file (kind of makes sense)
Is this solution complete? Will all applications obey these settings? I have no idea.