跳至正文

浅述mutt邮件客户端


本文将重点涉及

多账户用msmtp发信
多账户用getmail定时自动收信
最基本的procmail投递
mutt基本配置
mutt个性化配置
用Mail-Notification提醒新邮件
mutt的使用


本文将不涉及

发信验证的证书问题
fetchmail收信
procmail过滤信件
字符界面新邮件提醒
调用Emacs编辑信

Linux下收发邮件的客户端有不少,但我的使用经历让我相信,mutt绝对快速、稳定、高效,而又可以充分定制,远胜于图形界面的工具。

mutt并不是一个最优秀的邮件收发工具,却是最优秀的邮件管理工具。它可以调用最优秀的邮件收取工具、发送工具、分拣和投递工具、编辑工具。它本身将邮件显示、排序、类别切换等事情做到最好。

这就是UNIX的思想,只做一件事,并做到最好。

我介绍使用mutt管理邮件,并调用msmtp发信、getmail收信、procmail投递信。至于编辑信件,我调用的是VIM;你如果使用的是Emacs,网上也不难找到相关设置;你如果使用的是其它编辑器,我建议,换成这两种吧。邮件提醒工具介绍Mail-Notification。

其实收信工具更多人是用的fetchmail,但根据我的使用感觉和网上的评论,getmail表现更好。所以本文就只讲述getmail了。

写本文时,我的系统是Ubuntu。

1、程序安装

首先安装mutt、msmtp、getmail、procmail:(注意下面命令行中是getmail4)

$ sudo apt-get install mutt msmtp getmail4 procmail

如果你需要调用VIM编写信件,而又没有安装的话:

$ sudo apt-get install vim

2、配置发信工具msmtp

在家目录下建立名为.msmtprc的配置文件:

$ vi ~/.msmtprc

在文件中加入以下内容:(把_7_替换为@)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 我的地址为newnuy_7_gmail.com的邮箱
account gmail              # 账户名称是gmail,这个可以随意写
host smtp.gmail.com        # 发信服务器是smtp.gmail.com,这个是邮件服务器规定的
from newnuy_7_gmail.com    # 邮箱地址
tls on                     # tls/ssl加密,gmail邮件服务器的要求
auth on                    # 发信验证,大多邮件服务器的要求
port 587                   # gmail的发信端口
user newnuy                # 邮箱账号
password xxxxxx            # 邮箱密码,明文
# 我的地址为newnuy_7_realtek.com的邮箱
account realtek
host mail.realtek.com
from newnuy_7_realtek.com
auth login                 # 发信验证,明文传递验证数据,我公司邮件服务器的要求
port 465
user newnuy
password xxxxxx
# 默认发信账户名称
account default: gmail

当然了,这个配置文件要根据你自己的情况做一定的修改,稍觉麻烦的地方是,要获取邮件服务器的相关信息。其中发信服务器地址、发信端口是必须获取的。而tls和auth,未必都如gmail的配置值:可能是tls on,也可能是tls off(此时可以不写这一行);auth on/login/plain都是常见的。

保存退出.msmtprc后,由于里面的密码是明文,所以此文件一定只能被本人访问:

$ chmod 600 ~/.msmtprc

3、配置收信工具getmail

首先在家目录下建立.getmail文件夹:

$ mkdir ~/.getmail

然后在.getmail目录内为每个邮箱各建立一个配置文件,比如为我的gmail建立getmailrc.gmail:

$ vi ~/.getmail/getmailrc.gmail

并写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[options]
verbose  = 0                       # 不产生过多信息
read_all = false                   # 只收取新信件
delete   = true                    # 将服务器上已被接收的信件删除
[retriever]
type     = SimplePOP3SSLRetriever  # POP3收信方式
server   = pop.gmail.com           # 收信服务器地址,这个是邮件服务器规定的
port     = 995                     # 收信端口
username = newnuy                  # 邮箱账号
password = xxxxxx                  # 密码,明文
[destination]
type     = MDA_external            # 因为要使用procmail分拣信件,所以此处这样填写
path     = /usr/bin/procmail       # procmail命令的位置,如果不确定可以
                                   #     通过$ which procmail获得
unixfrom = true                    # 这一行写不写无所谓

注意不可以将不同邮箱的配置文件写到一起。假如我类似地建立了另一个邮箱的配置文件getmailrc.realtek,那么我们需要再创建一个脚本文件来调用这些散置的配置文件:

$ vi ~/.getmail/getmail.sh

在其中写入:

1
2
# !/bin/bash
getmail -n -r ~/.getmail/getmailrc.gmail -r ~/.getmail/getmailrc.realtek

执行这个脚本,就相当于对我的gmail邮箱和realtek邮箱执行getmail命令。可是不能总是手动执行脚本,所以将此事交给系统守护进程:

$ crontab -e

第一次使用此命令可能会出现选择编辑器的提示,可以选择vi,然后就会启动vi,可能又会就VIM的配置文件报一些错误,回车就打开了相应文件。在其中加入:

