用mutt和gmail打造舒服的电子邮件环境

2010年01月07日

我使用mutt已经进入第4年了。4年里不断的对mutt环境的配置,使我越来越没有可能在将来 放弃这个舒服的电子邮件环境。这篇文章的内容,不会涉及到很多mutt基本的设定,比如说 编码、html和doc文件显示等等,而会更着重于我个人的日常使用习惯方面的东西--也就 是“我是怎么让mutt更听话的”。里面的内容,不光涉及mutt的配置,也有很多周边软件及 gmail的配置。

当然,每个人的使用习惯都不尽相同, 仅供参考

邮箱的配置

电子邮箱

我希望用一个邮箱作为网上的备份,不论是收到的邮件,还是发出的邮件,都要在里面有, 选择当然是 Gmail !假定我的gmail邮箱是 helloworld@gmail.com 。

把其他邮箱的邮件转发到gmail

  • 如果邮箱foo支持转发,最简单不过,直接转发到 helloworld+foo@gmail.com。然后,在 gmail里面,添加一个filter,has the words填“deliveredto:helloworld+foo”,action选 择添加名为“foo”的tag。这样就方便在gmail中自动区分来自这个邮箱的邮件。

  • 如果邮箱foo支持pop3,可以设置gmail去自动收取,同样,收取的邮件,gmail可以自动 加tag。

  • 如果你比较倒霉,有一个邮箱是exchange server的,那你需要用其他方法转发到gmail。 我的方法是用fetchmail。缺点是用的smtp服务器不能带密码。

    poll mailbox.foo.com protocol imap username “hello” there with password “world” smtphost smtp.foo.com, another.smtp.com smtpname “helloworld+foo@gmail.com” ssl keep

mutt里收件箱配置

我的习惯是,新邮件要永远在最顶端,邮件要以thread的方式显示,收件箱和发件箱是一起 的,以便完整显示相关通讯内容。

set mbox_type=Maildir           # Maildir格式
set folder="~/.mail"            # 邮件目录
set mask="!^\\.[^.]"            # 忘了干什么的了
set mbox="+inbox"               # 收件箱是 ~/.mail/inbox
set record="+inbox"             # 发件箱是 ~/.mail/inbox
set postponed="+inbox"          # 草稿箱是 ~/.mail/inbox
set spoolfile="~/.mail/inbox"   # MDA直接把邮件递到我的收件箱
set sort=reverse-threads            # 新的在最上面,按thread归档
set sort_aux=last-date-received     # 同一个thread里面,最新的在最上面

这里要提到的邮箱的格式,我用Maildir,也就是用单个文件代表一封邮件。Maildir比起一个 邮箱为一个文件的mbox格式,有速度快,少死锁的优点;缺点是其他email客户端支持得少 。我对于imap同步操作远程邮箱的方式并不喜欢,因为这样不方便我接收系统邮件(后面要 提到),更不利于我在没有网络的时候阅读邮件。

另外,我的习惯是,每年一次归档旧邮件,也就是说,我的 ~/.mail/inbox,只存今年 的邮件,往年的,被移到了 ~/.mail/2007, ~/.mail/2008~/.mail/2009

再另外,可以设置下颜色,让自己为收件人的邮件和我自己发出去的邮件着重显示

color index yellow default ~p              # 发给我的,黄色
color index blue default ~P                # 我发的,蓝色
color index brightyellow default ~N        # 新的,黄色粗体
color index brightgreen default "~N ~p"    # 新发给我的,绿色粗体

效果如图

index view

邮件收发

收邮件,没什么好说的,我用 fetchmail 收gmail。发邮件,我目前用msmtp,也许将来会 换用esmtp(原因后面要提到)。如下设置可以实现在不同的地方自动切换smtp服务器。

set sendmail="~/bin/sendemail"

而在~/bin/sendemail脚本中

#!/bin/bash

hn=$(host $(curl -s icanhazip.com)|awk '{print $NF}')   # 获取域名
if [[ "$hn" = *.foo.* ]]; then
    # 使用foo的smtp配置,lbdb的功能在将在下面提到
    tee >(lbdb-fetchaddr -a) |/usr/bin/msmtp -a uq $@
    #/usr/bin/msmtp -a uq $@
else
    # 使用默认smtp配置,这里为gmail
    tee >(lbdb-fetchaddr -a) |/usr/bin/msmtp $@
fi

联系人管理

我使用abook和lbdb管理联系人。对于自己觉得需要记忆的,手动写到abook里面去。而 lbdb则负责将我所有发出邮件的收件人email地址记下来。

~/.lbdbrc内容为

METHODS="m_inmail m_abook"

当然,在上面提到的邮件~/bin/sendemail脚本中的lbdb-fetchaddr命令就是用来提取 收件人email地址的。

在mutt中做如下设置,就能够在输入收件人的时候按Ctrl-T补全收件人email地址了。

set query_command = "lbdbq '%s'"

自动备份所发邮件到gmail

如果你发邮件的时候,使用的是gmail的smtp服务器,那么,这邮件就已经备份到gmail的发 件箱去了。但是,当你不能使用gmail的smtp服务器的时候,可以这样。

my_hdr Bcc: roylzuo+sent@gmail.com

系统邮件

系统邮件,就是你的电脑发给你的这个帐号的,比如说cron的作业输出,比如nagios的系统 过载警告等等。我喜欢在cron里面放一些奇怪的脚本,比如说自动查小说更新的阿什么的, 如果有更新我就会收到email提醒,当然,这些email因为是我的电脑内部产生的,不会备份 到gmail。

如果你想要收到系统给你发的email,那么,你的系统里面要么就得装邮件发送服务器,比 如exim4,因为系统邮件是靠/usr/sbin/sendmail发送的,要么,就像我,装个esmtp,因 为esmtp可以带个sendmail的符号链接,可以用于投送系统邮件。esmtp,如果只是发送系统 邮件不需要配置。另外,在你的MDA配置里面,要把系统邮件投送地址修改下,我用的是 procmail。

DEFAULT=$HOME/.mail/inbox/      # 外来邮件投递地址,最后的/表示是Maildir
ORGMAIL=$DEFAULT                # 系统邮件投递地址

反垃圾邮件过滤

gmail自带的垃圾邮件过滤已经有一重保护了,但是偶尔也不够,我使用bogofilter做第二 重的垃圾邮件过滤,需要在procmailrc里面加

:0fw
| bogofilter -u -e -p

:0:
* ^X-Bogosity: Spam.*
spam/

至于怎么配置快捷去训练bogofilter,有兴趣的自己去查或者下载我的配置。