FreeBSD下如何使用mutt连接gmail
电子邮件是一个很重要的通讯工具,很多人都有自己的电子邮件,google的gmail完全免费,而且空间很大,还允许用户使用客户端对其进行访问,这样就不需要直接登陆google的网站,非常方便,总之是优点多多。为了保证电子邮件的安全性,gmail的电子邮件服务器使用了SSL安全协议,目前多数图形界面的邮件客户端都直接支持这个协议,不需要用户进行某些特殊的设置,比如:Evolution。
这些图形界面的电子邮件客户端有许多优点,比如比较漂亮,比如很容易使用,可以很快的上手,但是也有一个共同的缺点:体积比较大,编译起来比较费劲。Mutt是一个非常小巧的电子邮件客户端,编译起来很容易,并且定制性非常的高,但是配置上稍微有点复杂,尤其是由于gmail使用了SSL协议,所以很多人在使用Mutt连接gmail的时候总是配置不好。
这个wiki页面主要介绍在FreeBSD系统下如何使用mutt将openssl、vim、gnupg、fetchmail、procmail、msmtp整合起来并连接到gmail,虽然是针对FreeBSD系统的,其中多数内容也适合各个Linux发行版本以及各个BSD分支,在其他系统上只需要做少量调整。
目标:
我们在这里,我们假设需要配置的gmail账号的详细信息如下:
-
gmail账号:fender0107401_2_gmail.com
-
gmail账号的密码:123456
其中:_2_等价于@,这么写是为了防止这个电子邮件被“机器人”给抓去了。
这个人订阅了很多FreeBSD的邮件列表,并且给每个邮件列表建立一个邮箱来保存,以此来方便自己管理自己的电子邮件,并且这个人不喜欢编译太大的软件,在经过几次对Evolution的编译以及升级之后,决定放弃Evolution而转向Mutt,于是乎他选择了mutt+openssl+fetchmail+procmail+msmtp+vim+gnupg这个解决方案,为了实现这个解决方案,他需要进行一些配置工作。在配置完成后,他决定把整个过程整理一下并写在wiki上,于是就有了这个wiki页面。
需要安装的port:
-
openssl:用于和gmail的邮件服务器建立 ssl连接,只有建立了 ssl连接,才能接受或者发送电子邮件;
-
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:安装并配置openssl以及获得第三方认证
安装OpenSSL:
# cd /usr/ports/security/openssl # make install clean
获得第三方认证:
需要注意的是发送邮件和接受邮件是两个服务器,所以你需要两个公钥的第三方认证,由于第三方认证就是一个文本文件,所以获取的方法并不唯一。
比如:你可以从debian的软件仓库里面下载,访问下述连接,下载ca-certificates这个包,解开以后去找Thawte_Premium_Server_CA.pem
和Equifax_Secure_CA.pem
这两个文件。
http://packages.debian.org/lenny/ca-certificates
http://packages.debian.org/lenny/all/ca-certificates/filelist
或者,你自己直接创建这两个文本文件:
$ touch Thawte_Premium_Server_CA.pem
然后,写入下述内容:
-----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t UCemDaYj+bvLpgcUQg== -----END CERTIFICATE-----
$ touch Equifax_Secure_CA.pem
然后,写入下述内容:
-----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 70+sB3c4 -----END CERTIFICATE-----
现在:已经取得了邮件服务器认证,但是还需要让系统知道认证文件在哪。
告诉系统第三方认证的位置:
-
首先,把你获得的第三方认证文件,放在某个地方,我放在
$HOME/mail/.certs/
下面,因为我在$HOME/mail
下面还放了一些邮箱,来分别存储不同邮件列表或者是不同来源的邮件。
-
然后,运行下述命令:
$ c_rehash $HOME/mail/.certs
现在:系统已经知道了第三方认证在哪,邮件服务器的认证问题解决了。
任务2:安装并配置msmtp
安装:
由于FrreeBSD的ports team里面这个port的maintainer并没有把SSL这个编译选项加到默认的编译设置中去,所以需要用户手工添加,或者是直接添加到/etc/make.conf中去(关于/etc/make.conf,可以参考我写的另外一个wiki页面:/etc/make.conf),到底要如何添加这个编译选项呢?让我们来看看msmtp的Makefile的具体内容,
$ cd /usr/ports/mail/msmtp $ vim Makefile
用vim打开以后搜索一下ssl,发现下述内容:
26 .if defined(WITH_GNUTLS) 27 LIB_DEPENDS+= gnutls.26:${PORTSDIR}/security/gnutls 28 CONFIGURE_ARGS+= --with-ssl=gnutls 29 .elif defined(WITH_OPENSSL) 30 USE_OPENSSL= yes 31 CONFIGURE_ARGS+= --with-ssl=openssl 32 .else 33 CONFIGURE_ARGS+= --without-ssl 34 .endif
所以,在安装的时候应该这样:
# cd /usr/ports/mail/msmtp # make WITH_OPENSSL=yes configure
然后注意看最后的输出,你应该看到tls/ssl后面的内容了吧,这个是必须有的,没有发送不出去邮件。
Install prefix ......... : /usr/local TLS/SSL support ........ : yes (Library: OpenSSL) GNU SASL support ....... : no GNU Libidn support ..... : yes NLS support ............ : yes GNOME Keyring support .. : no MacOS X Keychain support : no
然后:
# make install clean
配置:
配置就是写.msmtprc这个文件,我的.msmtprc文件内容如下,使用时注意换成自己的账号和密码就可以了,还需要注意的是自己的第三方认证放在哪里了以及自己的msmtplog保存在什么地方,因为你可能选择和我不同目录:
account default host smtp.gmail.com port 587 from fender0107401_2_gmail.com tls on tls_starttls on tls_trust_file /home/fender/mail/.certs/Equifax_Secure_CA.pem auth on user user_name password 123456 logfile /home/fender/mail/.msmtp.log
注意,写好配置文件以后要修改文件的权限:
$ 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 sslcertpath /home/fender/mail/.certs/
注意,写好配置文件以后要修改文件的权限:
$ 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来实现,详细的各种配置选项可以参考下述连接:
我把自己的.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的配置选项很多,我没有都写出来,详细的可以参考下述连接。
后记:
现在,打开一个虚拟终端,比如gnome-terminal,然后运行mutt,
-
G将会下载你的邮件;
-
如果有新邮件mutt会在相应邮箱前显示一个N;
-
想发送邮件就按m,编辑以后使用p键可以使用gnupg对其签名;
-
我并没有写如何安装vim或者是如何使用gnupg,而是直接假设使用者知道如何使用gnupg,相关内容需要可以参考vim或者是gnupg的文档;
-
有意思的事情还有很多,需要慢慢的探索,我不能把mutt所有的功能都写出来,因为实在是太多太多了,可以定制显示的颜色,可以定义显示邮件的哪些部分,可以指定如何排序……
欢迎补充。