mutt

mutt是Linux下的一个email程序。Mutt显然是一个Unix的邮件程序,它跟一般的Windows邮件程序不同,它不是一个包罗万象的大杂烩。你甚至会发现它根本不直接发出邮件,它从来不自己编辑邮件,它从来不自己对邮件进行加密和数字签名……Mutt更像一个文件管理器,只不过它管理的是email。它的功能是借助各个最强大的程序来实现的。这符合unix的设计思想。

特点

超强的信件分类功能

你可以设置几乎任意的条件来从一堆信件里找到你所需要的那封。比如,你可以说:“只显示一个月之类,不是清华大学发来的,内容包含‘光盘’两个字的信件”,“把从fvwm邮件列表一个星期以前发来的,而且还没有看过的信件全部移到叫old-fvwm的信箱”……

信件打分排序功能

你可以给你的信件打分,信件最后的得分就是它的这些分数相加的结果。

几乎任意条件的彩色设置

可以随意绑定热键

这个功能类似Emacs。你可以把几乎任意的功能绑定到键盘。

设置条件挂钩

可以对满足不同条件的信件,信箱采取不同的设置。比如,对于用来收邮件的那些信箱,显示邮件时只显示from,date,subject,x-mailer这几个邮件头,而对sent-mail信箱还显示to这个邮件头;发给家人,朋友的信件都存到一个特别的信箱中保存。

批量邮件处理

可以把一些邮件作上标记(tag),然后对它们进行同意操作,比如删除,存到其它文件,删除附件,……

任选编辑器

用一个强大的编辑器来编辑你的email你才能高效的完成编辑。一般email客户端都是用的自己内嵌的编辑器,这些编辑器一般功能很弱。mutt并没有试图自己写一个编辑器,因为它明显不可能超过VIM和Emacs,所以mutt可以让你自己选择你喜欢的编辑器,它会去调用它,并且设置很多方便编辑email的参数。编辑器编辑完毕后mutt会从编辑器得到编辑好的文本,然后你可以加附件什么的。我现在在mutt里使用Emacs编辑器。

高级的MIME支持

Mutt不像一般的email程序那样直接支持打开某些种类的附件。因为附件的种类实在太多,一个email客户端没有可能自己实现所有的功能。所以Mutt提供了.mailcap的设置。

支持PGP加密

Mutt可以利用GnuPG这样的程序来对信件进行PGP加密和数字签名。别人可以用你的公用密钥给你发一封只有你才能看到的信件。也可以用私有密钥给信件“签名”,收信人可以用公布的公钥验证这封信。

基本配置

开始使用时需要的一些必要的配置。

1.alternates

这个变量应该设置为一个正则表达式,它是你有可能收到信件的地址。

这个变量有助于Mutt显示邮件的地址特征。一般Mutt会在index中显示几种不同的邮件地址特征,它们是由$to_chars变量指定的。

2.to_chars

一般$to_chars的定义为"+TCFL".

*""(空):表示这封邮件不是给你的,也就是说To:和Cc:Bcc:都没有你的地址,很多转发的邮件,未确认的邮件列表邮件,垃圾邮件都有这个特征。

*+:表示你是收件人(To:是你的地址之一),而且是唯一的收件人。

*T:表示你是收件人(To:包括了你的地址之一),但是你不是唯一的收件人。这是一封群体信件。

*C:表示你的地址出现在CC:,但是你不是唯一的被抄送的人。

*F:表示这封邮件是你发出去的。

*L:表示这是一封你已经加入的邮件列表寄来的。

3.index_format

这是一个格式字符串,用来控制你的index的列表显示。它的缺省定义是:

setindex_format="%4C%Z%{%b%d}%-15.15L(%4l)%s"

显示出来就是这个样子:

index-original

这里有一个简单的对应关系,%4C表示4位数的序号,%Z是邮件状态,你看到那个"r"了吗?也就是说我已经回了这封信。%Z还包含那个"T",也就是说这封信不只是寄给我一个人的,我爸爸每次寄信都会CC他自己一份:)%{%b%d}是日期格式,它是由strftime()函数的格式定义的。这里%b就是根据当前的locale设置的月份简称,“12月”。%d就是十进制表示的每月的日号,“31”。后面的……你自己看看manual吧,我不罗嗦了。

