[[!img notmuch-logo.png alt="Notmuch logo" class="left"]]
Notmuch is a great mail indexing tool that can also be used *in conjunction*
with existing Mail User Agents (MUA) instead of replacing them. The advantage of
such mixed solutions is that users can benefit from notmuch features (such as
full-text search and thread reconstruction) without *having to* change MUA.
A popular geek MUA is [the Mutt e-mail client](http://www.mutt.org); integrating
notmuch with Mutt is not seamless, but fairly straightforward. There are two
principal possibilities, either using a patched mutt that handles internally
notmuch, or use a sets of scripts/handler within mutt to achieve something close.
[[!toc levels=2]]
# Using Notmuch with the good old mutt
There's a page about the [[notmuch-mutt]] scripts that are distributed along
with notmuch, in its contrib directory.
# Using Notmuch with neomutt
*Note*: This discussion was updated by a non-mutt user from talking about mutt-kz to
[neomutt](https://neomutt.org/). Caveat lector!
## Install:
See [the neomutt install page](https://neomutt.org/distro). If
building from source see [build
instructions](https://neomutt.org/dev/build/build). Note in particular
the `--notmuch` configuration option.
## Configuration:
*N.B.* From here is unmodified previous discussion about `mutt-kz`,
which hopefully also applies to neomutt.
Here is my `.muttrc` I use with `mutt-kz`, explanations as comments:
# notmuch
set nm_default_uri="notmuch:///PATH/TO/MY/Maildir" # path to the maildir
set virtual_spoolfile=yes # enable virtual folders
set sendmail="/PATH/TO/bin/nm_sendmail" # enables parsing of outgoing mail
virtual-mailboxes \
"INBOX" "notmuch://?query=tag:INBOX and NOT tag:archive"\
"Unread" "notmuch://?query=tag:unread"\
"Starred" "notmuch://?query=tag:*"\
"Sent" "notmuch://?query=tag:sent" # sets up queries for virtual folders
# notmuch bindings
macro index \\\\ "<vfolder-from-query>" # looks up a hand made query
macro index A "<modify-labels>+archive -unread -inbox<enter>" # tag as Archived
macro index I "<modify-labels>-inbox -unread<enter>" # removed from inbox
macro index S "<modify-labels-then-hide>-inbox -unread +junk<enter>" # tag as Junk mail
macro index + "<modify-labels>+*<enter><sync-mailbox>" # tag as starred
macro index - "<modify-labels>-*<enter><sync-mailbox>" # tag as unstarred
# sidebar
set sidebar_width = 20
set sidebar_visible = yes # set to "no" to disable sidebar view at startup
color sidebar_new yellow default
# sidebar bindings
bind index <left> sidebar-prev # got to previous folder in sidebar
bind index <right> sidebar-next # got to next folder in sidebar
bind index <space> sidebar-open # open selected folder from sidebar
# sidebar toggle
macro index ,@) "<enter-command> set sidebar_visible=no; macro index ~ ,@( 'Toggle sidebar'<Enter>"
macro index ,@( "<enter-command> set sidebar_visible=yes; macro index ~ ,@) 'Toggle sidebar'<Enter>"
macro index ~ ,@( 'Toggle sidebar' # toggle the sidebar
There is no major difference with the standard mutt. Just a new concept (and URL) the
virtual folder, that is addressed as `notmuch://`, a few new settings and commands.
## Using:
when you open `mutt` you get the INBOX opened. There you can crawl through your
mails, and tag them as appropriate, either manually using the " ` " command, or using
the bindings defined in configuration (such as A/I/S/+/-).
## Mail tagging on sending
You may have noticed in `neomutts`'s configuration that I set the `sendmail` variable
of mutt to a `nm_sendmail` script. This is for tagging outgoing mail each time I send
a mail. Here is the content of the script (which may be used directly in mutt's
variable, I did not try).
Source of `nm_sendmail`:
#!/bin/bash
tee >(notmuch insert --folder=Sent +sent) | sendmail $*
## Mail filtering/tagging
For mail tagging on arrival, I prefer to use a simple procmail delivery along with
`notmuch insert`.
Of course, you could use formail or maildrop, instead of procmail, but it is flexible
enough for my needs, and here is an example of configuration that can be useful:
PATH=/bin:/usr/bin:/usr/local/bin
# ensure each mail is unique
:0 Wh: msgid.lock
| formail -D 8192 msgid.cache
# update addressbook with current mail
:0 Wh
| /usr/local/bin/notmuch_abook update
NOINBOX="-inbox"
TAGS=""
# manage dynamic tagging, using the ' + ' token in mail addresses
# e.g.: user+TAG@fqdn.tld will generate the tag TAG
:0:notmuch.lock
* ^TO\/user\+[a-z0-9]+@fqdn\.tld
* MATCH ?? ^user\+\/[a-z0-9]+
{
TAGS="+${MATCH}"
}
# match all mails from mailing-lists, don't let them go to inbox, but tag them with ml
:0:notmuch.lock
* ^List-[Ii][dD]:.*
{
TAGS="${TAGS} +ml -inbox"
}
# tag all mails coming from mutt-kz mailing list
:0:notmuch.lock
* .*mutt-kz\.lists\.fedoraproject\.org.*
| notmuch insert $TAGS +mutt +notmuch
# tag all mails coming from notmuch mailing list
:0:notmuch.lock
* .*notmuch\.notmuchmail\.org.*
| notmuch insert $TAGS +notmuch
# Mark all spams as junk mail
:0:notmuch.lock
* ^X-Spam-Status: Yes
| notmuch insert +junk
:0:notmuch.lock
* ^Subject: .*SPAM.*
| notmuch insert +junk
### All unmatched mails
:0:notmuch.lock
* .*
| notmuch insert $TAGS
there's a line that updates the addressbook with addresses of current mail, and you'll
be able to read more about it on the [[vimtips]] page.
|