5. 通过yum安装dovecot和配置dovecot

第4节中介绍了postfix的配置,并测试了postfix的发送邮件功能。你可以在服务器上使用mail命令来接受发送到本机域名用户邮箱中的邮件。但是你如果想使用MUA远程来接收邮件,那么则需要使用一个支持POP3/IMAP的服务来帮助MUA将邮箱中的邮件拉取到本地,比如dovecot。

通过yum安装dovecot:

[root@mail ~]# yum install dovecot

编辑/etc/dovecot/dovecot.conf文件,修改以下行:

[root@mail ~]# vi /etc/dovecot/dovecot.conf
protocols = pop3

如果想使用操作系统账号对收件人进行验证,则编辑/etc/dovecot/conf.d/10-auth.conf,修改以下行:

[root@mail conf.d]# vi /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login

如果需要远程使用MUA(如Outlook,Foxmail)来测试dovecot的收件功能,则修改/etc/dovecot/conf.d/10-auth.conf的如下行:

[root@mail conf.d]# vi /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no

否则,远程使用MUA接收邮件时,会弹出如下错误:

登录到接收邮件服务器(POP3): 由于其他电子邮件正被传送到你的邮箱,或者其他邮件应用程序正在访问它,你的邮箱暂时不可用。  响应服务器: -ERR [IN-USE] Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2016-01-05 11:23:21]

同时还要注意/etc/dovecot/conf.d/10-mail.conf中mail_location所指的路径对应的权限问题,如果MUA所使用的用户没有权限访问或者修改该目录内容,那么使用MUA接收邮件时,会弹出如下错误:

登录到接收邮件服务器(POP3): 由于其他电子邮件正被传送到你的邮箱,或者其他邮件应用程序正在访问它,你的邮箱暂时不可用。  响应服务器: -ERR [IN-USE] Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2016-01-05 11:23:21]

maillog中也会有如下错误打印:

[root@mail ~]# tail -f /var/log/maillog
Jan  5 11:23:21 mail dovecot: pop3(mailtest): Error: mkdir(/home/mailtest/mail/.imap/INBOX) failed: Operation not permitted
Jan  5 11:23:21 mail dovecot: pop3(mailtest): Error: Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2016-01-05 11:23:21]
Jan  5 11:23:21 mail dovecot: pop3(mailtest): Couldn't open INBOX top=0/0, retr=0/0, del=0/0, size=0

配置完成后,启动dovecot,由于配置了dovecot支持pop3,dovecot运行时将监听110(pop3)和 995(pop3s)端口:

[root@mail conf.d]# service dovecot start
Starting Dovecot Imap:                                     [  OK  ]
[root@mail conf.d]# netstat -tunlp | grep dovecot
tcp        0      0 0.0.0.0:110                 0.0.0.0:*                   LISTEN      21883/dovecot       
tcp        0      0 0.0.0.0:995                 0.0.0.0:*                   LISTEN      21883/dovecot

通过telnet访问110端口以及通过openssl访问995端口来测试dovecot的收件功能:

[root@mail ~]# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
+OK Dovecot ready.
USER mailtest
+OK
PASS mailtest
+OK Logged in.
LIST
+OK 4 messages:
1 623
2 623
3 623
4 623.
RETR 1
+OK 623 octets
Return-Path: 
X-Original-To: [email protected]
Delivered-To: [email protected]
...
QUIT 
+OK Logging out.
Connection closed by foreign host.
[root@mail home]# openssl s_client -connect 127.0.0.1:995
...
+OK Dovecot ready.
USER mailtest
+OKPASS mailtest
+OK Logged in.
LIST
+OK 4 messages:
1 623
2 623
3 623
4 623
...

也可以通过MUA进行远程收件测试。


6. 配置cyrus-sasl来支持对postfix的发件地址验证

第4节中实现了postfix的发件功能,但是此时postfix无法对发件地址进行验证,无论收件地址为什么,postfix都会尝试发送邮件,因此需要使用了一种来帮助postfix来完成对对发件地址的验证,比如cyrus-sasl。

RHEL6.5上默认安装了cyrus-sasl,要启用sasl对smtpd的支持,则要在/usr/lib64/sasl2/下新建smtpd.conf文件,并进行如下编辑:

[root@mail sasl2]# vi smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

编辑/etc/postfix/main.cf,加入如下配置参数:

[root@mail postfix]# vi main.cf
broken_sasl_auth_clients = yes    #是否启用sasl认证
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,
    reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,
    reject_unauth_pipelining,reject_unauth_destination    #认证策略
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_path = smtpd

如果要通过系统用户的登录密码来进行验证,则要编辑/etc/sysconfig/saslauthd的MECH参数(注:原有的PAM算法未验证):

[root@mail sysconfig]# vi saslauthd
MECH=shadow

重启postfix和cyrus-sasl,测试postfix+cyrus-sasl的发件地址验证功能:

[root@mail sysconfig]# service saslauthd restart
Stopping saslauthd:                                        [  OK  ]
Starting saslauthd:                                        [  OK  ]
[root@mail sysconfig]# postfix stop
postfix/postfix-script: stopping the Postfix mail system
[root@mail sysconfig]# postfix start
postfix/postfix-script: starting the Postfix mail system
[root@mail sysconfig]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mail.asika.com ESMTP Postfix
ehlo localhost
250-mail.asika.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN
334 VXNlcm5hbWU6    #Username base64位编码
bWFpbHRlc3Q=    #mailtest base64位编码
334 UGFzc3dvcmQ6    #Password base64位编码
bWFpbHRlc3Q=
235 2.7.0 Authentication successful
quit
221 2.0.0 Bye
Connection closed by foreign host.

下一篇文章将介绍编译安装courier-authlib,并配置其通过cyrus-sasl库访问mysql。