4.mailboxes

指定你有那些信箱文件。当你按"c"切换信箱时,再按Tab键,这些信箱就可供你选择。

mailboxesMailboxsent-mail

5.header

这是一个bool型变量。它表明你在回信时引用原文是否加入原文的邮件头。

setheader=no

6.quit

mutt-quit

可以设置为yes,no,ask-yes,或者ask-no.这是说,当你按q退出时,是否提示你(ask-yes,ask-no),还是直接就退出了(yes),还是根本不理你(no)。

setquit=ask-yes

7.auto_view

那些类型的附件是允许直接通过.mailcap浏览的?

auto_viewtext/HTML

8.move

这也是一个提示性变量。它是确定当你退出时,是否提示你把信件从spool移动到的mbox文件。

setmove=no

9.ascii_chars

当Mutt用thread方式显示时,是否用纯ascii表示树状列表。

setascii_chars=yes

如果设置了就是这个样子:

mutt-ascii

10.include

回信时是否包含原文。

setinclude

11.indent_str

回信的引文之前插入那个符号?

setindent_str=">"

12.my_hdr

设置你自己的邮件头。

13.打分

新信件+4分,爸爸(w2r007)发来的+2,主题包含“通知”的+2,主题包含“Circulation”+3,已经标记删除的-5,上次没有读的+1,包含“believe”的-10(垃圾广告!)。

score"~N"+4

score"~fw2r007"+2

score"~s通知"+2

score"~sCirculation"+3

score"~D"-5

score"~O"+1

score"~sbelieve"-10

14.sort

排序方式。可以是

date

date-sent

date-received

from

mailbox-order(unsorted)

score

size

subject

threads

to

几种方式,每种方式可以在前面加一个"reverse-"前缀表示反方向排序。我一般按分数排序:

setsort=score

15.sort_aux

当用thread排序方式时,我们对各个thread的相对排序顺序。

setsort_aux=date

16.pager_stop

如果设置,那么你在pager(就是你看信的内容的窗口里)翻页时,如果翻到最后,再按往下翻也不会翻到下一封信件。如果不设置就会自动翻到下一封信。

setpager_stop

17.500米口径球面射电望远镜_reply

如果设置,当你按"r"回信时,就不会再提示你输入回信地址和主题,直接进入编辑模式。

setfast_reply

18.resolve

当你按"t"或者"D"之类的标记操作时,是否自动把光标移动到下一封信件。

setresolve=yes

19.alias_file

当你在index里按"a"为来信者取别名时,使用哪一个别名文件保存这个别名。

setalias_file=/home/wy/.mutt.alias

20.record

你发出的邮件保存到那个信箱文件?比如可以像我这样每个月发出的信件放在不同的文件里。

setrecord="~/Mail/=sent-mail-`date+%Y-%m`"

21.charset

你的终端支持哪一种编码的显示?这个必须和你的终端编码一样。

setcharset="gb2312"

22.send_charset

发信时可以使用的字符集。只有当前面的字符集不能正确表示信件内容时才会使用后面的。比如,如果你像下面这样设置,你的信件如果全是英文,那么信件就会被设置为us-ascii编码,如果出现了法语字符,那么就会用iso-8859-1,如果出现了汉字就会用gb2312,如果以上都不是,那么就用utf-8。

setsend_charset="us-ascii:iso-8859-1:gb2312:utf-8"

23.wait_key

当外部程序退出时,是否要求用户按一个键才返回。这在察看某些壳层命令输出时是比要的,否则它们一下就消失了。

setwait_key=yes

24.confirmappend

当你要把信件存到另一个信箱,而这个信箱已经存在时,是否提示附加?

setnoconfirmappend

25.edit_headers

是否把邮件头也放在编辑器里可以修改?

setedit_headers=no

26.pager_index_lines

当你在用pager看信件时,在index留出多少行显示邮件列表?

setpager_index_lines=4

比如我留下4行显示列表,其它的用来显示正文:mutt-indexpager

27.subscribe

