Raúl Benencia


Using notmuch-emacs along with other folder-based MUA

I’ve started to leave my mutt niche in order to start using notmuch-emacs MUA. All in all, I can see the see the speed advantage of using notmuch, among other little perks. Nevertheless, the approach of tagging emails instead of organizing them in IMAP folders makes the use of notmuch a little non-portable for others folder based user agents. I wouldn’t mind that, but I like receiving my emails on my mobile phone and as far as I know there is no such thing as a mobile notmuch MUA.

In this blog post I’ll share my approach for using a notmuch based agent, as notmuch-emacs, along with other folder based agents, as Thunderbird or K-9 Mail. The first thing to do is to define the layout of our IMAP folders. In our examples we’ll use something like this:

$ ls -1 ~/Maildir
archive
cur
debian
debian.devel
debian.haskell
debian.haskell.commits
debian.haskell.maintainers
debian.haskell.maintainers.junk
debian.misc
debian.project
new
tmp

So, here I have my inbox folder along with an archive maildir and a hierarchy of folders containing Debian mailing lists. In my folder based mobile agent, K-9, I won’t be bothered with notifications of new mailing list emails, as the agent is configured to only check for new emails in the inbox folder. On the other hand, in a default notmuch setup each time I run notmuch new the database will be filled with all the emails in all the folders and will tag the new ones with inbox. Now, when I’m using notmuch-emacs, I like that my inbox emails be only the ones in my inbox folder. Besides, I’ll also like to add a tag that matches the name of the folder the email is in. In notmuch language:

#!/bin/sh

notmuch new

notmuch tag +archive -inbox "path:archive/**"
notmuch tag +debian -inbox "path:debian/**"
notmuch tag +debian-devel -inbox "path:debian.devel/**"
notmuch tag +debian-project -inbox "path:debian.project/**"
notmuch tag +debian-haskell -inbox "path:debian.haskell/**"
notmuch tag +debian-haskell-commits -inbox "path:debian.haskell.commits/**"
notmuch tag +debian-haskell-maintainers -inbox "path:debian.haskell.maintainers/**"
notmuch tag +debian-haskell-maintainers-junk -inbox -unread "path:debian.haskell.maintainers.junk/**"
notmuch tag +debian-misc -inbox "path:debian.misc/**"

With this method we can use a folder based approach with notmuch tags. Let’s move to another topic. In the notmuch world, archiving an email means removing the inbox tag. If we only do this, all the archived emails will still be in our inbox folder, so what we’ll like to do is to move to the archive folder all the emails from the inbox folder that don’t have the inbox tag. In other words:

function archive() {
    if [ $# -ne 2 ]; then
       echo "Incorrent parameters. Send INBOX and ARCHIVE"
       return 1
    fi

    for e in $(notmuch search --output=files "path:$1/**" and not tag:inbox); do
        mv $e $2
    done

    return 0
}

archive cur ${MAILDIR}/archive/cur

Finally, one little detail is left: spam. In a folder based agent, we’ll usually have a spam folder. In the notmuch world, when we tag an email with spam, a decent client won’t show it in the results of notmuch searches, but it will remain in the folder it was found. So, what we have to do is to move all the spam tagged email to our spam folder.

for e in $(notmuch search --output=files tag:spam and not "path:spam/**"); do
    mv $e $MAILDIR/spam/cur
done

So, if we cron this little script we’ll be able to use a notmuch based MUA along with an IMAP folder based one. Enjoy!