Linux下开源邮件系统Postfix+Extmail+Extman环境部署记录

 

一、基础知识梳理
MUA (Mail User Agent) 
MUA 既是"邮件使用者代理人",因为除非你可以直接利用类似 telnet 之类的软件登入邮件主机来主动发出信件,否则您就得要透过 MUA 来帮你送信到邮件主机上头去。 最常见的 MUA 像是 Mozilla 推出的Thunderbird ( 雷鸟 ) 自由软件, 或者是 Linux 桌面 KDE 常见的 Kmail ,及Windows 内件的 Outlook Express (OE) 等 。MUA 主要的功能就是收受邮件主机的电子邮件,以及提供用户浏览与编写邮件的功能!

MTA (Mail Transfer Agent)
MUA 帮用户传送邮件到邮件主机上,那这部邮件主机如果能够帮用户将这封信寄出去, 那它就是一部邮件传送主机 (MTA) 啦!这个 MTA 就是『邮件传送代理人』的意思。也来顾名思义一下,既然是『传送 代理人』, 那么使用者寄出的信,与使用者要收信时,就是找它 (MTA) 就对啦!基本上, MTA 的功能有这些:
1)收受信件:使用简单邮件传送协议 (SMTP)
MTA 主机最主要的功能就是将来自客户端或者是其它 MTA 的来信收下来,这个时候 MTA 使用的是 Simple Mail Transfer Protocol (SMTP) ,它使用的是25端口。
2) 转递信件
如果该封信件的目的地并不是本身用户,且该封信的相关数据符合使用 MTA 的权力, 那么MTA 就会将该封信再传送到下一部主机上。这即是所谓的转递 (Relay) 的功能。
3)响应使用者的收信要求
POP 或 IMAP 协定用户可以透过 MTA 主机提供的邮政服务协议 (Post Office Protocol, POP) 来收下自己的信件, 也可以透过IMAP (Internet Message Access Protocol) 协议将自己的信件保留在邮件主机上面, 并进一步建立邮件数据匣等进阶工作。

总之,一般提到的 Mail Server 就是 MTA !而严格来说, MTA 其实仅是指 SMTP 这个协议而已。 而达成 MTA的 SMTP 功能的主要套件包括老牌的 sendmail ,后起之秀的 postfix ,还有qmail等等。

MDA (Mail Delivery Agent) 
字面上的意思是『邮件递送代理人』的意思。事实上,这个 MDA 是挂在 MTA 底下的一个小程序, 最主要的功能就是: 分析由 MTA 所收到的信件表头或内容等数据, 来决定这封邮件的去向。 所以说,上面提到的MTA 的信件转递功能,其实是由 MDA 达成的。 举例来说,如果 MTA 所收到的这封信目标是自己,那么MDA 会将这封信给它转到使用者的信箱 (Mailbox) 去, 如果不是呢?那就准备要转递出去了。此外, MDA 还有分析与过滤邮件等功能喔!如:过滤垃圾邮件,自动回复,自动转发等……。

各主要的 MTA 程序 (sendmail,postfix...) 都有自己的 MDA 功能,不过有些外挂的程序功能更强大, 举例来说 procmail就是一个过滤的好帮手,另外 Mailscanner + Spamassassion 也是可以使用的一些 MDA 喔。

Mailbox 
就是电子邮件信箱!简单的说,就是某个账号专用的信件收受档案。我们的 Linux 系统默认的信箱都是放在 /var/spool/mail/ 使用者账号 中! 若 MTA 所收到的信件是本机的使用者, MDA 就会将信件送到该 mailbox 当中去!

POP3
(Post Office Protocol 3)即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

IMAP
Interactive Mail Access Protocol(交互式邮件存取协议)是由美国华盛顿大学所研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。无论是POP3还是IMAP都是描述如何从邮箱取出邮件。

请注意:POP3/IMAP和SMTP可以组建在不同的服务器上,经常使用MUA的用户肯定记得软件的设置中经常将POP3/IMAP和SMTP进行分开设置。

——————————SMTP、POP3、IPMAP三者说明——————————

简单来说:SMTP是邮件发送协议;POP3和IMAP是邮件接收协议。其中:

1)SMTP
全称是"Simple Mail Transfer Protocol",目标是向用户提供高效、可靠的邮件传输。它是一组用于由源地址到目的地址传送邮件的规则,
通过它来控制邮件的中转方式。SMTP协议属于TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

SMTP服务器就是遵循SMTP协议的发送邮件服务器。 SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 

增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。

2)POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。
它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的
邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的

3)IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子
邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应
的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

====================POP3和IMAP的区别====================
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了
邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

而IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
同时,IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、
发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。

总之:
IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件,但 IMAP 通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题。

注意:
若在web邮箱中设置了“保存到已发送”,使用客户端POP服务发信时,已发邮件也会自动同步到网页端“已发送”文件夹内。

网易163免费邮箱相关服务器信息:

 

Maildirs
Maildirs是使用非常广泛的e-mail邮件存储格式。也可以说是一种基于目录的邮件存储格式。它在添加,移动或删除时并不依赖于应用程序级的文件锁定来维护消息的完成性。每一个消息(每一封邮件)被保存在一个独立的且名称唯一的文件中。所有的更改均使用基于文件系统的原子操作(atomic filesystem operations )因此文件系统来控制文件锁定从而避免一致性问题。通常Maildir为一个目录(名称为Maildir)其下包含三个子目录,分别为tmp,new和cur。

Courier IMAP
Courier IMAP server 是使用Maildir存储格式的高速,可扩展,企业级 IMAP 服务器。许多E-mail提供商使用Courier IMAP server来处理几十万的邮件用户,使用它建立IMAP和POP3集合代理,可以说Courier IMAP server 简直具有无限的水平扩展能力。在代理配置环境中,一些Courier 服务器提供IMAP和POP3服务,它们等待客户端登陆请求,查找并操作邮件用户的mailbox,与服务器建立代理连接,所有的这些操作都在一个单独的,无缝连接的进程中。

Courier-IMAP主要特点:
- 小巧而高效;
- 提供多种用户认证模块和方式;
- 支持虚拟邮箱;
- 可限制IMAP同时登录的总数目及同一个IP地址同时登录的数目,能有效保护系统在受到拒绝服务(Denial-of-service)攻击时不致因超载而瘫痪;

maildrop
具有过滤功能的邮件投递代理(MDA)。

Courier-Authlib
Courier authentication library 为其他 Courier 应用程序提供验证服务。

SASL
SASL的英文全称是Simple Authentication and Security Layer,即简单验证和安全层。SMTP 协议并没有提供用户验证功能,很容易匿名中转邮件。即使限制了可以转发的网段,也不安全。他的定义是: a method for adding authentication support to connection-based protocols,为基于连接的协议提供认证功能。SASL是一个胶合(glue)库,通过这个库把应用层 与 形式多样的认证系统整合在一起。这有点类似于PAM,但是后者是认证方式,决定什么人可以访问什么服务,而SASL是认证过程,侧重于信任建立过程,这个过程可以调用PAM来建立信任关系。

Open-Relay是什么?
Open-Relay(开放转发或匿名转发)是指由于邮件服务器不理会邮件发送者或邮件接受者的是否为系统所设定的用户,而对所有的入站邮件一律进行转发(RELAY)的功能。通常,若邮件服务器的此功能开放,则我们一般称此邮件服务器是Open-Relay的。

由于Internet E-mail采用开放式标准,所以MTA、MDA、MUA等不同角色,可分别由许多不同的软件包来扮演。实现相同协议的不同包,可以彼此互相交流,而不管它们是在什么系统上运行。如果将一个完整的E-mail邮件系统集中在一起,可以发现的是处理SMTP的是一套软件,处理POP/IMAP的是另一套软件。但邮件系统中的每一种角色,都有许多不同的软件可以选择。

二、Postfix+Extmail+Extman环境部署过程
1)基础环境准备

[root@mail ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)

[root@mail ~]# ifconfig|grep addr|grep Bcast|cut -d":" -f2|awk -F" " '{print $1}'
192.168.10.202

[root@mail ~]# hostname                                                          
mail.kevin.com

[root@mail ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.202 mail.kevin.com

[root@mail ~]# /etc/init.d/iptables stop
[root@mail ~]# setenforce 0
[root@mail ~]# getenforce 
[root@mail ~]# cat /etc/sysconfig/selinux
......
SELINUX=disabled


软件部署说明
------------------------------------------------------------------------------
软件名称                  功能
Postfix                  MTA
MySQL                    存储postfix虚拟用户信息
courier-authlib          搭配SASL做验证
cyrus-sasl               把应用(E-Mail)与验证(courier-authlib)结合在一起
courier-imap             结合postfix提供imap/imaps与pop3/pop3s服务
perl                     解释器
pcre                     安装Imap需要-- Perl兼容正则表达式
httpd                    web服务器
Extmail                  webmail服务器
Extman                   结合extmail管理邮件用户
Clamav                   杀毒软件
amavisd-new              扫描邮件病毒
Spamassassin             防垃圾邮件

2)软件下载

web服务器软件
这里我安装了LAMP环境,其实只需要http、mysql,不需要php。
LAMP安装包下载地址:https://pan.baidu.com/s/1pYo9X7f1vy5d70eV0RDYWA
提取密码:ebj8

邮件服务器软件
相关软件下载地址:https://pan.baidu.com/s/1Ai6FlJoUzeWGLXjGjeV0sg
提取密码:c4ft

3)LAMP环境安装
安装文档:http://www.cnblogs.com/kevingrace/p/6395131.html

apache的配置
下载地址:https://pan.baidu.com/s/1f8kMhADiOzAYqxv990136g
提取密码:g1vy


[root@mail extra]# pwd
/usr/local/apache/conf/extra

[root@mail extra]# cat extmail.conf 
<VirtualHost *:80>
ServerName mail.kevin.com
DocumentRoot /data/web/
</VirtualHost>

[root@mail extra]# cat /data/web/test.php 
<?php
phpinfo()
?>

如上,在后面的extmail和extman还没安装之前,extmail.conf配置暂时如上所示内容,这样便于进行httpd服务的测试。

解析mail.kevin.com到192.168.10.202机器上(或做hosts绑定),然后访问http://mail.kevin.com/test.php即可测试!