告诉Mutt你已经订阅了那些邮件列表(mailing-list).这有助于Mutt判断那些信件是邮件列表转过来的,避免你错误的回复到别人的私人信箱。也避免别人回复到你的私人信箱。

中文FAQ

2.怎样让Mutt显示日期等为中文?

setlocale="zh_CN"

3.发出的信件为什么设置了错误的charset?别人的程序不能正确显示我的中文信件!

把gb2312编码加到你的send_charset.就像这样最好:

setsend_charset="us-ascii:iso-8859-1:gb2312:utf-8"

4.收到一些中文信件全部显示为"???"

这是因为某些email客户端,比如清华大学的WWW界面客户端没有设置字符编码,你看看邮件头(按h),是不是有个

Content-Type:text/plain

但是后面没有说charset="GB2312"?Mutt遇到这种没有设置charset的邮件就会使用"us-ascii",所以如果你想让这种信件可以正确显示,就把"us-ascii"设置为"gb2312"的别名:

charset-hook^us-ascii$gb2312

注意"us-ascii"中间的连字号

5.可是仍然有邮件标题乱码呢!

看看你的$spool里那个乱码的信件是不是有类似如下内容:

Subject:=?iso8859-1?B?U29oddCj09HCvDq587Dg09DQwrPJ1LG808jro6E=?=

Chinaren等服务器发出来的信件使用了quoted-printable的subject,而且设置编码为"iso8859-1",这显然是错误的。

对付这个错误的办法是把iso-8859-1变成gb2312的别名:

charset-hook^iso-8859-1$gb2312

注意"iso-8859-1"中间的连字号

如果仍然有信件乱码。干脆用

charset-hook.*gb2312

把所有信件都用gb2312显示。

6.可是这样设置之后evolution发过来的subject为utf-8编码的邮件标题乱码!

那就把不是utf-8的编码都映射到gb2312:

charset-hook!utf-8gb2312

7.怎样配置fetchmail?

fetchmail的配置非常简单。如果只是一个人用的话,可以这样设置:比如,我在我的$HOME目录编辑了一个.fetchmailrc:

setdaemon60

pollmails.tsinghua.edu.cn

protocolPOP3

user"wang-y01"

password"wang-y01的密码"

pollsmth.org

....

....

然后把fetchmail写到我的shell启动脚本里:

!psaux|grep-qfetchmail&&fetchmail&

fetchmail启动后成为一个daemon,每分种帮我检查所有邮箱里的邮件,收回来,并且转发到本地信箱。修改上面那个"60"就可以改变检查时间间隔。

如果不想让fetchmail删除服务器上的文件,而且每次只取新的信。就在配置文件里加上:

Keep

uidl

8.我不想用fetchmail,能不能直接收回POP信件啊?

如果你的Mutt编译时加入了POP功能,那么你可以直接从POP服务器收邮件而不用借助于fetchmail.把类似这些行加入~/.muttrc

setpop_user=wang-y01

setpop_pass="wang-y01的密码"

setpop_host="pop://mails.tsinghua.edu.cn"

也可以一次性输入所有内容:

setpop_host="pop://wang-y01:wang-y01的密码@smth.org"

在Mutt里按一下"G"就可以取邮件了。

9.怎样处理多个POP3信箱?

如果你有多个POP信箱,你可以设置一些方便的宏把POP信件收到你信箱里。举个例子,就像我这样:

macroindex,shredder":setpop_host=\

\"pop://shredder:shredder的密码@smth.org\"\r\"

macroindex,sk8er":setpop_host=\

\"pop://sk8er:sk8er的密码@smth.org\"\r\"

macroindex,ts":setpop_host=\

\"pop://wang-y01:wang-y01的密码@mails.tsinghua.edu.cn\"\r\"

macroindex,g",shredder,sk8er,ts"

这样,我只要按,shredder就可以收我在smth上shredder的信件,只要按,sk8er就可以收我在smth上sk8er的信件,只要按,ts就可以收mails.tsinghua.edu.cn的信件,只要按,g就可以收取我所有POP信箱的信件了。

10.怎样直接访问POP3信箱?

除了上面的方法,你还可以直接访问POP3信箱。比如,我可以直接按"c"切换到信箱pop://sk8er:sk8er的密码@smth.org