1
*/1 * * * * ~/.getmail/getmail.sh > /dev/null 2>&1

注意*/1三个字符之间没有空格,> /dev/null 2>&1避免getmail收信报告被当作信件发至邮箱(如果不这样,新信件就看不完了)。现在是每分钟收一次。

由于配置文件中含有密码明文,修改权限是必须的:

$ chmod -R 700 ~/.getmail

4、创建信箱文件

getmail收取信件,而信件的存放地点,我们还未指定。在家目录下建立mail目录,其内用文本文件inbox、sent作为收件箱和发件箱:

$ mkdir ~/mail
$ touch ~/mail/inbox ~/mail/sent ~/mail/.procmaillog

一起创建的还有procmail的错误记录文件.procmaillog。mail目录内存放了信件等重要内容,杜绝他人访问:

$ chmod -R 700 ~/mail

5、配置信件分拣、投递工具procmail

getmail只是将收到的信件交由procmail处理,procmail如何让它们到达我们已经创建好的收件箱,需要在.procmailrc中说明:

$ vi ~/.procmailrc

加入以下内容:

1
2
3
4
5
6
MAILDIR = $HOME/mail
DEFAULT = $MAILDIR/inbox
LOGFILE = $MAILDIR/.procmaillog
:0
* .* inbox
default

procmail很强大,可以设置各种分拣、投递的规则,当然过滤垃圾邮件也不在话下。这里只是将所有信件都投到inbox中。

6、信件管理工具mutt基本配置

以上的msmtp、getmail、procmail,我们平时都接触不到,因为管理、呈现信件的事情由mutt承担,所以只要和mutt打交道就行了。

正因为这个原因,mutt的配置文件也更为复杂,先在家目录下建立.muttrc文件:

$ vi .muttrc

首先需要加入一些基本的设置语句:

1
2
3
4
5
6
set folder    = "~/mail"          # 所有信件所在目录
set mbox      = "~/mail/inbox"    # 收件箱文件
set record    = "~/mail/sent"     # 发件箱文件
set spoolfile = "~/mail/inbox"    # 启动mutt后默认显示的信箱文件
set sendmail  = "/usr/bin/msmtp"  # 发信程序msmtp的位置,如果不确定可以
                                  #    通过$ which msmtp获得

为什么没有指定收信工具呢?因为守护进程已经指使getmail定时收信,而getmail每收到一封信,就交由procmail,从而将新信投递到inbox中。

此时mutt已经能够工作,但收到的许多中文信件会显示乱码。所以必须在.muttrc中再加入以下内容:

1
2
3
4
5
6
7
set charset      = "utf-8"           # 终端支持的编码,Linux下一般是utf-8
set send_charset = "utf-8"           # 发信编码
charset-hook ^us-ascii$ gb2312       # 用gb2312编码显示未设置编码的信件
charset-hook ^big5$ big5             # 用big5编码显示繁体信件
charset-hook !utf-8 gb2312           # 用gb2312编码显示非utf-8编码的信件
set assumed_charset    = "gb2312"    # 用gb2312编码显示未经MIME编码的信件
set rfc2047_parameters = yes         # 用gb2312编码显示中文附件名

7、信件管理工具mutt个性化配置

可以再加入以下内容,以完善设置:

1
2
3
4
set quit       = ask-yes     # 退出mutt时进行询问
set header     = no          # 回信时不引用信件头
set indent_str = "> "        # 回信时引用内容的开头标志
set editor     = vim         # 使用VIM编辑信件

我编辑信件时调用VIM会遇到一个问题:会自动使用回车断行。在网上没有查到类似问题,于是我在~/.vimrc中加了一个强制性的断行设置:

1
2
" 自动断行字符数
set tw=999999

在.muttrc中加入所发信件的信件头的设置:

1
2
3
set realname = "newnuy"                        # 真名
set from     = "newnuy  <newnuy_7_gmail.com>"  # 默认发信账户
set use_from = yes                             # 生成发信地址,这是默认值

此时发信会以所设默认发信账户的名义,但对于要使用多个发信账户(比如公司邮箱和私人邮箱)的人来说,还是希望能进行账户的切换。在.muttrc中加入以下内容以定义账户切换快捷键:

1
2
3
4
5
set envelope_from = yes          # 导致可以切换发信账户
# Alt+2切换到公司邮箱账户
macro generic "<esc>2" ":set from='newnuy  <newnuy_7_realtek.com>'"
# Alt+1切换到gmail邮箱账户
macro generic "<esc>1" ":set from='newnuy  <newnuy_7_gmail.com>'"

我的默认发信账户是gmail邮箱,如果想用公司邮箱发信或者回信,之前只要按Alt+2、然后回车,就可以切换到公司邮箱。如果使用gnome-terminal并打开多个标签页,由于Alt+数字键被预设为标签页选择的快捷键,将无法快捷切换发信账户。解决很容易,比如可以更改gnome-terminal标签页选择的快捷键为Windows徽标键+数字键,也不会和其它预设冲突。

