]> git.cworth.org Git - notmuch-wiki/blob - notmuch-mutt.mdwn
added mutt-kz, procmail, notmuch_delivery and notmuch_abook howto to mutt wikipage
[notmuch-wiki] / notmuch-mutt.mdwn
1 [[!img notmuch-logo.png alt="Notmuch logo" class="left"]]
2
3 Notmuch is a great mail indexing tool that can also be used *in conjunction*
4 with existing Mail User Agents (MUA) instead of replacing them. The advantage of
5 such mixed solutions is that users can benefit from notmuch features (such as
6 full-text search and thread reconstruction) without *having to* change MUA.
7
8 A popular geek MUA is [the Mutt e-mail client](http://www.mutt.org); integrating
9 notmuch with Mutt is not seamless, but fairly straightforward. There are two
10 principal possibilities, either using a patched mutt that handles internally
11 notmuch, or use a sets of scripts/handler within mutt to achieve something close.
12
13 # Using Notmuch with mutt-kz
14
15 ## Install:
16
17         git clone https://github.com/karelzak/mutt-kz.git
18         cd mutt-kz
19         ./configure && make && make install
20
21 ## Configuration:
22
23         # notmuch
24         set nm_default_uri="notmuch:///PATH/TO/MY/Maildir" # path to the maildir
25         set virtual_spoolfile=yes                          # enable virtual folders
26         set sendmail="/PATH/TO/bin/nm_sendmail"            # enables parsing of outgoing mail
27         virtual-mailboxes \
28             "INBOX"     "notmuch://?query=tag:INBOX and NOT tag:archive"\
29             "Unread"    "notmuch://?query=tag:unread"\
30             "Starred"   "notmuch://?query=tag:*"\
31             "Sent"      "notmuch://?query=tag:sent"        # sets up queries for virtual folders
32         # notmuch bindings
33         macro index \\\\ "<vfolder-from-query>"              # looks up a hand made query
34         macro index A "<modify-labels>+archive -unread -inbox\\n"        # tag as Archived
35         macro index I "<modify-labels>-inbox -unread\\n"                 # removed from inbox
36         macro index S "<modify-labels-then-hide>-inbox -unread +junk\\n" # tag as Junk mail
37         macro index + "<modify-labels>+*\\n<sync-mailbox>"               # tag as starred
38         macro index - "<modify-labels>-*\\n<sync-mailbox>"               # tag as unstarred
39         # sidebar
40         set sidebar_width   = 20
41         set sidebar_visible = yes               # set to "no" to disable sidebar view at startup
42         color sidebar_new yellow default
43         # sidebar bindings
44         bind index <left> sidebar-prev          # got to previous folder in sidebar
45         bind index <right> sidebar-next         # got to next folder in sidebar
46         bind index <space> sidebar-open         # open selected folder from sidebar
47         # sidebar toggle
48         macro index ,@) "<enter-command> set sidebar_visible=no; macro index ~ ,@( 'Toggle sidebar'<Enter>"
49         macro index ,@( "<enter-command> set sidebar_visible=yes; macro index ~ ,@) 'Toggle sidebar'<Enter>"
50         macro index ~ ,@( 'Toggle sidebar'      # toggle the sidebar
51
52 * Using:
53
54 when you open `mutt` you get the INBOX opened. There you can crawl through your
55 mails, and tag them as appropriate, either manually using the " ` " command, or using
56 the bindings defined in configuration (such as A/I/S/+/-).
57
58 * Mail tagging on sending
59
60 You may have noticed in `mutt-kz`'s configuration that I set the `sendmail` variable
61 of mutt to a `nm_sendmail` script. This is for tagging outgoing mail each time I send
62 a mail. Here is the content of the script (which may be used directly in mutt's 
63 variable, I did not try). 
64
65 Source of nm_sendmail:
66
67         #!/bin/bash
68         tee >(notmuch-deliver -t sent -f Sent) | sendmail $*
69
70 ## Mail filtering/tagging
71
72 For mail tagging on arrival, I prefer to use a simple procmail delivery along with 
73 notmuch-delivery (which can be compiled in the `contrib/` directory of notmuch's sources).
74
75 Of course, you could use formail or maildrop, instead of procmail, but it is flexible
76 enough for my needs, and here is an example of configuration that can be useful:
77
78         PATH=/bin:/usr/bin:/usr/local/bin
79
80         # ensure each mail is unique
81         :0 Wh: msgid.lock
82         | formail -D 8192 msgid.cache
83
84         # update addressbook with current mail
85         :0 Wh
86         | /usr/local/bin/notmuch_abook update
87
88         NOINBOX="-r inbox"
89         TAGS=""
90
91         # manage dynamic tagging, using the ' + ' token in mail addresses
92         # e.g.: user+TAG@fqdn.tld will generate the tag TAG
93         :0:notmuch.lock
94         * ^TO\/user\+[a-z0-9]+@fqdn\.tld
95         * MATCH ?? ^user\+\/[a-z0-9]+
96         {
97         TAGS="-t ${MATCH}"
98         }
99
100         # match all mails from mailing-lists, don't let them go to inbox, but tag them with ml
101         :0:notmuch.lock
102         * ^List-[Ii][dD]:.*
103         {
104         TAGS="${TAGS} -t ml -r inbox"
105         }
106
107         # tag all mails coming from mutt-kz mailing list
108         :0:notmuch.lock
109         * .*mutt-kz\.lists\.fedoraproject\.org.*
110         | notmuch-deliver $TAGS -t mutt -t notmuch
111
112         # tag all mails coming from notmuch mailing list
113         :0:notmuch.lock
114         * .*notmuch\.notmuchmail\.org.*
115         | notmuch-deliver $TAGS -t notmuch
116
117         # Mark all spams as junk mail
118         :0:notmuch.lock
119         * ^X-Spam-Status: Yes
120         | notmuch-deliver -t junk
121
122         :0:notmuch.lock
123         * ^Subject: .*SPAM.*
124         | notmuch-deliver -t junk
125
126         ### All unmatched mails
127         :0:notmuch.lock
128         * .*
129         | notmuch-deliver -v $TAGS 
130
131 ## Addressbook management and vim
132
133 There are some emacs tips over [here](http://notmuchmail.org/emacstips/#index15h2) that
134 explains how to configure emacs with an addressbook, but the few solutions were not fast enough
135 for me. And I never could test the vala-based code. So I updated the notmuch_addresses code to
136 use a cache to be able to make better matches and still be lightning fast.
137
138 And finally, I needed to have a way to autocomplete my recipients' addresses 
139 automagically from within `vim`. So that's why I created the `notmuch_abook` code.
140 You can either install it as a plugin in vim, using vundle:
141
142         Vundle 'guyzmo/notmuch-abook'
143
144 Or if you're not using vim (which is objectively the best editor ever), you may
145 want to use it as standalone:
146
147         % pip install notmuch_abook
148
149 To configure the address book, append to `~/.notmuch-config` the following:
150
151         % cat > ~/.notmuch-config << EOF
152         
153         [addressbook]
154         path=/home/YOURUSERNAME/.notmuch-abook.db
155         backend=sqlite3
156
157         EOF
158
159 where YOURUSERNAME is your home directory. Then, you can sync the addressbook cache
160 by running. It will create the database file specified in configuration, and go through
161 all notmuch's indexed mails to get all addresses headers and cache them. It takes around
162 20 seconds on my 10000 mails index:
163
164         % notmuch_abook create
165
166 And you can query for addresses using the lookup command, which will match the beginning
167 of each word in the name and address, as follows:
168
169         % notmuch_abook lookup Foo
170         Foobar Bar <bar@bar.com>
171         Bar Foobar <bar@bar.com>
172         Bar Bar <foobar@bar.com>
173         Bar Bar <bar@foobar.com>
174         Bar Bar <bar@bar.foo>
175
176 If you're using vim, when you edit a mail having a filetype set to mail, you will be
177 able to open a completion menu when you do <C-x><C-u> at every address header.
178
179 # Using Notmuch with bare Mutt, the old fashioned way
180
181 * Using
182   [notmuch-mutt](http://git.notmuchmail.org/git/notmuch/tree/HEAD:/contrib/notmuch-mutt),
183   which will create a "virtual" maildir folder with search results whenever a
184   search is made. The upside is that you can search all your folders
185   simultanously; the downside is that your modifications in the results listing
186   do not carry over, also having to switch folders comes with some more
187   annoyances.
188
189   A
190   [how to use Notmuch with Mutt](http://upsilon.cc/~zack/blog/posts/2011/01/how_to_use_Notmuch_with_Mutt/)
191   has been written by Stefano Zacchiroli.
192
193   <small>(Note by the howto author: I've linked the howto from this wiki rather
194   than splicing it in, in order to avoid duplication of information. If you
195   think it would be better to have it here, feel free to copy the text
196   here. The howto is
197   [available](http://git.upsilon.cc/cgi-bin/gitweb.cgi?p=zack-homepage.git;a=history;f=blog/posts/2011/01/how_to_use_Notmuch_with_Mutt.mdwn)
198   in markdown syntax from the Git repository of my homepage.)</small>
199
200 * Using a simple macro that will emulate the "limit" mutt functionality
201   using notmuch.
202
203   See the [alternative notmuch integration](http://log.or.cz/?p=228)
204   blog post for instructions and details,
205   or simply put these two macros to your muttrc:
206
207         # 'L' performs a notmuch query, showing only the results
208         macro index L "<enter-command>unset wait_key<enter><shell-escape>read -p 'notmuch query: ' x; echo \$x >~/.cache/mutt_terms<enter><limit>~i \"\`notmuch search --output=messages \$(cat ~/.cache/mutt_terms) | head -n 600 | perl -le '@a=<>;chomp@a;s/\^id:// for@a;$,=\"|\";print@a'\`\"<enter>" "show only messages matching a notmuch pattern"
209         # 'a' shows all messages again (supersedes default <alias> binding)
210         macro index a "<limit>all\n" "show all messages (undo limit)"
211
212   The upside (if you are used to working in the context of a single folder) is
213   that this really does use the limit functionality of mutt and you are still in
214   your original folder.  The downside is that this approach has scaling problems
215   and works well only for reasonably specific queries.
216