add mutt-open script
[homepage.git] / blog / posts / 2009 / 10 / mail_indexing_for_mutt / mutt-open
1 #!/bin/bash
2 #
3 # Fire up mutt on a given mail, located in some Maildir
4 # Mail can be specified either by path or by Messsage-ID; in the latter case
5 # file lookup is performed using some mail indexing tool.
6 #
7 # Copyright: © 2009 Stefano Zacchiroli <zack@upsilon.cc> 
8 # License: GNU General Public License (GPL), version 3 or above
9
10 MUTT=mutt
11 MUTT_FLAGS="-R"
12 HIDE_SIDEBAR_CMD="B"    # set to empty string if sidebar is not used
13
14 # Sample output of 'mu-find -f P i:MESSAGE-ID', which gets passed to mutt-open
15 #  /home/zack/Maildir/INBOX/cur/1256673179_0.8700.usha,U=37420,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2,S
16
17 die_usage () {
18     echo "Usage: mutt-open FILE" 1>&2
19     echo "       mutt-open MESSAGE-ID" 1>&2
20     echo 'E.g.:  mutt-open `mu-find -f P m:MESSAGE-ID`' 1>&2
21     echo '       mutt-open 20091030112543.GA4230@usha.takhisis.invalid' 1>&2
22     exit 3
23 }
24
25 # Lookup: Message-ID -> mail path. Store results in global $fname
26 lookup_msgid () {
27     fname=$(mu-find --format P m:"$1" | head -n 1)
28 }
29
30 dump_info () {
31     echo "fname: $fname"
32     echo "msgid: $msgid"
33 }
34
35 if [ -z "$1" -o "$1" = "-h" -o "$1" = "-help" -o "$1" = "--help" ] ; then
36     die_usage
37 fi
38 if (echo "$1" | grep -q /) && test -f "$1" ; then       # arg is a file
39     fname="$1"
40     msgid=$(egrep -i '^message-id:' "$fname" | cut -f 2 -d':' | sed 's/[ <>]//g')
41 elif ! (echo "$1" | grep -q /) ; then   # arg is a Message-ID
42     msgid="$1"
43     lookup_msgid "$msgid"       # side-effect: set $fname
44 fi
45 # dump_info ; exit 3
46 if ! dirname "$fname" | egrep -q '/(cur|new|tmp)$' ; then
47     echo "Path not pointing inside a maildir: $fname" 1>&2
48     exit 2
49 fi
50 maildir=$(dirname $(dirname "$fname"))
51
52 if ! [ -d "$maildir" ] ; then
53     echo "Not a (mail)dir: $maildir" 1>&1
54     exit 2
55 fi
56
57 # UGLY HACK: without sleep, push keys do not reach mutt, I _guess_ that there
58 # might be some terminal-related issue here, since also waiting for an input
59 # with "read" similarly "solves" the problem
60 sleep 0.1
61 mutt_keys="$HIDE_SIDEBAR_CMD/~i$msgid\n\n"
62 exec $MUTT $MUTT_FLAGS -f "$maildir/" -e "push $mutt_keys"