经常用 mutt 的同学应该都用过他的搜索/过滤功能,据我所知,他的搜索/过滤只能在当前邮箱中进行。当我要搜索一封邮件或者要按规则过滤一批邮件时,不得不在多个邮箱中来还切换。

这个技巧可以让 mutt 更方便的对本地所有邮件执行搜索/过滤。基本上你只要按一个快捷键,输入搜索关键字或者过滤规则,回车之后等几秒钟,mutt 便会显示出你要的邮件。

要实现这个技巧,需要一个本地邮件索引和查找工具 mu-0.9.7 (不支持邮件正文搜索)。

为了解决 mu 处理中文内容的问题(实际上这是 xapian 的一个 bug),我想出一个不算漂亮但还算实用的方法:

  1. 用空的关键字让 mu 输出所有邮件,输出内容只包括邮件编号(message-id)和邮件主题(subject)
  2. 把输出内容通过 grep 过滤出符合我们中文搜索关键字的邮件
  3. 把搜索结果中每封邮件的邮件编号字段,拼接成一个新的搜索关键字
  4. 用新的搜索关键字让 mu 输出最终我们所需的邮件

另外,为了能在 mutt 界面中接收用户脚本的输入,还需要一个外挂脚本,这能避免在接收用户输入时 mutt 被临时关闭的问题。

1$ export MAILDIR=/your/maildir/path
2$ sudo apt-get install maildir-utils
3$ mu index -m
4$ wget https://raw.github.com/gist/1209602/4fcde2442bd28ccc43746e4c25a53611a729286d/mutt-mu -O ~/.mutt-mu
5$ sudo ln -sf ~/.mutt-mu /usr/local/sbin/mutt-mu
6$ cat >> ~/.muttrc <<-eof
macro generic S "<enter-command>set my_cmd = \`mutt-mu\`<return><enter-command>push \$my_cmd<return>"
eof

确认你的邮箱目录<1>,安装 mu (Debian 的包名 maildir-utils),保证版本大于等于 0.9.7<2>,建立邮件索引<3>,下载外挂脚本<4>,确认能直接访问<5>,添加 mutt 的快捷键<6>,不用 <shell-escape> 的目的是我们希望 mutt 提示用户输入的时候保留界面,好像内置的 mutt 搜索/过滤功能。

最后打开 mutt,键入预定义的全局搜索快捷键,会看到 mutt 底部出现“搜寻(所有):”的提示框,输入搜索关键字,回车后即可在新的虚拟邮箱 $MAILDIR/bingo 中看到搜索出的邮件。

TODO

  • 支持 date,d、flag,g、from,f 等更多搜索/过滤
  • 支持用双引号/单引号括起来的包含空格的关键字