This is just another article about how to get your emails managed in a graceful way.
Here is my former way of dealing with them: I choose Gmail as my primary email service provider, and use the online Gmail web page for managing most of the emails – view and move to trash. As for emails need my reply or participate, I use Thunderbird 3 + Enigmail with Gmail’s IMAP support, so I can GPG sign my outbound emails and verify signatures of inbound ones from other people. I keep emails on Gmail server and have a backup copy on my PC from Thunderbird’s IMAP sync.
Yes, everything looked good in the days I have only a not-too-much amount of emails and I was happy with all above worked well for a long period. But a bad thing appears while my mailbox size is growing quite fast in the near half year: Thunderbird’s speed is lower and lower, the local Mbox file is larger day by day. Personally I don’t think Mbox format with big amount of emails stored in a single file is so reliable because when there is something wrong, everything soon follow.
My initial thought of turning to another way is, I need to find a better way for managing large amount of growing emails, and three overall requirements are listed below:
Next, search the Internet and we can surely found Mutt should be counted in our list of choices, and there are several different usages. Before comparing among them, I need to say something about the email system first.
There are three key elements in an email system: MUA (Mail User Agent), MTA (Mail Transfer Agent) and MDA (Mail Delivery Agent):
When we are receiving and sending emails on our local computer (not the web based way since it is actually handled by remote server), we need all of the three parts. We get emails from remote server’s inbox with MTA; filter and deliver the emails to our email spool with MDA; read, write and manage emails with MUA; and send emails with a sending MTA. As for the local storage format, there is Mbox that I don’t like, and Maildir I am interested in. More about storage format will be described in following paragraphs.
There are many alternative all-in-one solutions like Thunderbird, Evolution, KMail and so on, they combine the functions which are required to manage emails for an end-user and hide them behind. Now I am not finding another all-in-one application so I need to choose every program to take their roles in the route of receiving and sending emails. Since I have decided to use Mutt as my MUA from beginning, I don’t need to be bothered by this topic, again.
First I need a receiving MTA for fetching emails from Gmail server. There are two popular choices: Fetchmail and Getmail4.
Both of the two supports both IMAP and POP3 protocol that are my choices of receiving emails. I prefer to use IMAP because the protocol is designed to have the functions POP3 has and many other features including sync between server and clients. I don’t really need to have mails synced because the local copy is mostly a backup, and I can do it through web interface or Thunderbird if I really need them to be synced. Setting up an IMAP synced local mail solution is kind of off topic from this article, and you may want to try imapsync if you are sure you really need. Another reason of my choosing IMAP over POP3 is, Gmail’s POP3 implementation has violated the commonly expected behavior and there are much more limitations than IMAP (you can fetch around 200-500 mails per session in POP3, and probably be locked 24 hours if you access it several times in a short period, but when you are a newbie and trying to test your configuration you may exceed the limits).
Now try them out to find which one is better for me. The configuration files always have your email account and password, so make it only readable by yourself using:
chmod 0600 /path/to/file
Here are the configurations for both the programs, username and password are changed to “user” and “passwd”:
#set daemon 600
#set syslog
defaults
poll "imap.gmail.com" proto IMAP
user 'user' password 'passwd'
mda "/usr/bin/procmail"
keep ssl
sslcertck
sslcertpath /etc/ssl/certs
fetchall
folder "[Gmail]/All Mail"
The commented lines are telling fetchmail to work as a daemon and try to fetch emails from server every 600 seconds. Option “defaults” tells fetchmail load its default settings. The following two lines describes the server, protocol, username, password; port and local mapped user can be set as well, but I don’t need it. Next line started by “mda” tells fetchmail it should relay received emails to the specific MDA, now we set it to “/usr/bin/procmail” and will be documented in following paragraphs. “keep” means fetchmail should keep the copy on server after getting the mails, this option is not very useful for Gmail because there are preferences on the web interface that you can choose how the server deal with the delete request from clients. “ssl” stands for use ssl, “sslcertck” for checking whether the cert of server has a valid signature by a CA, and “sslcertpath” sets the path of CA cert’s and we use “/etc/ssl/certs”. “fetchall” tells that fetchmail should fetch all emails on the server rather than only new ones. “folder” tells the exact folder fetchmail should go and check, we set it to “[Gmail]/All Mail”.
[retriever]
type = SimpleIMAPSSLRetriever
server = imap.gmail.com
username = user
password = passwd
mailboxes = ("[Gmail]/All Mail",)
[destination]
type = MDA_external
path = /usr/bin/procmail
[options]
delete = false
message_log = ~/.mail/getmail.log
message_log_syslog = false
read_all = false
verbose = 2
delivered_to = false
received = false
Briefly, there are three sections in Getmail4’s configuration file: [retriever] (defines which kind of protocol to use and options related), [destination] (defines where to deliver or pass the emails) and [options] (other options for Getmail4).
I use “SimpleIMAPSSLRetriever” type of retriever and its name suggests that it is used to common SSL enabled IMAP protocol, which meets our needs. Other fields in this section are easy to understand, the last one defines which folder the program should check, and don’t forget the last comma (,) if you only have one mailbox to be listed there. For destination, I was planning (finally I changed my mind, read on) to use procmail so I have a “MDA_external” type destination, and point the path to “/usr/bin/procmail”. In the last section, “delete” defines whether mails should be deleted from remote server after being received, as said in Fetchmail configuration’s explanation, it is not really necessary for Gmail users, “message_log” defines where the log of retrieving every message should go and “message_log_syslog” is the switch whether message retrieve info should be logged to syslog. “read_all” should not be set to true because it is saying that ignoring what have been fetched and get everything every time Getmail4 runs. “verbose” controls log verbosity: if set to 2, print messages about each of its actions; if set to 1, print messages about retrieving and deleting messages (only); if set to 0, ll only print warnings and errors. “delivered_to” and “received” tells Getmail4 whether it should add those two fields to retrieved emails header, personally like them to be set to “no”.
Before we start our test, we need to setup our MDA – Procmail. It is the time for me to tell you why I prefer Maildir local storage format to Mbox used by Thunderbird. In Maildir, every email is stored in a single file, and a real folder contains all the files in a “folder” on remote server. The email files are in plain text. There are three most important benefits from Maildir:
And here are disadvantages:
As I can search the text of email within web interface of Gmail, I don’t need to care too much about the searching disadvantages. I am using Ext4 and is strong enough to handle thousands of small files in one directory. At last I am choosing Mutt which supports Maildir very well. I’d like to take the advantages of it now.
Here is my configuration of Procmail, $HOME/.procmailrc:
VERBOSE=off
DEFAULT=$HOME/.mail/inbox/
MAILDIR=$HOME/.mail/
LOGFILE=$HOME/.mail/procmail.log
Don’t forget the slash after “$HOME/.mail/inbox/”, if you lose it Procmail will use Mbox, and you if add it, Maildir instead.
So we can kick off our test now, keep in mind that neither Fethmail nor Getmail4 nor Procmail need root privilege, just run them in your account:
$ fetchmail -v
$ getmail
I have to admit my prediction of result is totally wrong. I thought Fetchmail is used by many many people and is written in the efficient C, Getmail4 only has a smaller user base and is written in Python which may take more resource on many cases. But the result tells me, under the current configuration, neither of them work for me: Fetchmail fails to fetch around 1/10 of my attachments and only get 0.x KB for a 5MB+ email; Getmail4 stuck when fetching mails larger than 5MB.
What a hell! But I am not stopping because there is another way – Getmail4 is designed to have some MDA functions built-in, so it can deliver messages directly to Maildir or Mbox format for user. It is time to say I like Gmail’s excellent spam filtering feature so that I don’t need to pay so much time on setting up a spam filter with Procmail or Maildrop, and a simple delivery is okay. Now I change the [destination] section of $HOME/.getmail/getmailrc to:
[destination]
type = Maildir
path = ~/.mail/inbox/
and run again:
$ getmail
Great this time and all my emails are retrieved successfully after a long time’s wait (just leave it here and move on other stuff).
After choosing a suitable receiving MTA (my choice is with MDA built-in), I still need a sending MTA. There are several popular choices, for light-weight ones: msmtp, esmtp; for powerful ones: exim4, postfix and qmail. The last three ones are run as root daemon, designed to be full replacement of the traditional sendmail. Usually we don’t need such big things for a daily purpose, and they are really worth considering if you would like to run a *real* MTA that can exchange emails with other servers.
Either msmtp or esmtp is designed to work as an agent to forward local email to a real MTA server supports SMTP protocol. Currently msmtp is more welcomed, but the feature list is shorter than esmtp. After a detailed check, that esmtp is not maintained now, so I choose msmtp. Here is my configuration, $HOME/.msmtprc:
defaults
tls on
tls_starttls on
tls_certcheck on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.mail/msmtp.log
account default
host smtp.gmail.com
port 587
from user@gmail.com
auth on
user user
password passwd
There is your username and password in this file, so follow the instruction before to change this file to 0600 mode. “tls”, “tls_starttls” and “tls_certcheck” tells msmtp to use STARTTLS for encryption, and check for validation of the cert.
Finally, I go to the key part – Mutt. Here is some essential lines from my $HOME/.muttrc:
ignore *
unignore From Subject Lines
hdr_order From Subject Lines
set index_format="%[%b-%d] %?X?%X& ? %-2e %-18.18L [%4c] %s"
set status_on_top=yes
set editor="vim -c 'norm O'"
set sendmail="/usr/bin/msmtp"
set sendmail_wait = 5
set mbox_type=Maildir
set folder="~/.mail"
set mask="!^\\.[^.]"
set mbox="+inbox"
set record="+inbox"
set postponed="+inbox"
set spoolfile="~/.mail/inbox/"
set trash="~/.mail/trash/"
set maildir_trash=no
set quit=yes
set move=no
set beep_new=yes
set check_new=yes
set recall=no
set resolve=yes
set allow_8bit
set charset="utf-8"
set rfc2047_parameters=yes
set include=yes
set indent_str="> "
set mime_forward
set mime_forward_rest
set fast_reply
unset metoo
unset reply_self
set reply_regexp="^(re([\[0-9\]+])*|aw|回复)(:[ \t]|:)"
set quote_regexp="^( {0,4}-?[>|:]| {0,4}[a-z0-9]+[>|]+)+"
set from='Name Last '
set use_from
set envelope_from=yes
set realname='First Last'
bind index gg first-entry
bind index G last-entry
bind index \cf next-page
bind index \cb previous-page
bind index ,g group-reply
bind pager j next-line
bind pager k previous-line
bind pager previous-line
bind pager next-line
bind pager gg top
bind pager G bottom
color hdrdefault black default
color quoted red default
color signature brightblack default
color indicator brightwhite red
color attachment black default
color error red default
color message blue default
color search brightwhite magenta
color status brightyellow blue
color tree red default
color normal blue default
color tilde green default
color bold brightyellow default
color markers red default
Thanks to Roy L Zuo (roylzuo at gmail dot com) for great aid! There are much more lines in my mutt configuration, and the colors are suitable for white background.
In conclusion, here are my choice:
Mutt + Getmail4 + Msmtp