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
.
Install mbsync, either from a release tarball or from git.
Create a temporary file .mbsyncpass
and store your plain text
password in there. Next, gpg2 --output .mbsyncpass.gpg --symmetric .mbsyncpass
. Move mysyncpass.gpg
in ~/.emacs.d
and remove the
.mbsyncpass
file.
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 ~/.authinfo
file.
Create a .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 .mbsyncrc
file:
IMAPAccount uni Host mail.example.com User me@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 *
mbsync
command, 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 ~.emacs
file.
(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 ;; remove this once things work correctly 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 "me@example.com" user-mail-address "me@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
:mu index --maildir=~/email/mbsyncmail/
M-x mu4e
.n/p
go to next, previous messageRET
open the message at point in the message views
searchj
jump to maildir e.g. ji
jumps to inboxO
change sort orderP
toggle threadingd
mark message for moving to trash folderm
mark message for moving to another maildir folder?,!
mark message as unread/readR,F,C
reply/forward/composeThe 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.