Emacs - Notmuch
Table of Contents
Introduction
Notmuch is a mail system1. It can efficiently manage a fairly large number of emails. Particularly, it supports fast email searching and filtering based on tags, which is extremely similar to Gmail's tags whereby various virtual folders can be flexibly realized.
This post is composed just to summarize the basic installation and configuration of notmuch-based mail system.
Installation
pacman -S notmuch
Configuration
~/.notmuch-config
The basic configuration can be performed by either
- an interactive guidance which can be provoked by
notmuch setup
- or a manually composed
~/.notmuch-configas follows
[database] # Mail storage in maildir format path=/MAIL/REPO [user] name=NAME primary_email=EMAILADDRESS [new] tags=unread;inbox; ignore= [search] exclude_tags=deleted;spam; [maildir] synchronize_flags=true [crypto] gpg_path=gpg
~/.emacs.d/init.el
Add following content to the configuration of Emacs.
(require 'notmuch)
(setq user-full-name "NAME"
user-mail-address "EMAILADDRESS")
(setq mail-user-agent 'message-user-agent
message-kill-buffer-on-exit t
mm-text-html-renderer 'w3m)
(setq notmuch-search-oldest-first nil
notmuch-show-all-multipart/alternative-parts nil
mail-interactive t
notmuch-always-prompt-for-sender nil
notmuch-show-indent-messages-width 3)
(setq mail-specify-envelope-from t
message-sendmail-envelope-from 'header
mail-envelope-from 'header)
(setq message-directory "."
notmuch-fcc-dirs ".")
(setq message-send-mail-function 'smtpmail-send-it
smtpmail-smtp-server "SMTPSERVER"
smtpmail-stream-type 'ssl
smtpmail-smtp-service PORT)
(setq notmuch-saved-searches '((:name "inbox"
:query "tag:inbox"
:count-query "tag:inbox and tag:unread"
:sort-order newest-first)
Hooks
Additionally, notmuch supports hooks which are essentially scripts in /MAIL/REPO/.notmuch/hooks whereby users can specify and customize the behaviors of notmuch. Currently, following scripts and hooks are available.
pre-new- Hook/script provoked before command
notmuch new, which is usually used to fetch mails.
#!/bin/sh /usr/bin/offlineimap -c /PATH/TO/OFFLINEIMAPRC -a ACCOUNT
or
#!/bin/sh /usr/bin/getmail --new --getmaildir=/PATH/TO/GETMAILRC --rcfile=GETMAILRC
post-new- Hook/script provoked after command
notmuch new, which is usually used to tag the newly imported mails.
#!/bin/sh notmuch tag -inbox +ML -- to:MAILLIST@EXAMPLE.COM notmuch tag -inbox +SOMEONE -- from:SOMEONE@EXAMPLE.COM /usr/bin/notmuch search --output=files tag:deleted OR tag:spam | xargs -r rm
post-insert- Hook/script called after command
notmuch insert, which is provoked after mails are delivered, imported into database and labelled with initial tags.
#!/bin/sh notmuch tag -inbox -unread +sent -- from:MYEMAILADDRESS /usr/bin/notmuch search --output=files tag:deleted OR tag:spam | xargs -r rm
Automatics
- Add new intended task by
crontab -ewith following content
*/5 * * * * /usr/bin/notmuch new
where the first line is for periodical fetching mail every 3 minutes and the second line to remove the mails deleted (tagged by deleted) at every boot.
- Enable and start the service
cronie.
systemctl enable cronie.service systemctl start cronie.service
CJK Support
By default, notmuch cannot separate Chinese correctly, Japanese, or Korean words due to the non-space separator. A workaround is to set a environment variable as follows.
export XAPIAN_CJK_NGRAM=1
Key binding
| Key | Function and description |
|---|---|
n/p |
Next/previous message, notmuch-tree-next-matching-message |
M-n/p |
Next/previous thread, notmuch-tree-next-thread |
w |
Save attachments, notmuch-show-save-attachments |
m |
Write a new mail, notmuch-mua-new-mail |
r |
Reply a mail, notmuch-show-reply-sender |
R |
Reply all, notmuch-show-reply |
f |
Forward a mail, notmuch-show-forward-message |
C-c C-a |
Attach a file, mml-attach-file |
| = | Refresh current buffer, notmuch-refresh-this-buffer |
M-= |
Refresh all buffer, notmuch-refresh-all-buffers |
z |
Display threads matching query in tree view, notmuch-tree |
Z |
Tree view for the current query, notmuch-tree-from-search-current-query |
+ |
Change (add by default) tags for the current thread or region, notmuch-search-add-tag |
- |
Change (remove by default) tags for the current thread or region, notmuch-search-remove-tag |