[[!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 \\\\ "" # looks up a hand made query macro index A "+archive -unread -inbox" # tag as Archived macro index I "-inbox -unread" # removed from inbox macro index S "-inbox -unread +junk" # tag as Junk mail macro index + "+*" # tag as starred macro index - "-*" # 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 sidebar-prev # got to previous folder in sidebar bind index sidebar-next # got to next folder in sidebar bind index sidebar-open # open selected folder from sidebar # sidebar toggle macro index ,@) " set sidebar_visible=no; macro index ~ ,@( 'Toggle sidebar'" macro index ,@( " set sidebar_visible=yes; macro index ~ ,@) 'Toggle sidebar'" 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.