电子邮件是一个很重要的通讯工具,很多人都有自己的电子邮件,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账号的详细信息如下:
其中:_2_等价于@,这么写是为了防止这个电子邮件被“机器人”给抓去了。
这个人订阅了很多FreeBSD的邮件列表,并且给每个邮件列表建立一个邮箱来保存,以此来方便自己管理自己的电子邮件,并且这个人不喜欢编译太大的软件,在经过几次对Evolution的编译以及升级之后,决定放弃Evolution而转向Mutt,于是乎他选择了mutt+openssl+fetchmail+procmail+msmtp+vim+gnupg这个解决方案,为了实现这个解决方案,他需要进行一些配置工作。在配置完成后,他决定把整个过程整理一下并写在wiki上,于是就有了这个wiki页面。
SSL是Secure Socket Layer的缩写,本质上一个协议,或者说是一个保证连接安全性的机制。所谓协议就是一个文本,目前有许多这个协议的实现方案,在开源世界里面我们自然使用开源的实现方案:OpenSSL。谈到OpenSSL这个SSL实现,我们应该感谢Eric Young和Tim Hudson这两个程序员,因为是他们开发并实现了OpenSSL。
为了保证能正确的配置成功,需要简单地了解一下OpenSSL这个协议在建立连接时需要哪些步骤,也就是客户端和服务器建立连接时“握手”的基本过程。
总结一下:首先使用“非对称加密”,然后使用“对称加密”;第三方认证机构确保用户在“非对称加密”过程中使用正确的服务器“公钥”;在“对称加密”过程中使用的“对称密钥”由“非对称加密过程”来传递。
这是只是一个很简单的介绍,实际中连接的建立过程比这个要复杂一些,另外还可能有一些变化(用于减少服务器负担)。我看到过有人说SSL协议并不安全,我并没有仔细的研究过,但是从上面的“握手”过程来看,还是比较安全的,关于SSL的详细内容可以参考相关资料。
# 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
现在:系统已经知道了第三方认证在哪,邮件服务器的认证问题解决了。
由于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/Thawte_Premium_Server_CA.pem auth on user user_name password 123456 logfile /home/fender/mail/.msmtp.log
注意,写好配置文件以后要修改文件的权限:
$ chmod 600 .msmtprc
现在:发邮件的问题解决了。
# 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
现在:收邮件的问题解决了。
# 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的相关内容。
现在:分拣邮件的问题解决了。
# 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,否则没法知道哪个有新邮件。
# 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"
$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"
现在,打开一个虚拟终端,比如gnome-terminal,然后运行mutt,
欢迎补充。