待安装完extmail和extman之后,上面的extmail.conf文件配置如下:
[root@mail extra]# cat extmail.conf       
<VirtualHost *:80>
ServerName mail.kevin.com
DocumentRoot /data/web/
ScriptAlias /extmail/cgi  /data/web/extmail/cgi
ScriptAlias /extman/cgi  /data/web/extman/cgi
Alias /extmail  /data/web/extmail/html
Alias /extman  /data/web/extman/html
</VirtualHost>

4)Mysql安装
安装文档:http://www.cnblogs.com/kevingrace/p/6109679.html
mysql一键安装脚本下载地址:https://pan.baidu.com/s/1oRePULz4gu_y7oFuc4mB9A          提取密码:bhcw

安装mysql的时候,要卸载系统自带的mysql,但要记住,最好不要卸载mysql-libs
[root@mail ~]# rpm -qa | grep mysql
mysql-libs-5.1.73-8.el6_8.x86_64

如果卸载了mysql-libs,那么就会把默认的libmysqlclient.so.16库文件删除,而编译安装的mysql,库文件是libmysqlclient.so.18。
但是登录extmail时会依赖libmysqlclient.so.16这个库文件,这样就会报如下错:
install_driver(mysql) failed: Can't load '/usr/lib64/perl5/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.16: 
cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200. at (eval 17) line 3 Compilation 
failed in require at (eval 17) line 3. Perhaps a required shared library or dll isn't installed where expected at 
/data/web/extmail/libs/Ext/Auth/MySQL.pm line 45

这时候解决办法:https://www.cnblogs.com/kevingrace/p/9378776.html
其实也就是重新安装mysql,重新生成libmysqlclient.so.16库文件。

所以最好还是不要删除mysql-libs,免得后面再重新安装自带的mysql,重新生成libmysqlclient.so.16的库文件。

5)创建相关用户

用户      组        简介                            备注
mysql    mysql     mysql用户和组                    安装mysql时创
vmail    vmail     Postfix虚拟账户所使用的用户和组     无home目录不可能登陆系统。uid: 1001,gid: 1001
无       postdrop  Postfix专用组                    该组不能包含任何成员,包括前面的postfix虚拟帐号也不例外。gid:1002
postfix  postfix   Postfix主程序使用的用户和组        uid:1000,gid:1000
clamav   clamav    clamav 杀毒软件用户               无
amavis   amavis    邮件扫描用户                      无
------------------------------------------------------------------------------------

[root@mail ~]# groupadd -g 1001 vmail
[root@mail ~]# useradd -g 1001 -u 1001 -s /sbin/nologin -M vmail
[root@mail ~]# groupadd -g 1002 postdrop
[root@mail ~]# yum remove postfix
[root@mail ~]# userdel -r postfix
[root@mail ~]# groupadd -g 1000 postfix 
[root@mail ~]# useradd -g 1000 -u 1000 -s /sbin/nologin -M postfix
[root@mail ~]# useradd clamav
[root@mail ~]# useradd amavis

6)卸载系统中相关软件

如果系统自带了postfix,就卸载了(上面已卸载)
[root@mail ~]# yum remove postfix
[root@mail ~]# userdel -r postfix

接着卸载sendmail
CentOS系统安装后,默认是装好了Sendmail服务,其目的是为root用户发送一些有用的信息。那么,在安装Postfix之前一定要先卸载Sendmail。
[root@mail ~]# service sendmail stop
[root@mail ~]# rpm -qa | grep sendmail
sendmail-8.13.8-2.el5
[root@mail ~]# rpm -e --nodeps sendmail-8.13.8-2.el5

卸载sasl
[root@mail ~]# rpm -qa |grep sasl
cyrus-sasl-lib-2.1.22-4
cyrus-sasl-devel-2.1.22-4
cyrus-sasl-2.1.22-4
cyrus-sasl-plain-2.1.22-4
[root@mail ~]# rpm -e --nodeps cyrus-sasl-lib-2.1.22-4 cyrus-sasl-devel-2.1.22-4 cyrus-sasl-2.1.22-4 cyrus-sasl-plain-2.1.22-4

7)配置相关系统环境

[root@mail ~]# vim /etc/ld.so.conf
......
/usr/local/lib
/usr/local/mysql/lib/
/usr/lib64/

[root@mail ~]# ldconfig

8)创建相应目录

虚拟用户的邮件存放路径
[root@mail ~]# mkdir -p /var/mailbox
[root@mail ~]# chown vmail.vmail /var/mailbox
[root@mail ~]# chmod 700 /var/mailbox

apache的base目录
[root@mail ~]# mkdir -p /data/web
[root@mail ~]# chown vmail.vmail /data/web

extman的临时目录
[root@mail ~]# mkdir /tmp/extman
[root@mail ~]# chown vmail.vmail /tmp/extman

clamav临时目录
[root@mail ~]# mkdir -p /dev/shm/clamav/tmp
[root@mail ~]# chown -R amavis.amavis /dev/shm/clamav/
[root@mail ~]# echo " mkdir -p /dev/shm/clamav/tmp" >>/etc/rc.local
[root@mail ~]# echo " chown -R amavis.amavis /dev/shm/clamav/" >>/etc/rc.local

9)安装必要组件

先安装epel源(百度云盘下载地址:https://pan.baidu.com/s/1JucsbDuYwedEb4kGvN6MPg     提取密码:pxn7)
[root@mail ~]# cd /usr/local/src/
[root@mail src]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
[root@mail src]# rpm -ivh epel-release-latest-6.noarch.rpm

[root@mail src]# yum install perl-Unix-Syslog perl-DBI perl-Class-DBI-mysql perl-DBD-MySQL rrdtool perl-rrdtool perl-File-Tail perl-IO-stringy perl-MIME-* perl-Net-Server perl-BerkeleyDB perl-Crypt-* perl-Mail-DKIM perl-Convert-TNEF perl-Convert-UUlib perl-Archive-Zip

===============================================================
在使用yum过程中,遇到下面问题:
libsasl2.so.2: cannot open shared object file: No such file or directory

这是因为在上面已经提前卸载了cyrus-sasl-lib所致!
解决办法:
从别的机器上拷贝这个库文件到本机上

比如从192.168.10.201机器上拷贝到本机:
[root@localhost ~]# find / -name libsasl2.so.2           
/usr/lib64/libsasl2.so.2
[root@localhost ~]# ll /usr/lib64/libsasl2.so.2          
lrwxrwxrwx. 1 root root 18 Jan 16  2018 /usr/lib64/libsasl2.so.2 -> libsasl2.so.2.0.23
[root@localhost ~]# ll /usr/lib64/libsasl2.so.2.0.23
-rwxr-xr-x. 1 root root 108728 Mar 25  2015 /usr/lib64/libsasl2.so.2.0.23

[root@localhost ~]# rsync -e "ssh -p22" -avpgolr /usr/lib64/libsasl2.so.2.0.23 root@192.168.10.202:/usr/lib64/
[root@localhost ~]# rsync -e "ssh -p22" -avpgolr /usr/lib64/libsasl2.so.2 root@192.168.10.202:/usr/lib64/

到本机上查看:
[root@mail ~]# ll /usr/lib64/libsasl2.so.2        
lrwxrwxrwx. 1 root root 18 Jan 16  2018 /usr/lib64/libsasl2.so.2 -> libsasl2.so.2.0.23

再次使用yum就正常了!
===============================================================

10)安装配置courier-authlib