切换收信箱和发件箱的方法,按c后再按?,即可打开信箱列表,再选择你想查看或操作的邮箱即可。不过也可以定义快捷键,在.muttrc中加入:

1
2
3
4
macro index I "c!\n" "Go to inbox"          # 列表页按Shift+I切换到inbox
macro pager I "c!\n" "Go to inbox"          # 信件页按Shift+I切换到inbox
macro index S "<change-folder>=sent\n" "Go to sent"
macro pager S "<change-folder>=sent\n" "Go to sent"

使用地址簿文件,这样我们可以把通讯录直接写在文件内,也可以在mutt中把地址加入文件。先创建地址簿文件:

$ vi ~/mail/.list.a

就可以在.list.a中按如下格式添加通讯录:

1
2
3
# yw是别名,用yw就可以替代地址'newnuy'<newnuy_7_gmail.com>
alias yw   \"newnuy\"  <newnuy_7_gmail.com>
alias yw1  \"newnuy\"  <newnuy_7_realtek.com>

当然得在.muttrc中加入以下内容:

1
2
source ~/mail/.list.a              # 添加.list.a文件到配置文件
set alias_file = ~/mail/.list.a    # 将.list.a文件设为地址簿文件

现在mutt中,按a也可把地址加入.list.a。

若想在信件末尾能自动生成签名,建立签名文件:

$ vi ~/mail/signature

在其中写入你的签名档。并只需在.muttrc中再加入一行:

set signature = ~/mail/signature

信件显示顺序默认是时间顺序(Debian/Ubuntu中默认是threads),但mutt提供了一个可以通过自动调整信件重要程度值、进而调整显示顺序的功能:信件打分。可以在.muttrc中加入类似的语句:

1
2
3
4
5
6
score "~N" +2           # 新信+2
score "~O" +1           # 没看过的信+1
score "~f newnuy" +5    # newnuy的信+5
score "~s Linux" +3     # 主题包含Linux的信+3
score "~D" -3           # 标记删除的信-3
set sort = score        # 启用分数排序

默认的颜色如果不太喜欢,可以在.muttrc中加入我的配色方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 每行设置一项,两个颜色分别是前景色和背景色
color normal     white        black
color attachment brightyellow black
color hdrdefault cyan         black
color indicator  black        cyan
color markers    brightred    black
color quoted     green        black
color signature  cyan         black
color status     brightgreen  blue
color tilde      blue         black
color tree       red          black
color header     brightgreen  black ^From:
color header     brightcyan   black ^To:
color header     brightcyan   black ^Reply-To:
color header     brightcyan   black ^Cc:
color header     brightgreen  black ^Subject:
color body       brightred    black [\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+
color body       brightblue   black (https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+
color index      brightyellow black ~N

8、配置邮件提醒工具Mail-Notification

邮件提醒工具,我介绍Mail-Notification,这个图形界面的工具很容易配置。首先安装:

$ sudo apt-get install mail-notification

然后打开设置界面:

$ mail-notification -p &

在弹出的设置界面内,添加收件箱文件,并勾选Play a sound when new mail arrives项。设置完成后如下图:

9、mutt的使用

mutt的使用只能通过键盘。启动mutt:

$ mutt

这里是一些默认的按键定义:(在列表页和信件页都可以使用)

1
2
3
4
5
6
7
8
9
10
11
m        # 写信
r        # 回信
d        # 标记删除
$        # 应用标记
j        # 下一项
k        # 上一项
a        # 加入地址簿
v        # 查看附件
s        # 储存
q        # 退至上一层
?        # 帮助

写信时在输入收件人处,按Tab可调出地址簿,按空格键可以复选,按回车键选择并确定;编辑好收件人、主题、信件正文后,按c可以添加抄送,按b可以添加密送,按a可以添加附件,按y发出信件。

显示信箱的切换和发信账户的切换:

1
2
3
4
5
6
c!       # 至inbox,默认定义
c?       # 打开信箱列表
I        # 大写,至inbox,在我的配置文件下
S        # 大写,至sent,在我的配置文件下
Alt+1    # 至第1发信账户,在我的配置文件下
Alt+2    # 至第2发信账户,在我的配置文件下

《浅述mutt邮件客户端》有6个想法

    1. 可以把你错误的信息给出,也许我可以提供一些帮助。因为所用的配置文件均来自我现在正在用的配置文件,所以应该不会有根本性错误。

  1. 你好!按文中配置,mutt确实可以工作,只是邮件全都到了 /var/mail/用户名 里,自己在 .muttrc 里设置的信件目录、收信箱等完全没有作用啊。

    1. 请看一下是不是因为procmail没有起作用,getmail将信件交给procmail处理,procmail将信件扔到指定文件。与mutt无关,mutt只是打开该文件并呈现信件。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注