FreeBSD下如何使用mutt连接gmail
电子邮件是一个很重要的通讯工具,很多人都有自己的电子邮件,google的gmail完全免费,而且空间很大,还允许用户使用客户端对其进行访问,这样就不需要直接登陆google的网站,非常方便,总之是优点多多。为了保证电子邮件的安全性,gmail的电子邮件服务器使用了SSL安全协议,目前多数图形界面的邮件客户端都直接支持这个协议,不需要用户进行某些特殊的设置,比如:Evolution。
这些图形界面的电子邮件客户端有许多优点,比如比较漂亮,比如很容易使用,可以很快的上手,但是也有一个共同的缺点:体积比较大,编译起来比较费劲。Mutt是一个非常小巧的电子邮件客户端,编译起来很容易,并且定制性非常的高,但是配置上稍微有点复杂,尤其是由于gmail使用了SSL协议,所以很多人在使用Mutt连接gmail的时候总是配置不好。
这个wiki页面主要介绍在FreeBSD系统下如何使用mutt将openssl、vim、gnupg、fetchmail、procmail、msmtp、ca_root_nss整合起来并连接到gmail,虽然是针对FreeBSD系统的,其中多数内容也适合各个Linux发行版本以及各个BSD分支,在其他系统上只需要做少量调整。
目标:
我们在这里,我们假设需要配置的gmail账号的详细信息如下:
gmail账号:fender0107401_2_gmail.com
gmail账号的密码:123456
其中:_2_等价于@,这么写是为了防止这个电子邮件被“机器人”给抓去了。
这个人订阅了很多FreeBSD的邮件列表,并且给每个邮件列表建立一个邮箱来保存,以此来方便自己管理自己的电子邮件,并且这个人不喜欢编译太大的软件,在经过几次对Evolution的编译以及升级之后,决定放弃Evolution而转向Mutt,于是乎他选择了mutt+fetchmail+procmail+msmtp+ca_root_nss+vim+gnupg这个解决方案,为了实现这个解决方案,他需要进行一些配置工作。在配置完成后,他决定把整个过程整理一下并写在wiki上,于是就有了这个wiki页面。
需要安装的port:
ca_root_nss:这port是第三方认证。
fetchmail:用来从gmail的邮件服务器上(pop.gmail.com)取回电子邮件(首先和服务器建立SSL连接);
procmail:由getchmail取会来的电子邮件,通过procmail进行分拣工作,分发的各自的邮箱去,比如你可以给freebsd-doc邮件列表单独制定一个邮箱,这样可以方便对邮件进行管理;
msmtp:用于发送电子邮件到gmail的邮件服务器(smtp.gmail.com)上去(首先和服务器建立SSL连接);
gnupg:用于对电子邮件进行加密,这样只有某个人才能察看文件的内容;或者是对电子邮件进行数字签名,这样别人可以通过你的gpg公钥开验证你的电子邮件是否被编辑过,如果被别人编辑过,数字签名验证就会失败。关于gnupg的加密模型或者说加密机制可以参考其主页:gnupg;
vim:用于编辑邮件,我是一个vim用户,几乎用vim和gvim写一切东西,写邮件虽然不需要什么太多高级功能,但是用习惯了,自然是选择vim来编辑邮件,你也可以指定任何一个你喜欢的编辑器来代替vim;
mutt:用于把上面的各个port串起来,或者说是集成起来。
SSL协议:
SSL是Secure Socket Layer的缩写,本质上一个协议,或者说是一个保证连接安全性的机制。所谓协议就是一个文本,目前有许多这个协议的实现方案,在开源世界里面我们自然使用开源的实现方案:OpenSSL。谈到OpenSSL这个SSL实现,我们应该感谢Eric Young和Tim Hudson这两个程序员,因为是他们开发并实现了OpenSSL。
为了保证能正确的配置成功,需要简单地了解一下OpenSSL这个协议在建立连接时需要哪些步骤,也就是客户端和服务器建立连接时“握手”的基本过程。
游戏角色:
客户端:提出建立ssl连接的人;
服务器:提供ssl服务的人;
第三方认证机构:第三方认证机构签发数字证书,客户端使用这个证书对服务器所发送来的公钥进行验证,保证的确是目标服务器。
游戏规则:
客户机对目标服务器提出建立ssl连接的申请,告诉服务器自己所能支持的加密方案;
服务器收到申请以后,从客户机所支持的加密方案里面选择一个最安全的,作为本次连接的加密方案;然后把自己的公钥发送给客户端;
客户端收到公钥以后,使用第三方认证来验证这个收到的服务器公钥,如果验证成功就使用这个收到的服务器公钥加密一个随机数后发送给服务器,作为对称加密的对称加密的密钥;
服务器接受到这个加密的随机数以后,使用自己的私钥解密,作为对称加密的密钥;
自此之后服务器和客户端之间使用对称加密来进行加密的通信连接,也就是连接建立成功了;
在上述过程中,任何一个环节的失败都会导致链接失败。
总结一下:首先使用“非对称加密”,然后使用“对称加密”;第三方认证机构确保用户在“非对称加密”过程中使用正确的服务器“公钥”;在“对称加密”过程中使用的“对称密钥”由“非对称加密过程”来传递。
注:
这是只是一个很简单的介绍,实际中连接的建立过程比这个要复杂一些,另外还可能有一些变化(用于减少服务器负担)。我看到过有人说SSL协议并不安全,我并没有仔细的研究过,但是从上面的“握手”过程来看,还是比较安全的,关于SSL的详细内容可以参考相关资料。
配置任务:
任务1:安装第三方认证
我最开始写这个wiki的时候,按认证是比较麻烦的,需要一些手工操作,现在要简单多了,只需要安装ca_root_nss这个port就可以了,这个port里面包含了很多的第三方认证。
# cd /usr/ports/security/ca_root_nss
# make install clean
安装的时候会问题是否”Add symlink to /etc/ssl/cert.pem”。
如果添加,那么/etc/ssl/cert.pem就是一个符号连结。
$ file /etc/ssl/cert.pem
/etc/ssl/cert.pem: symbolic link to `/usr/local/share/certs/ca-root-nss.crt’
任务2:安装并配置msmtp
安装:
安装方法:
# cd /usr/ports/mail/msmtp
# make install clean
注意一定打开GNUTLS的支持,我们需要使用这个协议来进行加密连接。
配置:
配置就是写.msmtprc这个文件,我的.msmtprc文件内容如下,使用时注意换成自己的账号和密码就可以了,还需要注意的是自己的第三方认证放在哪里了以及自己的msmtplog保存在什么地方,因为你可能选择和我不同目录:
# set default values
defaults
tls on
tls_starttls on
tls_trust_file /usr/local/share/certs/ca-root-nss.crt # 这里是设定认证文件的位置。
logfile /home/fender/Mail/.msmtp.log
# set my first account
account fender0107401
host smtp.gmail.com
port 587
from fender0107401_2_gmail.com
auth on
user fender0107401
password 123456
# set a default account
account default : fender0107401
注意,写好配置文件以后要修改文件的权限:
$ chmod 600 .msmtprc
现在:发邮件的问题解决了。
任务3:安装并配置fetchmail
安装:
# cd /usr/ports/mail/fetchmail
# make install clean
配置:
配置就是写.fetchmailrc这个文件,我的.fetchmailrc文件内容如下,使用时注意换成自己的账号和密码就可以了,还有就是要注意自己的第三方认证位置:
poll pop.gmail.com
port 995
proto POP3
user ‘fender0107401_2_gmail.com’
password ‘123456’
options
no keep
ssl
sslcertck
注意,写好配置文件以后要修改文件的权限:
$ chmod 600 .fetchmailrc
现在:收邮件的问题解决了。
任务4:安装并配置procmail
安装:
# cd /usr/ports/mail/procmail
# make install clean
配置:
我主要是接收各种订阅的电子邮件列表,通过procmail来进行分拣工作,我的.procmailrc配置文件如下,使用时注意调整目录设置:
################################################################################
PATH=$HOME/bin:/usr/bin:/usr/local/bin:
MAILDIR=$HOME/mail
LOGFILE=$MAILDIR/.procmaillog
################################################################################
# FreeBSD mailing list:
:0
* ^List-Id:.*freebsd-announce
1_freebsd-announce
:0
* ^List-Id:.*freebsd-security-notifications
1_freebsd-security-notifications
:0
* ^List-Id:.*freebsd-amd64
1_freebsd-amd64
:0
* ^List-Id:.*freebsd-doc
1_freebsd-doc
:0
* ^List-Id:.*freebsd-gnome
1_freebsd-gnome
:0
* ^List-Id:.*freebsd-performance
1_freebsd-performance
:0
* ^List-Id:.*freebsd-security
1_freebsd-security
:0
* ^List-Id:.*cnproj-cvs
1_cnproj-cvs
:0
* ^List-Id:.*cnproj-submit
1_cnproj-submit
################################################################################
# Gnu Octave mailing list:
:0
* ^List-Id:.*bug-octave
2_bug-octave
:0
* ^List-Id:.*help-octave
2_help-octave
:0
* ^List-Id:.*octave-maintainers
2_octave-maintainers
################################################################################
:0
* .*
3_default
################################################################################
关于procmail的语法可以参考FreeBSD Handbook中Electronic Mail的相关内容。
现在:分拣邮件的问题解决了。
任务5:安装并配置mutt
安装:
# cd /usr/ports/mail/mutt
# make install clean
配置:
mutt的配置工作主要是通过.muttrc来实现,详细的各种配置选项可以参考下述连接:
mutt_manual
muttrc_example
我把自己的.muttrc中一些比较基本的配置写出来,方便大家参考:
# Personal information
set hostname=PC-686.Workstation
定义系统名。
set realname=Li
定义用户名。
my_hdr From:fender0107401_2_gmail.com
定义我的电子邮件地址。
# sendmail
set sendmail="/usr/local/bin/msmtp"
定义msmtp来发送电子邮件。
# fetchmail and procmail
macro index G "!fetchmail -a -m ‘procmail -d %T’\r"
定义使用fetchmail来接受电子邮件,接受以后使用procmail来分拣邮件。
# GnuPG
source usr/local/share/examples/mutt/gpg.rc
使用gnupg。
set editor="vim"
定义vim作为我编辑器。
set index_format="| %4C | %Z | %{%b %d} | %-15.15L | %s"
定义index的显示方式。
set folder_format="| %2C | %t %N | %8s | %d | %f"
定义邮箱的显示方式,一定要有%N,否则没法知道哪个有新邮件。
.muttrc内容汇总:
# Personal information
set hostname=PC-686.Workstation
set realname=Li
my_hdr From:fender0107401_2_gmail.com
# sendmail
set sendmail="/usr/local/bin/msmtp"
# fetchmail and procmail
macro index G "!fetchmail -a -m ‘procmail -d %T’\r"
# GnuPG
source usr/local/share/examples/mutt/gpg.rc
set editor="vim"
set index_format="| %4C | %Z | %{%b %d} | %-15.15L | %s"
set folder_format="| %2C | %t %N | %8s | %d | %f"
注意事项:
必须打开防火墙,以我使用的ipfw为例,需要在防火墙规则中添加下述内容:
$cmd 00700 allow tcp from any to any 587 out via $nic setup $ks
$cmd 00800 allow tcp from any to any 995 out via $nic setup $ks
其中,$ks和$nic是我设定的变量,$ks的定义如下:
ks="keep-state"
$nic代表我的网卡,定义如下:
nic="re0"
mutt的配置选项很多,我没有都写出来,详细的可以参考下述连接。
mutt_manual
muttrc_example
后记:
现在,打开一个虚拟终端,比如gnome-terminal,然后运行mutt,
G将会下载你的邮件;
如果有新邮件mutt会在相应邮箱前显示一个N;
想发送邮件就按m,编辑以后使用p键可以使用gnupg对其签名;
我并没有写如何安装vim或者是如何使用gnupg,而是直接假设使用者知道如何使用gnupg,相关内容需要可以参考vim或者是gnupg的文档;
有意思的事情还有很多,需要慢慢的探索,我不能把mutt所有的功能都写出来,因为实在是太多太多了,可以定制显示的颜色,可以定义显示邮件的哪些部分,可以指定如何排序……
欢迎补充。