Notmuch logo

Message exclusion and deletion

An important principle of notmuch is that it does not modify your mail (with the one exception of maildir flag syncing). A question that frequently comes up, though, is how users can delete messages. While notmuch does not support, nor ever will, the deleting of messages, notmuch has a couple of nice features that allow users to handle excluding unwanted messages in a sensible way.

message exclusion

Notmuch has the ability to exclude message with certain tags from search results. A common usage is to exclude "deleted" or "spam" messages so that they don't clutter your search results. To enable excludes, use the config utility:

    $ notmuch config set search.exclude_tags deleted spam

This will cause messages with the "deleted" or "spam" tags to be excluded from search results.

It is still possible to find messages with excluded tags, though, by manually including the excluded tag in your search:

    $ notmuch search from:foo and tag:spam

This will find messages from "foo" with the tag "spam", even though "spam" is an excluded tag.

message files

Notmuch makes it very easy to access the underlying mail files associated with specific search terms using the "file" output format of notmuch search. To find all message files associated with the tag "foo" run:

    $ notmuch search --output=files tag:foo

This will output the paths to all message files with "tag:foo", one per line.

This is useful in a number of different ways. For instance, it could be used to train a spam filter:

    $ notmuch search --output=files tag:spam | sa-learn -f -

It can also be used to purge mail files from disk:

    $ notmuch search --format=text0 --output=files tag:deleted | xargs -0 --no-run-if-empty rm

Make sure you run "notmuch new" after the last command so the database becomes aware that the files have been removed and can remove the corresponding entries from the index.

putting it all together

So if you want to add message deletion to your work flow, here's a procedure:

killing threads

In a hook

notmuch tag +muted $(notmuch search --output=threads tag:muted)

New messages in the thread get the muted tag. Make muted an excluded tag (see above). To kill a thread, tag it with muted, run notmuch new.