Tuesday, July 03, 2007

Using mairix through procmail

My email provider Dream Host runs the Courier IMAP server and I primarily use Mozilla Thunderbird as my mail client. I've had numerous problems with Thunderbird's off-line IMAP support and email search that I've started looking for other solutions.

When I was using mutt as my email client, I also used mairix to index and search my emails. Mairix is a brilliant program that offers GMail like full text search of your emails. I've missed that functionality ever since, so I started thinking on how to integrate Thunderbird and mairix. After some delusional ideas about building Thunderbird extensions and wrapping mairix in a cgi script, I finally hit on the obvious: run mairix through procmail.

So I wrote a procmail rule that invokes mairix and dumps the search results in predefined IMAP folder. To search my emails in Thunderbird, I simply send myself an email with a special subject line that triggers mairix. Mairix then populates the "search" folder with search results which I access from Thunderbird.

If you have already used mairix and procmail, implementing this is a trivial task. Here is my setup in case you need some help:

Mairix:

  1. I periodically run mairix indexing from cron so that the mairix db is up to date. You can also trigger the mairix indexing process whenever an email is delivered by using a procmail recipie. If you receive a huge quantity of email the later method is not recommended as it can increase server load.
  2. Mairix supports incremental indexing, so periodically running mairix is fast. Mairix always uses the index to return search results, so having an up to date index is crucial. My 500MB of mail boxes has a 2MB mairix index database.
  3. Please read the mairix documentation for an explanation of the mairixrc file
# ~/.mairixrc
base=~/Maildir
database=~/Maildir/mairixdb
maildir=.Inbox:.Archived
mfolder=.search

Procmail:
  1. you'll need to change ME@MYDOMAIN with your own email ID so that mairix is not accidentally triggered when someone else sends you an email.
  2. subject line of the email you send needs be of the form [search] needle. Everything after [search] is passed to mairix on the command line. Please refer to the mairix documentation for a list of search terms that can be used.

# ~/.procmailrc
MAILDIR=$HOME/Maildir

SHELL=/bin/sh
# no procmail_log

# enable mairix searches through email
:0:hw
* ^From:.*ME@MYDOMAIN\.com
* ^Subject: .*\[search\] \/.*
| ~/bin/mairix $MATCH

# catch all for inbox
:0
$HOME/Maildir/