[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -jvxf courier-authlib-0.62.4.tar.bz2 
[root@mail src]# cd courier-authlib-0.62.4
[root@mail courier-authlib-0.62.4]# ./configure --prefix=/usr/local/courier-authlib --with-mailuser=vmail --with-mailgroup=vmail --with-mysql-libs=/usr/local/mysql/lib/mysql --with-mysql-includes=/usr/local/mysql/include/mysql --without-stdheaderdir
[root@mail courier-authlib-0.62.4]# make && make install
[root@mail courier-authlib-0.62.4]# make install-configure
[root@mail courier-authlib-0.62.4]# ln -s /usr/local/courier-authlib/bin/courierauthconfig /usr/bin/

说明:
在指定编译选项时需要指定mysql的include位置和lib位置,由于我mysql是源码安装的,所以这里一定要使用--with-mysql-includes和
--with-mysql-includes参数指定。--without-stdheaderdir 参数是说将头文件安装到我自己制定的目录中,而非编译器找到的默认目录中。

===================需要注意===================
如果courier-authlib安装到非标准位置(例如安装到/usr/local下),一定记得在./configure时增加-- without-stdheaderdir,
这样以后在编译Courier-IMAP和maildrop的时候,不用特别指定courier- authlib的库文件位置

--------------------------------------------------------------------------------------------------
安装完成后需要修改/usr/local/courier-authlib/etc/authlib/目录下的authdaemonrc 和 authmysqlrc 文件

authdaemonrc这个文件时告诉courier-authlib要使用什么验证方法
[root@mail courier-authlib-0.62.4]# vim /usr/local/courier-authlib/etc/authlib/authdaemonrc
.......
# 验证模块只保留mysql
#authmodulelist="authuserdb authpam authmysql authcustom authpipe"
authmodulelist="authmysql"
.......
#authmodulelistorig="authuserdb authpam authmysql authcustom authpipe"
authmodulelistorig="authmysql"
......
# 打开debug日志和包括记录验证密码,有助于以后的排错
#DEBUG_LOGIN=0
DEBUG_LOGIN=2

--------------------------------------------------------------------------------------------------
authmysqlrc这个文件是courier-authlib程序通过mysql验证时需要访问数据库的信息。
[root@mail courier-authlib-0.62.4]# vim /usr/local/courier-authlib/etc/authlib/authmysqlrc
......
# mysql数据库地址
MYSQL_SERVER 192.168.10.202

# 访问数据库的用户名
MYSQL_USERNAME extmail

# 访问数据库的密码
MYSQL_PASSWORD extmail

# mysql 的socket路径
MYSQL_SOCKET /usr/local/mysql/var/mysql.sock

# mysql开放的端口
MYSQL_PORT 3306

# 进行验证的数据库是哪个。这个在后面安装extmail会有介绍
MYSQL_DATABASE extmail

# 进行验证时要访问那个表
MYSQL_USER_TABLE mailbox

# 取出密码的字段是哪个
MYSQL_CRYPT_PWFIELD password

# 默认域名
DEFAULT_DOMAIN kevin.com

# 这里设定mail虚拟帐号的uid
MYSQL_UID_FIELD '1001'

# 虚拟帐号的gid
MYSQL_GID_FIELD '1001'

# 登录名从哪个字段中取得
MYSQL_LOGIN_FIELD username

# 邮件存放路径在哪里,这里是根目录。
MYSQL_HOME_FIELD '/var/mailbox/'

# 邮件账户的描述信息字段
MYSQL_NAME_FIELD name

# 邮件账户的详细邮件目录,从maildir字段中取得。
MYSQL_MAILDIR_FIELD maildir

# MYSQL_USER_TABLE 表中的quota字段,这里concat函数取出S之前的字符
MYSQL_QUOTA_FIELD concat(quota,'S')

# 这里定义SQL语句中where的条件
MYSQL_WHERE_CLAUSE active='1'


===================需要注意===================
默认域名可有可无,如果设置了默认域名,则在courier-authlib连接mysql验证时如果用户只指定了username为test的话,则程序会自动
加上这里设置的默认域名,否则必须指定用户名为test@example.com。这里看来还是设置默认域名比较方便。在设置多个虚拟域名的时候,
主域名的用户可以不用输入完整的用户邮箱,其他虚拟域则必须设置完整的邮件地址。


配置好之后的文件,即如下:
[root@mail courier-authlib-0.62.4]# cat /usr/local/courier-authlib/etc/authlib/authmysqlrc|grep -v "#"|grep -v "^$"
MYSQL_SERVER            192.168.10.202
MYSQL_USERNAME          extmail
MYSQL_PASSWORD          extmail
MYSQL_SOCKET            /usr/local/mysql/var/mysql.sock
MYSQL_PORT              3306
MYSQL_OPT               0
MYSQL_DATABASE          extmail
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password
DEFAULT_DOMAIN          kevin.com
MYSQL_UID_FIELD         1001
MYSQL_GID_FIELD         1001
MYSQL_LOGIN_FIELD       username
MYSQL_HOME_FIELD        '/var/mailbox'
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir
MYSQL_QUOTA_FIELD       concat(quota,'S')
MYSQL_WHERE_CLAUSE active='1'

加入启动项(切换到源码目录下)
[root@mail courier-authlib-0.62.4]# pwd
/usr/local/src/courier-authlib-0.62.4
[root@mail courier-authlib-0.62.4]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib
[root@mail courier-authlib-0.62.4]# chmod 755 /etc/init.d/courier-authlib
[root@mail courier-authlib-0.62.4]# chkconfig --add courier-authlib
[root@mail courier-authlib-0.62.4]# service courier-authlib start
Starting Courier authentication services: authdaemond
[root@mail courier-authlib-0.62.4]# 

修改authdaemon 的socket目录权限
如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证:
[root@mail courier-authlib-0.62.4]# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
[root@mail courier-authlib-0.62.4]# ll -d /usr/local/courier-authlib/var/spool/authdaemon
drwxr-xr-x. 2 vmail vmail 4096 Jul 29 02:49 /usr/local/courier-authlib/var/spool/authdaemon
[root@mail courier-authlib-0.62.4]# 

系统集成
[root@mail courier-authlib-0.62.4]# ln -s /usr/local/courier-authlib/lib/courier-authlib/* /usr/lib
[root@mail courier-authlib-0.62.4]# echo "/usr/lib" >> /etc/ld.so.conf
[root@mail courier-authlib-0.62.4]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/mysql/lib/
/usr/lib64/
/usr/lib
[root@mail courier-authlib-0.62.4]# ldconfig 

11)安装/配置Cyrus-SASL2