就可以浏览pop的信件了。切换到其它信箱就浏览不同的pop。如果你嫌按键太多可以自己定义一个宏。这是同步操作,你如果在这个信箱里删除一封信件,mutt就会删除你pop3服务器上的信件。你不删它也不删。

邮件太多时这样效率很低,每次都要取所有邮件头,就像Foxmail的“远程邮件管理”。所以最好在那种不想取回信件,而想直接删除垃圾邮件的时候用这个办法。

11.怎样处理邮件列表?

参看subscribe命令。

12.我按"d"的时候邮件被直接标记删除了,怎样才能把删掉的信件都移到一个“垃圾箱”呢?

你只要把信件用save-message函数保存到你的垃圾箱,比如~/Mail/Trash,信件会被自动做上"D"(删除)标志。为了让"d"可以保存到垃圾箱,你可以把"d"键绑定到一个宏。但是如果你要删除垃圾箱里的邮件,这个宏会再次把垃圾箱的邮件存储到垃圾箱,产生循环。所以你应该使用folder-hook在垃圾箱里把"d"恢复到原来的delete-message函数,而在其它信箱使用那个宏。

现在你可以用以下设置得到一个“垃圾箱”的功能。第一次按"d"时有可能会被讯问是否建立这个信箱(Trash).

folder-hook.'macroindexd"~/Mail/Trash\r"'

folder-hook~/Mail/Trash'bindindexddelete-message'

13.当收到的邮件的header有很多项目时,我的pager里全都是邮件头。怎样才能只看到某些我想看的邮件头呢?

你可以用ignore忽略你不想看到的邮件头,如果ignore*,你就可以忽略所有邮件头。用unignore可以恢复显示被忽略的邮件头。所以一个简单的办法就是先把所有邮件头忽略,然后放出你想看的那几个。

看下面的设置。我的sent.*(发件箱)里只显示To:Subject:Date:三项。而在其它信箱就显示From:Subject:X-Mailer:Date:这几项。

folder-hook."ignore*;unignorefromsubjectX-mailerdate"

folder-hooksent.*"ignore*;unignoretosubjectdate"

你还可以指定邮件头显示的顺序:

hdr_orderfromtosubjectdate

14.Mutt怎么使用地址簿呢?

你可以用alias来实现一个地址簿。alias命令的形式是这样的,举个例子:

aliaswyWangYin<邮箱>

alias是命令,wy是别名,WangYin<邮箱>是一个标准的email地址。这样,如果你在index里按"m",在To:的提示下输入"wy",就可以发信给WangYin<邮箱>。

在To:的提示下按Tab就可以显示联系人列表,然后你可以移动光标选择联系人。

如果你有很多alias要写,最好把它们写到另外一个文件,比如叫.mutt.alias.然后在.muttrc里加上:

source~/.mutt.alias

你还可以设置一个变量:

setalias_file=~/.mutt.alias

这样你在index里按"a",就可以把来信人加入到这个alias文件了。

15.Mutt如何处理HTML附件?

Mutt可以处理任何类型的附件。因为它可以调用合适的程序来处理它们。为了直接在mutt的窗口里显示HTML,你只需要在~/.mailcap文件加入。

16.Mutt如何处理Worddoc附件。

清华大学总是喜欢发送含有doc附件的通知。真是让人ft。现在有一个完美的解决方案了:使用wvware把doc转成HTML嵌入mutt里。

wvHtml--charset=gb2312your.docyour.html

就可以把doc转成HTML。经测试,能够正确处理汉字和图片。

你可以让mutt调用wvHtml在自己的窗口里直接显示转换的doc文档。只需要在~/.mailcap文件加入:

application/msword;wvHtml--charset=gb2312%s-|lynx--dump-stdin;

nametemplate=%s.html;copiousoutput

auto_viewtext/htmlapplication/msword

这样你的mutt看一个doc的时候就像这个样子:

mutt-wvware

17.我想在Mutt里使用Emacs怎么办?

Emacs是一个非常强大的编辑器,所以你肯定会希望能在Mutt里使用Emacs。你可以选择两种方式:

参考资料