mu4e is an emacs-based email client. It is fully search-based, with a UI optimised for speed with quick key stroked for common actions. Emails can be composed with rich-text using org-mode. Email addresses auto-completion is supported. Actions are asynchronous, so heavy actions never block emacs.
The basic idea is this: you configure an offline IMAP client to synchronise your remote email server with your local computer. Two possibilities for an IMAP synchroniser are mbsync and offlineimap. This post describes a setup using mbsync.
Install SSL development files, required by mbsync for SSL authentication. With RPM based package managers,
sudo yum install openssl-devel or if using
dnf (e.g. with Fedora 22+), then run
sudo dnf install openssl-devel. With debian machines,
sudo apt-get install libssl-dev.
Create a temporary file
.mbsyncpass and store your plain text password in there. Next,
gpg2 --output .mbsyncpass.gpg --symmetric .mbsyncpass. Move
~/.emacs.d and remove the
Create a temporary file
~/.authinfo and store the following plain text in there, replacing host, username, password & port information for your settings:
machine mail.example.com login myusername port 587 password mypassword
Generate the encrypted file with
gpg2 --output ~/.authinfo.gpg --symmetric ~/.authinfo. Remove the
.mbsyncrc file. I have it in my
~/.emacs.d/ directory so that it is version controlled to use easily across my machines. Check on the work server the exact directory names you wish to syncronise (e.g. is it “Sent” or “Sent Items”?). Choose the location for your local mail directory. I chose
~/email/mysyncmail. Add the following to the
IMAPAccount uni Host mail.example.com User email@example.com PassCmd "gpg2 -q --for-your-eyes-only --no-tty -d ~/.emacs.d/.mbsyncpass.gpg" Port 993 SSLType IMAPS AuthMechs Login CertificateFile /etc/ssl/certs/ca-bundle.crt IMAPStore uni-remote Account uni MaildirStore uni-local Path ~/email/mbsyncmail/ Inbox ~/email/mbsyncmail/INBOX Channel uni Master :uni-remote: Slave :uni-local: Patterns "Sent Items" "INBOX" "Deleted Items" Create Slave Sync All Expunge Both SyncState *
mbsynccommand, to synchronise your IMAP inbox:
mbsync -c ~/.emacs.d/.mbsyncrc work
Install mu4e, either using a package manager, from a tarball, or from git. Details here.
Now set up your mu4e configuration. Check out the mu4e documentation on the variables. Make sure the following is stored in an
.el file that is loaded by emacs, e.g. by the
(add-to-list 'load-path "~/place/to/your/mu4e") (require 'smtpmail) ; smtp (setq message-send-mail-function 'smtpmail-send-it smtpmail-starttls-credentials '(("mail.example.com" 587 nil nil)) smtpmail-default-smtp-server "mail.example.com" smtpmail-smtp-server "mail.example.com" smtpmail-smtp-service 587 smtpmail-debug-info t) (require 'mu4e) (setq mu4e-maildir (expand-file-name "~/email/mbsyncmail")) (setq mu4e-drafts-folder "/Drafts") (setq mu4e-sent-folder "/Sent Items") (setq mu4e-trash-folder "/Trash") (setq message-signature-file "~/.emacs.d/.signature") ; put your signature in this file ; get mail (setq mu4e-get-mail-command "mbsync -c ~/.emacs.d/.mbsyncrc work" mu4e-html2text-command "w3m -T text/html" mu4e-update-interval 120 mu4e-headers-auto-update t mu4e-compose-signature-auto-include nil) (setq mu4e-maildir-shortcuts '( ("/INBOX" . ?i) ("/Sent Items" . ?s) ("/Trash" . ?t) ("/Drafts" . ?d))) ;; show images (setq mu4e-show-images t) ;; use imagemagick, if available (when (fboundp 'imagemagick-register-types) (imagemagick-register-types)) ;; general emacs mail settings; used when composing e-mail ;; the non-mu4e-* stuff is inherited from emacs/message-mode (setq mu4e-reply-to-address "firstname.lastname@example.org" user-mail-address "email@example.com" user-full-name "Rob Stewart") ;; don't save message to Sent Messages, IMAP takes care of this ; (setq mu4e-sent-messages-behavior 'delete) ;; spell check (add-hook 'mu4e-compose-mode-hook (defun my-do-compose-stuff () "My settings for message composition." (set-fill-column 72) (flyspell-mode)))
mu index --maildir=~/email/mbsyncmail/
n/pgo to next, previous message
RETopen the message at point in the message view
jjump to maildir e.g.
jijumps to inbox
Ochange sort order
dmark message for moving to trash folder
mmark message for moving to another maildir folder
?,!mark message as unread/read
The complete list of mu4e key bindings is listed here.
The more popular approach is offlineimap, and I tried this for a week. I later tried mbsync, and this is working much better for me. People have opted for offlineimap because of its ability to a invoke python file to prompt a user for a password, thus avoiding plain text passwords being stored locally. Fortunately, this has now been implemented in mbsync, which is what the
PassCmd entry in
.mbsyncrc is for.
Zawinski’s Law “Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.” Law of Software Envelopment, Jamie Zawinski.