编译安装
[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -zvxf cyrus-sasl-2.1.23.tar.gz 
[root@mail cyrus-sasl-2.1.23]# ./configure --disable-anon --disable-gssapi --disable-sample --disable-digest --enable-plain --enable-login --enable-sql --with-mysql=/usr/local/mysql --with-authdaemond=/usr/local/courier-authlib/var/spool/authdaemon/socket
[root@mail cyrus-sasl-2.1.23]# make && make install

特别注意:
--with-authdaemond标出的部分为先前安装的courier-authlib启动之后的socket文件位置。一定要指定,否则sasl无法和authdaemon连接!

--------------------------------------------------------------------------------------------
make安装的时候,可能报如下错误:

1)error: mysql.h: No such file or directory
报错信息大致如下:
......
sql.c:65:19: error: mysql.h: No such file or directory
sql.c: In function '_mysql_open':
......
make[2]: *** [sql.lo] Error 1
make[2]: Leaving directory `/usr/local/src/cyrus-sasl-2.1.23/plugins'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/src/cyrus-sasl-2.1.23'
make: *** [all] Error 2

解决办法:
在你的mysql的安装路径:/usr/local/mysql/include/mysql 下面看看有没有 .h的文件,没有的话,在mysql是上一层目录中,有这些文件,
拷贝一份到mysql下
[root@mail ~]# cd /usr/local/mysql/include/mysql
[root@mail mysql]# ll mysql.h   
-rw-r--r--. 1 root root 29129 Jul 29 02:59 mysql.h
[root@mail mysql]# ll ../mysql.h
-rw-r--r--. 1 mysql mysql 29129 Dec  9  2017 ../mysql.h
[root@mail mysql]# cd ../
[root@mail include]# \cp -f *.h mysql/
[root@mail include]# ll mysql.h       
-rw-r--r--. 1 mysql mysql 29129 Dec  9  2017 mysql.h

然后再接着make && make install编译安装就成功了!

2)error: des.h: No such file or direcctory
报错信息大致如下:
auth_getpwent.c:48:20: error: des.h: No such file or direcctory 
make[3]: *** [auth_getpwent.o] Error 1
make[3]: Leaving directory '/usr/local/src/cyrus-sasl-2.1.23/saslauthd/'
make[2]: *** [all] Error 2

这个错误的原因是没有找到des.h头文件导致的,处理的方法很简单,就是将cyrus-sasl源码包文件夹下面的mac路径里的des.h文件拷到错误提示的路径下!

解决办法:
[root@mail cyrus-sasl-2.1.23]# pwd
/usr/local/src/cyrus-sasl-2.1.23
[root@mail cyrus-sasl-2.1.23]# cp mac/libdes/public/des.h /usr/local/src/cyrus-sasl-2.1.23/saslauthd/
--------------------------------------------------------------------------------------------

系统集成
[root@mail cyrus-sasl-2.1.23]# ln -s /usr/local/lib/sasl2/ /usr/lib/
[root@mail cyrus-sasl-2.1.23]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/mysql/lib/
/usr/lib64/
/usr/lib
[root@mail cyrus-sasl-2.1.23]# ldconfig 

[root@mail cyrus-sasl-2.1.23]# ldconfig -v | grep sasl
ldconfig: Path `/usr/lib' given more than once
ldconfig: Path `/usr/lib64' given more than once
        libsasl2.so.2 -> libsasl2.so.2.0.23
        libcourierauthsasl.so -> libcourierauthsasl.so.0
        libcourierauthsaslclient.so -> libcourierauthsaslclient.so.0

配置
Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息,这里我们需要配置smtp的验证,后续的还需要修改postfix的main.cf文件。
这里就先不做说明,等到了配置postfix的时候再说下如何配置postfix的smtp认证的配置。

在/usr/local/lib/sasl2/目录下创建smtpd.conf文件并添加如下内容
[root@mail cyrus-sasl-2.1.23]# ll /usr/local/lib/sasl2/smtpd.conf
ls: cannot access /usr/local/lib/sasl2/smtpd.conf: No such file or directory
[root@mail cyrus-sasl-2.1.23]# touch /usr/local/lib/sasl2/smtpd.conf
[root@mail cyrus-sasl-2.1.23]# vim /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
log_level: 3

authdaemond_path: /usr/local/courier-authlib/var/spool/authdaemon/socket

12)Postfix安装/配置

[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -zvxf postfix-2.8.7.tar.gz
[root@mail src]# cd postfix-2.8.7
[root@mail postfix-2.8.7]# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/local/lib -lsasl2'
[root@mail postfix-2.8.7]# make && make install

编译完成后程序会自动进入交互状态,等待用户的输入,一般情况下,一路回车即可完成所有的安装。
----------------------------------------------------------------------------------------------
可能报错如下:
bin/postconf: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
......
postfix-install: Error: "" should be "no" or an absolute path name.
make: *** [install] Error 1

解决办法:
[root@mail postfix-2.8.7]# find / -name libpcre.so.1
/usr/local/lib/libpcre.so.1                      #如果没有,就执行"yum install -y pcre pcre-devel"(其实在安装LAMP时已编译安装了pcre)

然后放到.so库的引用文件里:
[root@mail postfix-2.8.7]# echo "/usr/local/lib/" >> /etc/ld.so.conf
[root@mail postfix-2.8.7]# cat /etc/ld.so.conf                      
include ld.so.conf.d/*.conf
/usr/local/mysql/lib/
/usr/lib64/
/usr/lib
/usr/local/lib/
[root@mail postfix-2.8.7]# ldconfig 

最后再执行即可成功了!
[root@mail postfix-2.8.7]# make && make install
----------------------------------------------------------------------------------------------
注意: 
make的参数可以参考postfix源码目录下README_FILES文件夹中的INSTALL、MYSQL_README、SASL_README 文件。

接着生成别名二进制文件
下面这条命令的作用就是将/etc/alias 文件利用工具转为postfix可以读取的二进制文件,存为/etc/postfix/ aliases
[root@mail postfix-2.8.7]# /usr/bin/newaliases

验证安装的Postfix是否支持SASL、MySQL
[root@mail postfix-2.8.7]# postconf -a
cyrus
dovecot
[root@mail postfix-2.8.7]# postconf -m
btree
cidr
environ
hash
internal
mysql
nis
pcre
proxy
regexp
static
tcp
texthash
unix

需要注意的是:
-- 如果没有显示出cyrus项说明你的postfix不支持SASL,需要检查但前系统是否将libsasl库加入到系统中,利用ldconfig -v | grep 查看。
   如果没有libsasl2.so.2 -> libsasl2.so.2.0.23 需要将/usr/local/lib目录添加到/etc/ld.so.conf文件中然后再执行ldconfig命令使其生效。
-- 如果没有mysql项说明postfix不支持mysql协议的查询,肯定是编译时mysql的目录指定错误,重新查看mysql的lib目录和include目录的确切
   位置后重新编译安装postfix

Postfix配置
先不着急进行Postfix的配置,这个放到最后等courier-imap、maildrop、extmail安装完成之后做统一的配置。

创建虚拟用户验证配置文件的目录
由于虚拟用户是结合mysql进行验证的,postfix的配置文件中可以针对虚拟用户进行配置的定义,该目录就是存储mysql验证的配置文件。
后文extman配置时会介绍。这里先创建相应目录。
[root@mail postfix-2.8.7]# mkdir -p /etc/postfix/mysql

创建postfix启动daemon控制脚本
[root@mail postfix-2.8.7]# ll /etc/init.d/postfix 
ls: cannot access /etc/init.d/postfix: No such file or directory
[root@mail postfix-2.8.7]# vim /etc/init.d/postfix
#!/bin/sh
#
# postfix Postfix Mail Transfer Agent
#
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
# that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
#
# $Revision: 2.4 $
#
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/sbin/postfix ] || exit 0
[ -d /etc/postfix ] || exit 0
[ -d /var/spool/postfix ] || exit 0
RETVAL=0
start() {
# Start daemons.
echo -n "Starting postfix: "
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n "Shutting down postfix: "
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
reload() {
echo -n "Reloading postfix: "
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure
RETVAL=$?
echo
return $RETVAL
}
restart() {
stop
start
}
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure
return $?
}
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure
return $?
}
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure
return $?
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
abort)
abort
;;
flush)
flush
;;
check)
check
;;
status)
status master
;;
condrestart)
# don't use /var/lock/subsys/postfix, check for postfix running directly
daemon_directory=$(postconf -h daemon_directory)
$daemon_directory/master -t 2>/dev/null && : || restart
;;
*)
echo "Usage: postfix {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
exit $?


添加服务,指定自动启动
[root@mail postfix-2.8.7]# chmod +x /etc/init.d/postfix
[root@mail postfix-2.8.7]# chkconfig --add postfix
[root@mail postfix-2.8.7]# chkconfig postfix on

13)安装/配置 courier-imap

[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -jvxf courier-imap-4.5.1.tar.bz2 && cd courier-imap-4.5.1
[root@mail courier-imap-4.5.1]# ./configure --prefix=/usr/local/courier-imap --with-redhat --disable-root-check --enable-unicode=utf-8,iso-8859-1,gb2312,gbk,gb18030 --with-trashquota --with-dirsync --with-mysql-libs=/usr/local/mysql/lib/mysql --with-mysql-includes=/usr/local/mysql/include/mysql --with-authmysql --with-authmysql=yes CPPFLAGS='-I/usr/local/courier-authlib/include' LDFLAGS='-L/usr/local/courier-authlib/lib/courier-authlib' COURIERAUTHCONFIG='/usr/local/courier-authlib/bin/courierauthconfig'

[root@mail courier-imap-4.5.1]# make && make install && make install-configure
[root@mail courier-imap-4.5.1]# cp courier-imap.sysvinit /etc/rc.d/init.d/imapd
[root@mail courier-imap-4.5.1]# chmod 755 /etc/rc.d/init.d/imapd
[root@mail courier-imap-4.5.1]# chkconfig --add imapd
[root@mail courier-imap-4.5.1]# chkconfig imapd on


配置
[root@mail courier-imap-4.5.1]# vim /usr/local/courier-imap/etc/imapd
......
IMAPDSTART=YES

[root@mail courier-imap-4.5.1]# vim /usr/local/courier-imap/etc/pop3d
......
POP3DSTART=YES

启动服务
[root@mail courier-imap-4.5.1]# service imapd start
Starting Courier-IMAP server: imap pop3
[root@mail courier-imap-4.5.1]# netstat -tulnp | egrep "110|143"
tcp        0      0 :::110                      :::*                        LISTEN      12045/couriertcpd   
tcp        0      0 :::143                      :::*                        LISTEN      12039/couriertcpd  

14)安装配置maildrop

编译安装pcre(这个在之前部署LAMP的时候就已经安装了)

编译安装maildrop
[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -jvxf maildrop-2.2.0.tar.bz2 
[root@mail src]# cd maildrop-2.2.0
[root@mail maildrop-2.2.0]# ./configure --enable-sendmail=/usr/sbin/sendmail --enable-trusted-users='root vmail' --enable-syslog=1 --enable-maildirquota --enable-maildrop-uid=1001 --enable-maildrop-gid=1001 --with-trashquota --with-dirsync
[root@mail maildrop-2.2.0]# make && make install

需要注意:
./configure --help 查看的编译选项不全,查看目录下的INSTALL文件获得更多的编译选项。

验证安装
[root@mail maildrop-2.2.0]# maildrop -v
maildrop 2.1.0 Copyright 1998-2005 Double Precision, Inc.
GDBM/DB extensions enabled.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.

如果没有显示Courier Authentication Library extension enabled.说明你的maidrop还不支持courier auth,请仔细检查,
重新编译maildrop建议不要自定义目录安装,可以减少不必要的麻烦,删除很方便:直接在已经编译的源代码目录 make uninstall

知道maildrop把邮件移动到哪个用户目录还是非常有必要的,这个操作就是maildrop的日志记录。这里我们创建一个新文件
/etc/maildroprc,这个文件就2行内容:如果加入反SPAM,需要更改以下内容:
[root@mail maildrop-2.2.0]# vim /etc/maildroprc
logfile "/var/log/maildrop.log" 
to "$HOME/$DEFAULT"

需要注意:
/etc/maildroprc 文件为maildrop工作在投递模式下的全局过滤说明文档。详细的配置说明可以参考 man maildropfilter 文档。

[root@mail maildrop-2.2.0]# touch /var/log/maildrop.log;chown vmail.vmail /var/log/maildrop.log
[root@mail maildrop-2.2.0]# ll /var/log/maildrop.log
-rw-r--r--. 1 vmail vmail 0 Jul 29 06:13 /var/log/maildrop.log

15)安装extmail与extman

安装extmail
[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -zvxf extmail-1.1.0.tar.gz 
[root@mail src]# mv extmail-1.1.0 /data/web/
[root@mail src]# mv /data/web/extmail-1.1.0 /data/web/extmail
[root@mail src]# chown vmail.vmail -R /data/web
[root@mail src]# cd /data/web/extmail/
[root@mail extmail]# cp -p webmail.cf.default webmail.cf

配置extmail
[root@mail extmail]# vim webmail.cf
SYS_CONFIG = /data/web/extmail/
SYS_LANGDIR = /data/web/extmail/lang

SYS_TEMPLDIR = /data/web/extmail/html

# web页面登陆语言设置
SYS_USER_LANG = zh_CN

#虚拟用户mail存放的根目录
SYS_MAILDIR_BASE = /var/mailbox

# 关于数据库的设置,根据实际情况设置
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = 192.168.10.202

SYS_MYSQL_SOCKET = /usr/local/mysql/var/mysql.sock

# courier-authlib验证程序socket位置
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket

# 全局联系人配置文件位置
SYS_G_ABOOK_FILE_PATH = /data/web/extmail/globabook.cf

---------------------------------------------------------------------------

安装extman
[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -zvxf extman-0.2.5.tar.gz 
[root@mail src]# mv extman-0.2.5 /data/web/
[root@mail src]# mv /data/web/extman-0.2.5 /data/web/extman
[root@mail src]# chown -R vmail.vmail /data/web/

配置extman
[root@mail src]# sed -i 's/extmail.org/kevin.com/g' /data/web/extman/docs/init.sql
[root@mail src]# cd /data/web/extman/
[root@mail extman]# vim webman.cf
SYS_CONFIG = /data/web/extman/

SYS_LANGDIR = /data/web/extman/lang

SYS_TEMPLDIR = /data/web/extman/html

SYS_MAILDIR_BASE = /var/mailbox

# sys_sess_dir, the session dir

SYS_SESS_DIR = /tmp/extman/

SYS_CAPTCHA_ON = 0                         #不需要认证码

SYS_GROUPMAIL_SENDER = postmaster@kevin.com

# sys_default_uid, if not set, webman will ignore it

SYS_DEFAULT_UID = 1001

# sys_default_gid, if not set, webman will ignore it

SYS_DEFAULT_GID = 1001

# 数据库相关设置

SYS_MYSQL_USER = extman

SYS_MYSQL_PASS = extman

SYS_MYSQL_DB = extmail

SYS_MYSQL_HOST = 192.168.10.202

SYS_MYSQL_SOCKET = /usr/local/mysql/var/mysql.sock


修改extmail创建表的mysql语句
[root@mail extman]# sed -i 's/TYPE=MyISAM/ENGINE=InnoDB DEFAULT CHARSET=utf8/g' /data/web/extman/docs/extmail.sql

初始化数据库(mysql5.6.39在之前已经编译安装了,密码为123456)
[root@mail extman]# mysql -u root -p123456 </data/web/extman/docs/extmail.sql
[root@mail extman]# mysql -u root -p123456 </data/web/extman/docs/init.sql

登录mysql查看是否已经导入数据了:
[root@mail extman]# mysql -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 764
Server version: 5.6.39-log Source distribution

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| extmail            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use extmail;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_extmail |
+-------------------+
| alias             |
| domain            |
| domain_manager    |
| mailbox           |
| manager           |
+-------------------+
5 rows in set (0.00 sec)

mysql> 

需要注意:
通过仔细的查看extmail.sql 文件,发现其sql语句中已经有添加用户的操作。
因此,下面的通过grant命令来创建用户并指定权限的操作可以省略。
另外可以根据需要修改extmail.sql中用户的配置。但修改之后一定要将extmail/extman的配置也同步修改。

将虚拟用户验证配置文件复制到/etc/postfix/mysql目录中
[root@mail extman]# cp /data/web/extman/docs/mysql_virtual_* /etc/postfix/mysql/

注意:这些文件是postfix的配置相关文件,其所有者必须为root。
[root@mail extman]# ll /etc/postfix/mysql/
total 20
-rw-r--r--. 1 root root 166 Jul 29 07:00 mysql_virtual_alias_maps.cf
-rw-r--r--. 1 root root 168 Jul 29 07:00 mysql_virtual_domains_maps.cf
-rw-r--r--. 1 root root 170 Jul 29 07:00 mysql_virtual_limit_maps.cf
-rw-r--r--. 1 root root 172 Jul 29 07:00 mysql_virtual_mailbox_maps.cf
-rw-r--r--. 1 root root 173 Jul 29 07:00 mysql_virtual_sender_maps.cf

针对extmail/extman 对mysql的配置
mysql> grant all on extmail.* to extmail@'192.168.10.202' identified by 'extmail';         
Query OK, 0 rows affected (0.03 sec)

mysql> grant all on extmail.* to extman@'192.168.10.202' identified by 'extman';         
Query OK, 0 rows affected (0.18 sec)

mysql> 


针对extmail/extman 对apache所做的配置
[root@mail extman]# vim /usr/local/apache/conf/httpd.conf
......
DirectoryIndex index.html index.cgi index.htm index.php index.html.var

[root@mail extman]# vim /usr/local/apache/conf/extra/extmail.conf
<VirtualHost *:80>
ServerName mail.kevin.com
DocumentRoot /data/web/
ScriptAlias /extmail/cgi  /data/web/extmail/cgi
ScriptAlias /extman/cgi  /data/web/extman/cgi
Alias /extmail  /data/web/extmail/html
Alias /extman  /data/web/extman/html
</VirtualHost>

重启apache服务
[root@mail extman]# /usr/local/apache/bin/httpd -k restart
[root@mail extman]# lsof -i:80
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   12744 vmail    4u  IPv6 323890      0t0  TCP *:http (LISTEN)
httpd   12745 vmail    4u  IPv6 323890      0t0  TCP *:http (LISTEN)
httpd   12746 vmail    4u  IPv6 323890      0t0  TCP *:http (LISTEN)
httpd   12747 vmail    4u  IPv6 323890      0t0  TCP *:http (LISTEN)
httpd   12748 vmail    4u  IPv6 323890      0t0  TCP *:http (LISTEN)
httpd   28707  root    4u  IPv6 323890      0t0  TCP *:http (LISTEN)

16)测试extmail/extman
解析mail.kevin.com到192.168.10.202机器上(或做hosts绑定),访问http://mail.kevin.com/extmail/,如下图所示,注意选择的是"登录邮箱管理"这一项,进入邮箱管理后台界面。默认用户名和密码分别是root@kevin.comextmail*123*

如果忘记了管理员密码,则使用下面命令密码重新修改为"extmail*123*"的初始默认密码!

mysql> update manager set password='$1$BrT9qxfB$Ha81Mb5YVV6rNKNN5jmtj1' where username= "root@kevin.com";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select username,password from manager;
+----------------------------+------------------------------------+
| username                   | password                           |
+----------------------------+------------------------------------+
| root@kevin.com | $1$BrT9qxfB$Ha81Mb5YVV6rNKNN5jmtj1 |
+----------------------------+------------------------------------+
1 row in set (0.00 sec)

mysql> flush privileges;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

登录的时候,可能会有报错,总结如下:

报错1:
Can't locate CGI.pm in @INC (@INC contains: /data/web/extmail/libs /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl 
/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at /data/web/extmail/libs/Ext/CGI.pm line 20. BEGIN failed--compilation aborted at /data/web/extmail/libs/Ext/CGI.pm line 20. Compilation failed in require at /data/web/extmail/libs/Ext/App.pm line 23. BEGIN failed--compilation aborted at /data/web/extmail/libs/Ext/App.pm line 23. Compilation failed in require at /data/web/extmail/libs/Ext/App/Login.pm line 16. BEGIN failed--compilation aborted at /data/web/extmail/libs/Ext/App/Login.pm line 16. Compilation failed in require at /data/web/extmail/cgi/index.cgi line 20.

解决办法:
[root@mail ~]# yum install perl-CGI
=========================================
报错2:
Unix::Syslog not found, please install it first! (in cleanup) Undefined subroutine &Ext::Logger::do_closelog called at /data/web/extmail/libs/Ext/Logger.pm line 86.

解决办法:
[root@mail ~]#  perl Makefile.PL  
如果安装这个包的报错
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 1. BEGIN failed--compilation aborted at Makefile.PL line 1.

解决办法:
[root@mail ~]# yum install -y perl-ExtUtils-MakeMaker
然后
[root@mail ~]# perl Makefile.PL 
[root@mail ~]# make install
=========================================
报错3
DBI connect('database=extmail;host=localhost;mysql_socket=/usr/local/mysql/var/mysql.sock','db_user',...) failed: Access denied for user 'db_user'@'localhost' (using password: YES) at /data/web/extmail/libs/Ext/Auth/MySQL.pm line 45

解决办法:
进入数据库失败,修改主配置文件。 SYS_MYSQL_USER = extmail ; SYS_MYSQL_PASS = extmail
=========================================

登录邮箱后台后,可以进行添加用户、添加管理员、修改管理员信息、添加别名、邮箱限额、网盘限额、禁止用户自由注册(在"域列表"中选中kevin.com进行修改)等操作。

特别注意:
用户创建完成后查看/var/mailbox/目录下是否自动创建了kevin.com/wangshibo目录。如果没有生成这个用户目录,说明创建用户的时候没有自动生成目录,这种情况大多是因为权限不对。通过查看apache的日志排错。同时将/var/mailbox的权限设置为700 所有者设置为 vmail。

[root@mail ~]# ll /var/mailbox/
total 4
drwx------. 3 vmail vmail 4096 Jul 29 07:31 kevin.com
[root@mail ~]# ll /var/mailbox/kevin.com/
total 4
drwx------. 3 vmail vmail 4096 Jul 29 07:31 wangshibo
[root@mail ~]# ll -d /var/mailbox/
drwx------. 3 vmail vmail 4096 Jul 29 07:31 /var/mailbox/

启动图形日志服务测试(不做下面一步,后台里的“图像日志”将不会显示图片)

[root@mail ~]# cp -rp /data/web/extman/addon/mailgraph_ext/ /usr/local/
[root@mail ~]# /usr/local/mailgraph_ext/mailgraph-init start
Starting mail statistics grapher: mailgraph_ext
[root@mail ~]# /usr/local/mailgraph_ext/qmonitor-init start
Starting queue statistics grapher: qmonitor

加入开机启动
[root@mail ~]# echo "/usr/local/mailgraph_ext/mailgraph-init start">>/etc/rc.local
[root@mail ~]# echo "/usr/local/mailgraph_ext/qmonitor-init start">>/etc/rc.local

登录查看,是否出图:

使用管理后台里创建的用户(比如上面的wangshibo)登录网页版邮箱。注意登录时,选中"登录邮箱"这一选项:

17)cyrus-sasl +courier-authlib+ postfix+ courier-imap+ maildrop联合配置与调试

完善配置postfix。本例中的main.cf文件下载地址:https://pan.baidu.com/s/176QEclvdvYtG37uQrW_yJg    提取密码:qi8i     main.cf文件一定要配置正确,否则邮件收发都会出现问题!

注意下面第二行的格式,不能顶格写。即将前面的注释打开。
[root@mail ~]# cp /etc/postfix/master.cf /etc/postfix/master.cf.bak
[root@mail ~]# vim /etc/postfix/master.cf
.......
 maildrop  unix  -       n       n       -       -       pipe
   flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}

[root@mail ~]# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
[root@mail ~]# >/etc/postfix/main.cf 
[root@mail ~]# vim /etc/postfix/main.cf
myhostname = mail.kevin.com

mydomain = kevin.com         #邮箱域名

myorigin = $mydomain         #发件人邮箱域名

inet_interfaces = all

mynetworks = 192.168.0.0/16, 127.0.0.0/8

relay_domains = $mydestination     #给外部邮箱发件时的外部邮箱域名!可以跟多个。注意,此处$mydestination需注释掉的!
      
alias_maps = $alias_database
alias_database = hash:/etc/aliases

mail_spool_directory = /var/spool/mail

default_recipient_refill_delay = 1s

#====================SASL ESMTP Authenticat=================

smtpd_sasl_auth_enable = yes

#smtpd_helo_required = yes

smtpd_sasl_local_domain = $mydomain

smtpd_sasl_security_options = noanonymous

broken_sasl_auth_clients = yes

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_application_name = smtpd

#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

smtpd_banner = $myhostname ESMTP Jobkoo mail system (version:1.0)

#=====================Vritual Mailbox settings=========================

virtual_mailbox_base = /var/mailbox/

virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf

virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf

virtual_alias_domains =

virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf

virtual_uid_maps = static:1001

virtual_gid_maps = static:1001

virtual_transport = maildrop

maildrop_destination_recipient_limit = 1

maildrop_destination_concurrency_limit = 1

#====================QUOTA============================================

message_size_limit = 20000000

mailbox_size_limit = 409600000

virtual_mailbox_limit = 20000000

virtual_create_maildirsize = yes

virtual_mailbox_extended = yes

virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf

virtual_mailbox_limit_override = yes

virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.

virtual_overquota_bounce = yes


启动postfix,启动前先设置好一些权限
[root@mail ~]# chown -R postfix.postfix /var/lib/postfix
[root@mail ~]# chown -R postfix.postfix /var/spool/postfix
[root@mail ~]# /etc/init.d/postfix start                            
Starting postfix:                                          [  OK  ]
[root@mail ~]# /etc/init.d/postfix status
master (pid 13888) is running...

查看maillog日志,进行检查(warning信息可以忽略)
[root@mail ~]# tail -f /var/log/maillog                   
[root@mail ~]# postfix check 

验证courier-authlib认证

首先确认courier-authlib已经运行
[root@mail ~]# service courier-authlib restart
Stopping Courier authentication services: authdaemond
Starting Courier authentication services: authdaemond

使用上面在邮箱管理后台创建的wangshibo用户进行认证测试(用户名:wangshibo@kevin.com    密码:wang@123456)
[root@mail ~]# /usr/local/courier-authlib/sbin/authtest -s loggin wangshibo@kevin.com wang@123456
Authentication succeeded.

     Authenticated: wangshibo@kevin.com  (uid 1001, gid 1001)
    Home Directory: /var/mailbox
           Maildir: kevin.com/wangshibo/Maildir/
             Quota: 524288000SS
Encrypted Password: $1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/
Cleartext Password: wang@123456
           Options: (none)

以上认证信息表明:ExtMan的正确安装,数据库也正确导入,courier-authlib能正确连接到mysql数据库。

下面查看maillog日志看看courier-authlib都做了什么。
[root@mail ~]# tail -f /var/log/maillog
.......
#courier-authlib接到验证请求类型为login
Jul 29 16:27:31 centos6-03 authdaemond: received auth request, service=loggin, authtype=login

#使用authmysql验证模块
Jul 29 16:27:31 centos6-03 authdaemond: authmysql: trying this module

#根据用户提交的用户名从数据库中查询信息
Jul 29 16:27:31 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'wangshibo@kevin.com'  AND (active='1')

#验证密码成功
Jul 29 16:27:31 centos6-03 authdaemond: password matches successfully

#authmysql 模块获得查询结果
Jul 29 16:27:31 centos6-03 authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null>

#authmysql 分析clearpasswd字段和passwd字段值
Jul 29 16:27:31 centos6-03 authdaemond: authmysql: clearpasswd=<null>, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/

#通过验证显示用户信息
Jul 29 16:27:31 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null>

#验证成功显示用户密码信息
Jul 29 16:27:31 centos6-03 authdaemond: Authenticated: clearpasswd=wang@123456, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/


特别注意:
由于我的courier-authlib验证服务将调试信息打开了,因此可以在maillog文件中查看这么详细的日志信息。
配置文件中(/usr/local/courier-authlib/etc/authlib/authdaemonrc)关于调试信息的设置分为三个级别,分别为:(我的文件里面是DEBUG_LOGIN=2)
0 → 关闭调试信息
1 → 打开调试信息
2 → 打开调试信息并显示密码

测试SMTP认证

首先随便测试一个账号,生成存放client的文件,默认的位置在 /etc/sasldb2(这个文件很重要,否则会造成认证失败)
[root@mail ~]# /usr/local/sbin/saslpasswd2 -c -u mail.kevin.com bobo
Password:                           #输入两次密码
Again (for verification):
[root@mail ~]# chmod 777 /etc/sasldb2
[root@mail ~]# ll /etc/sasldb2
-rwxrwxrwx. 1 root root 12288 Jul 29 17:24 /etc/sasldb2
 
通过以下命令获得wangshibo@kevin.com的用户名及密码的BASE64编码:(分别是用户名和密码)
[root@mail ~]# perl -e 'use MIME::Base64; print encode_base64("wangshibo\@kevin.com")'
d2FuZ3NoaWJvQGtldmluLmNvbQ==
[root@mail ~]# perl -e 'use MIME::Base64; print encode_base64("wang@123456")'
aHVpMTk4NzUyMQ==
 
 
然后本机测试,其过程如下
[root@mail ~]# telnet localhost 25
Trying localhost...
Connected to localhost.
Escape character is '^]'.
220 mail.kevin.com ESMTP Jobkoo mail system (version:1.0)
ehlo mail.kevin.com              #输入这个域名
250-mail.kevin.com
250-PIPELINING
250-SIZE 20000000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login                       #输入登录口令
334 VXNlcm5hbWU6
d2FuZ3NoaWJvQGtldmluLmNvbQ==     #输入用户名的编码
334 UGFzc3dvcmQ6
aHVpMTk4NzUyMQ==                 #输入密码的编码
 
235 2.7.0 Authentication successful
quit
221 2.0.0 Bye
Connection closed by foreign host.
 
 
如上,最后出现235 2.7.0 Authentication successful,表示认证成功了!

下面查看maillog日志看看:
[root@mail ~]# tail -f /var/log/maillog
.......
Jul 30 11:16:25 centos6-03 authdaemond: received auth request, service=smtp, authtype=login
Jul 30 11:16:25 centos6-03 authdaemond: authmysql: trying this module
Jul 30 11:16:25 centos6-03 authdaemond: authmysqllib: connected. Versions: header 50639, client 50639, server 50639
Jul 30 11:16:25 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'wangshibo@kevin.com'  AND (active='1')
Jul 30 11:16:25 centos6-03 authdaemond: password matches successfully
Jul 30 11:16:25 centos6-03 authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname=王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null>
Jul 30 11:16:25 centos6-03 authdaemond: authmysql: clearpasswd=<null>, passwd=$1$4o9ugUuB$kbzKQ6VTl03aHDfFQqHIy0
Jul 30 11:16:25 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname=王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null>
Jul 30 11:16:25 centos6-03 authdaemond: Authenticated: clearpasswd=wang@123456, passwd=$1$4o9ugUuB$kbzKQ6VTl03aHDfFQqHIy0
Jul 30 11:16:49 centos6-03 postfix/smtpd[101444]: disconnect from localhost[127.0.0.1]

测试POP3

[root@mail ~]# telnet 192.168.10.202 110
Trying 192.168.10.202...
Connected to 192.168.10.202.
Escape character is '^]'.
+OK Hello there.
user wangshibo@kevin.com            #输入用户名
+OK Password required.
pass wang@123456                    #输入密码
+OK logged in.
list                                #输入list
+OK POP3 clients that break here, they violate STD53.
.
quit                                #退出
+OK Bye-bye.
Connection closed by foreign host.


查看maillog日志
[root@mail postfix]# tail -f /var/log/maillog 
.......
#连接pop3 端口
Jul 29 17:42:13 centos6-03 pop3d: Connection, ip=[::ffff:192.168.10.202]

#需要验证,服务类型为pop3
Jul 29 17:42:26 centos6-03 authdaemond: received auth request, service=pop3, authtype=login

#使用authmysql模块认证
Jul 29 17:42:26 centos6-03 authdaemond: authmysql: trying this module

#与mysql连接获得认证信息
Jul 29 17:42:26 centos6-03 authdaemond: authmysqllib: connected. Versions: header 50639, client 50639, server 50639
Jul 29 17:42:26 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'wangshibo@kevin.com'  AND (active='1')
Jul 29 17:42:26 centos6-03 authdaemond: password matches successfully
Jul 29 17:42:26 centos6-03 authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null>
Jul 29 17:42:26 centos6-03 authdaemond: authmysql: clearpasswd=<null>, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/
Jul 29 17:42:26 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=wangshibo@kevin.com, fullname= 王士博, maildir=kevin.com/wangshibo/Maildir/, quota=524288000SS, options=<null>
Jul 29 17:42:26 centos6-03 authdaemond: Authenticated: clearpasswd=wang@123456, passwd=$1$8qUqeb7z$dqiSMpnZJrpEyBkkC.bP4/

#=============== 通过认证 ================
#通过pop3登陆
Jul 29 17:42:26 centos6-03 pop3d: LOGIN, user=wangshibo@kevin.com, ip=[::ffff:192.168.10.202], port=[44178]

#退出pop3
Jul 29 17:42:35 centos6-03 pop3d: LOGOUT, user=wangshibo@kevin.com, ip=[::ffff:192.168.10.202], port=[44178], top=0, retr=0, rcvd=12, sent=88, time=9


现在使用root用户手动给wangshibo发2封邮件(可以边查邮件日志/var/log/maillog边排错!如果日志里没有什么错误,就去extmail的邮箱里去查看邮件)
[root@mail ~]# mail -s 'hello' -v wangshibo@kevin.com <~/.bashrc
[root@mail ~]# mail -s 'hello' -v wangshibo@kevin.com <~/.bashrc

查看maillog日志,看看有没有报错信息
[root@mail ~]# tail -f /var/log/maillog

[root@mail ~]# telnet 192.168.10.202 110
Trying 192.168.10.202...
Connected to 192.168.10.202.
Escape character is '^]'.
+OK Hello there.
user wangshibo@kevin.com            #输入用户名
+OK Password required.
pass wang@123456                    #输入密码
+OK logged in.
list                                #输入list
+OK POP3 clients that break here, they violate STD53.
1 653                               #说明已经发现有一封邮件了。1代表第一封邮件,653为邮件大小
2 1849

quit                                #退出
+OK Bye-bye.
Connection closed by foreign host.

使用wangshibo用户登录extmail可以收到两封邮件

 登录extman管理后台,多创建几个基于kevin.com域名的邮箱,相互之间就能正常收发邮件了!

18)通过MUA测试收发邮件
本次MUA软件使用Foxmail,测试用户为wangshibo@kevin.com。需要注意的是kevin.com邮箱域名解析时,解析要包括:mail、smtp、pop3、imap的A记录以及MX记录

打开Foxmail客户端,创建新账号,如下图:

===============针对外部邮箱收发邮件的设置=================

按照上面的配置后,发现给外部邮箱发送和接收邮件有问题,/etc/postfix/main.cf文件修改如下:
[root@mail ~]# cat /etc/postfix/main.cf
myhostname = mail.kevin.com
  
mydomain = kevin.com
  
myorigin = $mydomain
  
inet_interfaces = all
  
mynetworks = 192.168.0.0/16, 127.0.0.0/8
  
relay_domains = $mydestination, grace.com
        
alias_maps = $alias_database
alias_database = hash:/etc/aliases
  
mail_spool_directory = /var/spool/mail
  
default_recipient_refill_delay = 1s
  
#====================SASL ESMTP Authenticat=================
  
smtpd_sasl_auth_enable = yes
  
#smtpd_helo_required = yes
  
smtpd_sasl_local_domain = $mydomain
  
smtpd_sasl_security_options = noanonymous
  
broken_sasl_auth_clients = yes
  
smtpd_recipient_restrictions = permit_mynetworks,
  
 permit_sasl_authenticated,
  
 reject_unauth_destination
  
smtpd_sasl_application_name = smtpd
  
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
  
smtpd_banner = $myhostname ESMTP Jobkoo mail system (version:1.0)
  
#=====================Vritual Mailbox settings=========================
  
virtual_mailbox_base = /var/mailbox/
  
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf
  
virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf
  
virtual_alias_domains =
  
virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf
  
virtual_uid_maps = static:1001
  
virtual_gid_maps = static:1001
  
virtual_transport = maildrop
  
maildrop_destination_recipient_limit = 1
  
maildrop_destination_concurrency_limit = 1
  
#====================QUOTA============================================
  
message_size_limit = 20000000
  
mailbox_size_limit = 409600000
  
virtual_mailbox_limit = 20000000
  
virtual_create_maildirsize = yes
  
virtual_mailbox_extended = yes
  
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf
  
virtual_mailbox_limit_override = yes
  
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
  
virtual_overquota_bounce = yes
 
需要注意的是:
上面的main.cf文件配置相比于之前的配置,改动的地方:
1)relay_domains这一项追加了外部邮箱的域名,比如这个要发送或接收grace.com域名的邮件。
2)添加的外部邮箱地址,要保证postfix部署机能和外部邮箱地址通信!如果不能通信,则不能正常收发外部邮件!
3)smtp认证部分的smtpd_recipient_restrictions这一项只保留三个参数配置。
 
另外,由于grace.com域名也是公司内部域名,还需要在其正向解析配置中添加邮件的MX记录,否则会出现发送邮件失败的情况!
如下,192.168.10.29和192.168.10.27是负责解析grace.com域名的两台DNS服务器地址;192.168.61.201是mail.grace.com邮箱服务器地址。
[root@mail ~]# cat /var/named/grace.com_zone
$TTL 600
@       IN SOA  ns.grace.com. root. (
                        2017071114
                         2H           
                         10M           
                         7D           
                         1D )
@                           IN      NS      ns1.graces.com.           
@                           IN      NS      ns2.grace.com.           
ns1                         IN      A       192.168.10.29
ns2                         IN      A       192.168.10.27
mail                        IN      A       192.168.61.201      
smtp                        IN      A       192.168.61.201
pop3                        IN      A       192.168.61.201
imap                        IN      A       192.168.61.201      
@                           IN      MX 10   mail.grace.com.
 
[root@mail ~]# cat /var/named/192.168.61.zone
$TTL 600
@       IN SOA  ns1.grace.com. root. (
                        2017071101
                         2H         
                         10M         
                         7D         
                         1D )
@               IN      NS      ns1.grace.com.
@               IN      NS      ns2.grace.com.
201             IN      PTR     smtp.grace.com.
201             IN      PTR     pop3.grace.com.
201             IN      PTR    mail.grace.com.
201             IN      PTR    imap.grace.com.
 
经过上面的调整后,kevin.com域名邮箱和grace.com域名邮箱就可以相互之间发送和接收邮件了!!!

19)邮件发垃圾和反病毒
杀毒软件

杀毒软件选用clamav,安装clamav
[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -zvxf clamav-0.94.1.tar.gz
[root@mail src]# cd clamav-0.94.1
[root@mail clamav-0.94.1]# ./configure --prefix=/usr/local/clamav --with-dbdir=/usr/local/share/clamav
[root@mail clamav-0.94.1]# make && make install

说明:
--with-dbdir 参数指定病毒库位置,这个路径在clamav的配置文件中也有出现。当指定了这个参数之后,编译安装后悔自动创建这个目录。

配置clamav
Clamav有2个配置文件,一个主配置文件/usr/local/clamav/etc/clamd.conf,一个病毒更新配置文件/usr/local/clamav/etc/freshclam.conf。
下面分别进行配置:
[root@mail clamav-0.94.1]# cp /usr/local/clamav/etc/clamd.conf /usr/local/clamav/etc/clamd.conf.bak
[root@mail clamav-0.94.1]# vim /usr/local/clamav/etc/clamd.conf            #清空原文件,直接复制下面内容
# 将example注掉
# example

LogFile /var/log/clamd.log

LogSyslog yes

LogVerbose yes

PidFile /var/run/clamav/clamd.pid

TemporaryDirectory /dev/shm/clamav/tmp

DatabaseDirectory /usr/local/share/clamav

LocalSocket /tmp/clamd.socket

StreamMaxLength 20M #附件大小,超过20M不扫描

User amavis

ScanMail yes

ScanArchive yes

[root@mail clamav-0.94.1]# cp /usr/local/clamav/etc/freshclam.conf /usr/local/clamav/etc/freshclam.conf.bak
[root@mail clamav-0.94.1]# vim /usr/local/clamav/etc/freshclam.conf        #清空原文件,直接复制下面内容到文件中
# 将example注掉
# example

DatabaseDirectory /usr/local/share/clamav

UpdateLogFile /var/log/freshclam.log

PidFile /var/run/clamav/freshclam.pid

DatabaseOwner amavis

DatabaseMirror db.CN.clamav.net

DatabaseMirror database.clamav.net

说明:
在上面两个配置文件中,都有用户的设置,这里都设置成了amavis 。为什么不用默认的用户clamav而使用amavis呢?这样做的目的是为了与amavis-new结合在一起。
配置中的socker是杀毒程序的socket文件位置,后面与amavis-new结合使用的时候配置amavis-new需要指定这个文件。

修改相应目录权限
[root@mail clamav-0.94.1]# chown -R amavis.amavis /usr/local/share/clamav
[root@mail clamav-0.94.1]# chown -R amavis.amavis /dev/shm/clamav/
[root@mail clamav-0.94.1]# touch /var/log/freshclam.log
[root@mail clamav-0.94.1]# chown amavis.amavis /var/log/freshclam.log
[root@mail clamav-0.94.1]# touch /var/log/clamd.log
[root@mail clamav-0.94.1]# chown amavis.amavis /var/log/clamd.log
[root@mail clamav-0.94.1]# mkdir -p /var/run/clamav/
[root@mail clamav-0.94.1]# chown amavis.amavis /var/run/clamav/ -R

手动更新病毒库并运行杀毒程序(启动后,执行ps -ef|grep clamd,确保/tmp/clamd.socket存在)
[root@mail clamav-0.94.1]# /usr/local/clamav/bin/freshclam --daemon
[root@mail clamav-0.94.1]# /usr/local/clamav/sbin/clamd
LibClamAV Warning: **************************************************
LibClamAV Warning: ***  The virus database is older than 7 days!  ***
LibClamAV Warning: ***   Please update it as soon as possible.    ***
LibClamAV Warning: **************************************************
[root@mail clamav-0.94.1]# 

将病毒库升级和杀毒程序设置为随系统启动
[root@mail clamav-0.94.1]# echo "/usr/local/clamav/bin/freshclam --daemon" >> /etc/rc.local
[root@mail clamav-0.94.1]# echo "/usr/local/clamav/sbin/clamd" >> /etc/rc.local

邮件病毒扫描与垃圾邮件过滤

amavisd-new程序是提供postfix邮件扫描杀毒的,因此需要连接clamav杀毒软件和postfix程序。

安装
[root@mail ~]# cd /usr/local/src/
[root@mail src]# tar -zvxf amavisd-new-2.6.4.tar.gz 
[root@mail src]# cd amavisd-new-2.6.4
[root@mail amavisd-new-2.6.4]# mkdir -p /var/amavis/{tmp,var,db}
[root@mail amavisd-new-2.6.4]# chown -R amavis.amavis /var/amavis
[root@mail amavisd-new-2.6.4]# chmod -R 750 /var/amavis
[root@mail amavisd-new-2.6.4]# cp amavisd /usr/local/sbin/
[root@mail amavisd-new-2.6.4]# chown root /usr/local/sbin/amavisd
[root@mail amavisd-new-2.6.4]# chmod 755 /usr/local/sbin/amavisd
[root@mail amavisd-new-2.6.4]# cp amavisd.conf /etc/
[root@mail amavisd-new-2.6.4]# chown root /etc/amavisd.conf
[root@mail amavisd-new-2.6.4]# chmod 644 /etc/amavisd.conf
[root@mail amavisd-new-2.6.4]# mkdir /var/virusmails
[root@mail amavisd-new-2.6.4]# chown amavis.amavis /var/virusmails
[root@mail amavisd-new-2.6.4]# chmod 750 /var/virusmails

配置Amavisd与Clamav结合
[root@mail amavisd-new-2.6.4]# cp /etc/amavisd.conf /etc/amavisd.conf.bak
[root@mail amavisd-new-2.6.4]# vim /etc/amavisd.conf
$max_servers=8;
$daemon_user = 'amavis';

$daemon_group = 'amavis';

$mydomain = 'kevin.com';

$db_home = "$MYHOME/db";

$inet_socket_port = 10024;

$sa_tag_level_deflt = 5.0;

$sa_tag2_level_deflt = 6.2;

$sa_kill_level_deflt = $sa_tag2_level_deflt;

$virus_admin = "virusalert@$mydomain";

$sa_spam_subject_tag = '***SPAM*** ';

$forward_method = 'smtp:127.0.0.1:10025';

$notify_method = $forward_method;

$final_virus_destiny = D_DISCARD;

$final_banned_destiny = D_DISCARD;

$final_spam_destiny = D_PASS;

['ClamAV-clamd',

&ask_daemon, ["CONTSCAN {}n", "/tmp/clamd.socket"],

qr/bOK$/, qr/bFOUND$/,

qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],

# 在154行左右,修改投递/拦截的方法:

$final_virus_destiny = D_DISCARD;

$final_banned_destiny = D_BOUNCE;

$final_spam_destiny = D_PASS;

$final_bad_header_destiny = D_PASS;


需要注意:
1)配置文件编写完成后使用执行/usr/local/sbin/amavisd debug 进行调试。如果发现缺少perl组件就利用yum search 查找相关组件,
   最后用yum 安装,这样来的方便些!
2)配置中的socket部分是clamav 杀毒软件的socket文件,这个文件的位置是在配置clamav的时候指定的,在这里配置amavis时一定要指定正确!
3)最后四行部分是amavisd运行时打开的端口号
4)forward_method部分是与postfix连接时需要连接的地址和端口号。这个地址是在postfix的master.cf文件中指定的。后文会介绍。
5)最后4个设置中,对spam(垃圾邮件)默认会直接反弹(BOUNCE),现在修改为继续投递(PASS)但在信头中增加相关X-Spam- Status信息等。
   这样可以很方便的在extmail中设置将被标记为垃圾邮件的mail投递到"垃圾邮件箱"中,便于用户翻查。


垃圾邮件过滤服务spamassassin安装配置
[root@mail ~]# cd /usr/local/src/
[root@mail src]# wget http://archive.apache.org/dist/spamassassin/Mail-SpamAssassin-3.0.0.tar.gz
[root@mail src]# tar -zvxf Mail-SpamAssassin-3.0.0.tar.gz 
[root@mail src]# cd Mail-SpamAssassin-3.0.0
[root@mail Mail-SpamAssassin-3.0.0]# perl Makefile.PL             #一路回车,默认配置即可
[root@mail Mail-SpamAssassin-3.0.0]# make && make install

mail:: spamassassin配置
[root@mail Mail-SpamAssassin-3.0.0]# cp /etc/mail/spamassassin/local.cf /etc/mail/spamassassin/local.cf.bak
[root@mail Mail-SpamAssassin-3.0.0]# vim /etc/mail/spamassassin/local.cf     
#required_hits 5
#report_safe 0
#rewrite_header Subject [SPAM]
required_hits 5
use_bayes 1
bayes_auto_learn 1
skip_rbl_checks 0
use_razor2 1
use_pyzor 0

启动spamassassin 并加入到系统启动
[root@mail Mail-SpamAssassin-3.0.0]# /usr/local/bin/spamd --daemonize --pidfile /var/run/spamd.pid
[root@mail Mail-SpamAssassin-3.0.0]# echo "/usr/local/bin/spamd --daemonize --pidfile /var/run/spamd.pid" >> /etc/rc.local 

启动amavisd并加入到系统启动
[root@mail Mail-SpamAssassin-3.0.0]# /usr/local/sbin/amavisd start
[root@mail Mail-SpamAssassin-3.0.0]# echo "/usr/local/sbin/amavisd start ">>/etc/rc.local

配置Postfix 集成amavisd-new(注意下面的-o内容不能顶格写,要空格,否则postfix服务会启动失败,通过/var/log/maillog日志能看出启动信息)
[root@mail Mail-SpamAssassin-3.0.0]# cp /etc/postfix/master.cf /etc/postfix/master.cf.bak2
[root@mail Mail-SpamAssassin-3.0.0]# vim /etc/postfix/master.cf
127.0.0.1:10025 inet n - n - - smtpd
  -o content_filter=

  -o local_recipient_maps=

  -o relay_recipient_maps=

  -o smtpd_restriction_classes=

  -o smtpd_client_restrictions=

  -o smtpd_helo_restrictions=

  -o smtpd_sender_restrictions=

  -o smtpd_recipient_restrictions=permit_mynetworks,reject

  -o mynetworks=127.0.0.0/8

  -o strict_rfc821_envelopes=yes

  -o smtpd_error_sleep_time=0

  -o smtpd_soft_error_limit=1001

  -o smtpd_hard_error_limit=1000

  -o receive_override_options=


编辑/etc/postfix/main.cf
[root@mail Mail-SpamAssassin-3.0.0]# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak2
[root@mail Mail-SpamAssassin-3.0.0]# vim /etc/postfix/main.cf
#在最后添加
# Content-Filter
content_filter = smtp:[127.0.0.1]:10024

receive_override_options = no_address_mappings


需要注意:
1)这里content_filter 选项指定的smtp:[127.0.0.1]:10024 端口正是配置amavisd-new时所指定的。
2)receive_override_options 这里必须增加,禁止地址展开/影射,否则如果遇到别名的时候会引起冗余邮件的产生。

重启postfix
[root@mail Mail-SpamAssassin-3.0.0]# /etc/init.d/postfix restart
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ]

测试Clamav

先登录extmail界面创建bobo@kevin.com账号,利用wangshibo@kevin.com账号给bobo@kevin.com账号发邮件,因为遇到邮件中有病毒或垃圾邮件的话,
postfix会给wangshibo@kevin.com发一封邮件。

利用telnet测试25端口,过程如下:

[root@mail ~]# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.kevin.com ESMTP Jobkoo mail system (version:1.0)
mail from:<wangshibo@kevin.com>                                          #输入发件邮箱             
250 2.1.0 Ok
rcpt to:<bobo@kevin.com>                                                 #输入目标邮箱
250 2.1.5 Ok
data                                                                     #输入这个
354 End data with <CR><LF>.<CR><LF>
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*     #输入这个
.                                                                        #输入这个
250 2.0.0 Ok: queued as DD4A3A0673
quit                                                                     #输入这个
221 2.0.0 Bye
Connection closed by foreign host.


查看邮件日志
[root@mail ~]# tail -f /var/log/maillog
.......
Jul 30 02:13:30 centos6-03 amavis[9707]: (09707-02) Passed CLEAN, [127.0.0.1] [127.0.0.1] <wangshibo@kevin.com> -> <bobo@kevin.com>, Message-ID: <20180729181322.70E8CA0681@mail.kevin.com>, mail_id: xvp4rzGLpwmT, Hits: -, size: 365, queued_as: 4A837A0689, 196 ms
.......
Jul 30 02:13:30 centos6-03 authdaemond: received userid lookup request: bobo@kevin.com
Jul 30 02:13:30 centos6-03 authdaemond: authmysql: trying this module
Jul 30 02:13:30 centos6-03 authdaemond: SQL query: SELECT username, password, "", 1001, 1001, '/var/mailbox', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = 'bobo@kevin.com'  AND (active='1')
Jul 30 02:13:30 centos6-03 authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox, address=bobo@kevin.com, fullname=bobo, maildir=kevin.com/bobo/Maildir/, quota=524288000SS, options=<null>
Jul 30 02:13:30 centos6-03 authdaemond: Authenticated: clearpasswd=<null>, passwd=$1$Gj0qfSAN$iHQjS0BeNfbeArKL1MQ8D0
Jul 30 02:13:30 centos6-03 postfix/smtp[19451]: 70E8CA0681: to=<bobo@kevin.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=8.6, delays=8.4/0/0/0.2, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=09707-02, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 4A837A0689)

说明:
从日志中可以清楚的看到,刚刚测试的邮件被amavis捕捉到了,上面maillog中第一部分信息表示被amavis拦截了。这时邮件经过postfix打包,发给了bobo@kevin.com
这个账户;从第二部分日志信息中可以很清楚的看到。通过extmail登陆bobo@kevin.com后可以看到警报邮件的内容,如下图:

最终测试

现在通过简单的email收发来确认系统是否正常。

发送测试邮件
输入以下命令,通过telnet方式给wangshibo@kevin.com发送一封测试信件
[root@mail ~]# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.kevin.com ESMTP Jobkoo mail system (version:1.0)
mail from:<wangshibo@kevin.com>                              #输入这个
250 2.1.0 Ok
rcpt to:<bobo@kevin.com>                                     #输入这个
250 2.1.5 Ok
data                                                         #输入这个
354 End data with <CR><LF>.<CR><LF>                          
Subject: Hello World                                         #输入这个
Hello World!                                                 #输入这个
.                                                            #输入这个
250 2.0.0 Ok: queued as 23EC7A0681
quit                                                         #输入这个
221 2.0.0 Bye
Connection closed by foreign host.


此时通过另一个命令行窗口,观察maillog,将看到如下信息:
[root@mail clamav-0.94.1]# tail -f /var/log/maillog
........
Jul 30 02:21:37 centos6-03 amavis[9708]: (09708-01) Passed CLEAN, [127.0.0.1] [127.0.0.1] <wangshibo@kevin.com> -> <bobo@kevin.com>, Message-ID: <20180729182117.23EC7A0681@mail.kevin.com>, mail_id: q8itRecEZJag, Hits: -, size: 332, queued_as: 5D4BBA068D, 1239 ms
Jul 30 02:21:37 centos6-03 postfix/smtp[19467]: 23EC7A0681: to=<bobo@kevin.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=26, delays=25/0/0/1.2, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=09708-01, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 5D4BBA068D)
Jul 30 02:21:37 centos6-03 authdaemond: received userid lookup request: bobo@kevin.com
Jul 30 02:21:37 centos6-03 authdaemond: authmysql: trying this module
Jul 30 02:21:37 centos6-03 postfix/qmgr[10803]: 23EC7A0681: removed
.......


说明:
上述日志表示邮件经过了amavisd-new的扫描,并且已经通过maildrop投递到用户的maildir了,黄色字体表面通过检查。

20)启动服务项及进程整理

courier-authlib
[root@mail ~]# chkconfig courier-authlib on
[root@mail ~]# service courier-authlib start

postfix
[root@mail ~]# chkconfig --list postfix
[root@mail ~]# service postfix start

imapd
[root@mail ~]# chkconfig imapd on
[root@mail ~]# service imapd start

extmail 图形监控
加入启动项
[root@mail ~]# echo "/usr/local/mailgraph_ext/mailgraph-init start">>/etc/rc.local
[root@mail ~]# echo "/usr/local/mailgraph_ext/qmonitor-init start">>/etc/rc.local

启动
/usr/local/mailgraph_ext/mailgraph-init start
/usr/local/mailgraph_ext/qmonitor-init start

clamav
加入启动项
[root@mail ~]# echo "/usr/local/clamav/bin/freshclam --daemon" >> /etc/rc.local
[root@mail ~]# echo "/usr/local/clamav/sbin/clamd" >> /etc/rc.local

启动
[root@mail ~]# /usr/local/clamav/bin/freshclam --daemon
[root@mail ~]# /usr/local/clamav/sbin/clamd

amavisd-new
[root@mail ~]# /usr/local/sbin/amavisd start
[root@mail ~]# echo "/usr/local/sbin/amavisd start ">>/etc/rc.local

启动spamassassin 并加入到系统启动
[root@mail ~]# /usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid
[root@mail ~]# echo "/usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid" >>/etc/rc.local

21)邮件服务器压力测试-利用Postal工具

postal下载:http://doc.coker.com.au/projects/postal/

postal安装
[root@mail ~]# tar -zxvf postal7.tgz
[root@mail ~]# cd postal7
[root@mail postal7]# ./configure
[root@mail postal7]# make
[root@mail postal7]# make install
[root@mail postal7]# make clean

压力测试(maillist.txt文件中放入大量的邮件账号,进行压力测试)
[root@mail ~]# postal -m 100 -p 25 192.168.10.202 maillist.txt

================登录extman的时候,报错===============

Can't open /tmp/extman//sid_cdbff585272d01da9209e113acb4d90f, No such file or directory (2012-06-08 15:19:42)转载▼

解决办法:
[root@mail ~]# mkdir /tmp/extman
[root@mail ~]# chown -R postfix:postfix /tmp/extman
[root@mail ~]# chmod -R 777 /tmp/extman

可以写一个脚本, 检查/tmp下是否有extman目录, 如果没有, 就创建该目录并授权, 脚本内容如下:
[root@mail ~]# cat /opt/tmp_monit_extman.sh 
#!/bin/bash

ls -l -d /tmp/extman

if [ $? -ne 0 ];then
    /bin/mkdir /tmp/extman
    /bin/chown -R postfix:postfix /tmp/extman
    /bin/chmod -R 777 /tmp/extman
else
   echo "it is ok" >/dev/null 2>&1
fi


添加脚本执行权限, 并设置计划任务, 每一分钟执行一次
[root@mail ~]# chmod 755  /opt/tmp_monit_extman.sh
[root@mail ~]# crontab -l
* * * * * /bin/bash -x /opt/tmp_monit_extman.sh >/dev/null 2>&1
posted @ 2018-07-29 00:21  散尽浮华  阅读(14047)  评论(4编辑  收藏  举报