本人一开始对邮件系统完全不了解,因需要使用邮件系统,所以参考了很多文档与视频,最后把全部安装过程记录下来,分享出来,为其他没有接触过但是需要的同学提供参考,交流学习,如果发现此文档有错误,欢迎指正,也欢迎大家完善它,高手勿批。
风险1本文全程使用yum安装,请考虑是否会对以后维护产生影响。
2本文未使用apache的suexec功能,所以使用postfix用户运行apache子进程,请考虑是否对要部署的环境有所影响。
3本文未成功添加fcgi模块,cgi性能可能无法到达用户数量非常高的要求(待确定)
4本文只实现了同一个域内的用户相互发送接收邮件的功能,本文环境为内网环境,非公网。
5 未按照本文档的操作步骤和方式进行操作的,请勿完全参考此文档,以免操作方式不同,产生其他错误。
6其他。
7请参考以上风险是否会对您造成影响。
环境参数
服务系统:
[root@localhost ~]# cat/etc/issue
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel \r on an \m
[root@localhost ~]# arch
x86_64
服务器ip:192.168.88.88
客户端系统:win7
客户端测试用MUA:foxmail,网易闪电邮
前期准备
下载EMOS1.6,因为本文全程使用RPM包安装,所以需下载 EMOS1.6_86_64.iso,下载extmail-1.2.tar.gz,下载extman-1.1.tar.gz, 同时,大部分RPM选定从系统对应的稳定的RPM安装,所以需要系统中自带的rpm或者镜像,此处使用RHEL6.3的镜像文件中的RPM包。
搭建环境
1.环境设置
1设置防火墙和selinux,本文直接关闭防火墙和selinux
[root@localhost ~]# service iptables status
iptables: Firewall is not running.
[root@localhost ~]# chkconfig | grepiptables
iptables 0:off1:off2:off3:off4:off5:off6:off
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
2 hostname(客户端系统如果要连接服务器也要记得修改DNS或者host文件)
3设置yum源,将系统镜像中的包设置为localyum,将EMOS镜像中的包设置为emosyum
[root@localhost ~]#createrepo -g/opt/localyum/repodata/省略··· -comps-rhel6-Server.xml -v /opt/localyum/
[root@localhost ~]# yum clean all
Emosyum设置同上,可不加-g参数,可以只将需要的rpm包复制过来,可只复制如下的包到emosyum中
4检查是否安装了Developmenttools组,这个组中的包会在安装过程中被依赖,如果未安装,yum groupinstall Development tools
5检查以下包是否已安装,因为他们可能会被依赖
[root@ localhost ~]# yum list | grep -E'tcl-devel|libart_lgpl-devel|libtool-ltdl-devel|expect'
Unable to read consumer identity
expect.x86_64 5.44.1.15-4.el6 @localyum
libart_lgpl-devel.x86_64 2.3.20-5.1.el6 @localyum
libtool-ltdl-devel.x86_64 2.2.6-15.5.el6 @localyum
tcl-devel.x86_64 1:8.5.7-6.el6 @localyum
在我的系统里面上面的命令查不出libtool-ltdl-devel这个包,但是它在系统自带的package中是存在的,所以配置yum源的时候,最好自己再createrepo一遍,然后clean,最后在试用上面的命令检查。
6检查系统是否自带postfix,自动安装的postfix是否支持mysql与cyrus
查看是否支持mysql
[root@cp-rdsrv00 Packages]# postconf–m
btree
cidr
environ
hash
ldap
mysql
nis
pcre
proxy
regexp
static
unix
查看是否支持cyrus
[root@cp-rdsrv00 Packages]# postconf–a
cyrus
dovecot
2.配置DNS(域名)
[root@cp-rdsrv00 ~]# yum install bind
[root@cp-rdsrv00 ~]# yum installbind-chroot
Unable to read consumer identity
PackageKit-device-rebind.x86_64 0.5.8-20.el6 @ localyum bind.x86_64 32:9.8.2-0.10.rc1.el6 @localyum
bind-chroot.x86_64 32:9.8.2-0.10.rc1.el6 @localyum
bind-libs.x86_64 32:9.8.2-0.10.rc1.el6 @ localyum bind-utils.x86_64 32:9.8.2-0.10.rc1.el6 @ localyum
[root@cp-rdsrv00 ~]# service named start
Starting named: [ OK ]
[root@cp-rdsrv00 etc]# cd/var/named/chroot/etc/
[root@cp-rdsrv00 etc]# cp named.confnamed.conf.back
[root@cp-rdsrv00 etc]# vim named.conf
更改如下两项
listen-on port 53 { 192.168.88.88; };
allow-query { any; };
然后更改如下文件
[root@cp-rdsrv00 etc]# vimnamed.rfc1912.zones
在最下面添加如下内容,根据实际情况进行更改,这里为了方便,只配置正向解析
zone "test.com" IN {
type master;
file "test.com.zone";
allow-update { none; };
};
然后去相应路径创建正向解析文件
[root@cp-rdsrv00 etc]# cd/var/named/chroot/var/named/
[root@cp-rdsrv00 named]# cp named.localhosttest.com.zone
[root@cp-rdsrv00 named]# chmod -R 777 test.com.zone
[root@cp-rdsrv00 named]# vim test.com.zone
更改信息如下
$TTL 600
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H) ; minimum
NS @
A 192.168.88.88
AAAA ::1
IN mx 10 cp-rdsrv00.test.com.
cp-rdsrv00 IN A 192.168.88.88
mail IN CNAME cp-rdsrv00
然后我们要修改服务器的默认的DNS 服务器,但是因为服务器本身可能安装了NetworkManager服务,它有可能托管网络配置,所以如果大家直接用setup去配置dns,可能服务器重启以后,先前配置的DNS配置会清空,所以,我们使用以下方法更改相应网卡的DNS配置
为防止重启机器后自动清空dns设置,所以需要进行相应的设置
进入网卡配置的路径
[root@cp-rdsrv00 network-scripts]# pwd
/etc/sysconfig/network-scripts
找到相应网卡进行编辑
[root@cp-rdsrv00 network-scripts]# vimifcfg-有线连接_1
添加如下内容,DNS2没有可以不加
DNS1=X.X.X.X
DNS2=X.X.X.X
然后重启网络服务
[root@cp-rdsrv00 network-scripts]#/etc/init.d/network restart
fgrep: ifcfg-ifcfg-有线连接_1: Nosuch file or directory
fgrep: ifcfg-ifcfg-有线连接_1: Nosuch file or directory
/etc/init.d/network: line 206:./ifcfg-ifcfg-有线连接_1: No such file or directory
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
fgrep: ifcfg-ifcfg-有线连接_1: Nosuch file or directory
fgrep: ifcfg-ifcfg-有线连接_1: Nosuch file or directory
fgrep: ifcfg-ifcfg-有线连接_1: Nosuch file or directory
egrep: ifcfg-ifcfg-有线连接_1: Nosuch file or directory
Bringing up interface ifcfg-有线连接_1: Active connection state: activated
Active connection path:/org/freedesktop/NetworkManager/ActiveConnection/2
[ OK ]
按照上述方法更改的DNS配置后,重启后应该不会回复,网上还有的朋友说停止NetworkManager,千万不要这样(停止此服务后,网卡可能会被禁用,如果不小心停止了,从服务内重新启动该服务即可),使用setup配置,或者直接更改resolv.conf,重启后都有可能会还原DNS设置,所以请按照上述方法进行
重启域名服务
[root@cp-rdsrv00 named]# service namedrestart
Stopping named: .umount:/var/named/chroot/var/named: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
[ OK ]
Starting named: [ OK ]
设置开机启动
[root@cp-rdsrv00 ~]# chkconfig named on
本机ping测试
远程客户端修改dns后,进行ping 测试
3.配置postfix(发邮件)
本系统在安装的时候自带安装了系统的postfix,如果没有安装,请手动安装postfix,并且保证postfix支持mysql与cyrus。
postfix用户id和用户组id默认为89,postdrop用户组id默认为90
因为默认的postfix用户id较小,大家一般都是用id号大于1000的,因为如果id较小,以后认证的时候可能会报一些错误,所以更改postfix默认id,使用大家常用的2525
更改系统用户id,将系统自带postfix用户id改为2525,将系统自带postfix组id改为2525,将系统自带postdrop组id改为2526。
[root@localhost ~]# id postfix
uid=89(postfix) gid=89(postfix)groups=89(postfix),12(mail)
[root@localhost ~]# usermod -u 2525 postfix
usermod: user postfix is currently loggedin
[root@localhost ~]# service postfix stop
Shutting down postfix: [ OK ]
[root@localhost ~]# usermod -u 2525 postfix
[root@localhost ~]# groupmod -g 2525postfix
[root@localhost ~]# groupmod -g 2526postdrop
[root@localhost ~]# id postfix
uid=2525(postfix) gid=2525(postfix)groups=2525(postfix),12(mail)
[root@localhost ~]# service postfix restart
Shutting down postfix: [FAILED]
Starting postfix: [ OK ]
更改id后,重启有问题,或者发邮件收不到,是因为更改id后权限有问题,查看日志/var/log/maillog 报错如下
Sep 2 01:20:07 localhost postfix/postfix-script[1316]: starting the Postfixmail system
Sep 2 01:20:07 localhost postfix/master[1317]: fatal: open lock file/var/lib/postfix/master.lock: cannot open file: Permission denied
Sep 2 01:20:13 localhost postfix/postfix-script[1337]: fatal: the Postfixmail system is not running
Sep 2 01:20:13 localhost postfix/postfix-script[1395]: warning: not owned bypostfix: /var/lib/postfix/.
Sep 2 01:20:13 localhost postfix/postfix-script[1396]: warning: not owned bypostfix: /var/lib/postfix/./master.lock
Sep 2 01:20:13 localhost postfix/postfix-script[1402]: warning: not owned bygroup postdrop: /usr/sbin/postqueue
Sep 2 01:20:13 localhost postfix/postfix-script[1403]: warning: not owned bygroup postdrop: /usr/sbin/postdrop
Sep 2 01:20:13 localhost postfix/postfix-script[1404]: warning: not owned bygroup postdrop: /var/spool/postfix/public
Sep 2 01:20:13 localhost postfix/postfix-script[1405]: warning: not owned bygroup postdrop: /var/spool/postfix/maildrop
Sep 2 01:20:13 localhost postfix/postfix-script[1413]: starting the Postfixmail system
Sep 2 01:20:13 localhost postfix/master[1414]: fatal: open lock file/var/lib/postfix/master.lock: cannot open file: Permission denied
可见更改id后对部分路径和文件的访问权限有影响,所以执行以下命令更改用户和用户组
[root@localhost postfix]# chown -Rpostfix:postfix /var/lib/postfix/
[root@localhost postfix]# chgrp -R postdrop/usr/sbin/postqueue
[root@localhost postfix]# chgrp -R postdrop/usr/sbin/postdrop
[root@localhost postfix]# chgrp -R postdrop/var/spool/postfix/public
[root@localhost postfix]# chgrp -R postdrop/var/spool/postfix/maildrop
然后restart两次,成功
[root@localhost postfix]# service postfixrestart
Shutting down postfix: [FAILED]
Starting postfix: [ OK ]
[root@localhost postfix]# service postfixrestart
Shutting down postfix: [ OK ]
Starting postfix: [ OK ]
修改postfix主配置文件
[root@localhost postfix]# pwd
/etc/postfix
[root@localhost postfix]# cp main.cfmain.cf.back
[root@localhost postfix]# postconf -e'inet_interfaces = all'
[root@localhost postfix]# postconf -e'mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain'
[root@localhost postfix]# postconf -e'mynetworks = 127.0.0.0/8,192.168.0.0/16' (注:不要把127.0.0.0写成127.0.0.1)
[root@localhost postfix]# postconf -e'myhostname = mail.test.com'
[root@localhost postfix]# postconf -e'mydomain = test.com'
[root@localhost postfix]# postconf -e'myorigin = $mydomain'
修改后重启
[root@localhost postfix]# service postfixrestart
Shutting down postfix: [ OK ]
Starting postfix: [ OK ]
使用telnet命令测试
[root@localhost postfix]# telnet mail.test.com25
Trying 192.168.88.88...
Connected to mail.test.com.
Escape character is '^]'.
Connection closed by foreign host.
查看日志
Sep 2 01:38:20 localhost postfix/master[1887]: warning:/usr/libexec/postfix/smtpd: bad command startup -- throttling
Sep 2 01:39:33 localhost postfix/smtpd[1979]: connect fromcp-rdsrv00[192.168.88.88]
Sep 2 01:39:33 localhost postfix/smtpd[1979]: fatal: non-null host addressbits in "127.0.0.1/8", perhaps you should use "127.0.0.0/8"instead
根据提示,发现配置错误了127.0.0.1/8应该改成127.0.0.0/8
[root@localhost postfix]# postconf -e'mynetworks = 127.0.0.1/8,192.168.0.0/16'
从服务器本地进行telnet测试,然后查看对应账户是否收到邮件
[root@cp-rdsrv00 ~]# telnet mail.test.com25
Trying 192.168.88.88...
Connected to mail.test.com.
Escape character is '^]'.
220 mail.test.com ESMTP Postfix
helo mail.test.com
250 mail.test.com
mail from:root@mail.test.com
250 2.1.0 Ok
rcpt to:root@mail.test.com
250 2.1.5 Ok
data
354 End data with<CR><LF>.<CR><LF>
Subject:test
test
.
250 2.0.0 Ok: queued as 46763C0913
quit
221 2.0.0 Bye
Connection closed by foreign host.
You have new mail in /var/spool/mail/root
从windos客户端进行telnet测试,然后查看服务器对应账户是否收到邮件
C:\Users\zz6547>telnet mail.test.com 25
220 mail.test.com ESMTP Postfix
helo mail.test.com
250 mail.test.com
mail from:teest@test.com
250 2.1.0 Ok
rcpt to:root@mail.test.com
250 2.1.5 Ok
data
354 End data with<CR><LF>.<CR><LF>
Subject:test of windows
test of windows
.
250 2.0.0 Ok: queued as 3D34EC0914
quit
221 2.0.0 Bye
如果上面两个测试都没有问题,postfix的基本配置就完成了,到此,我们只实现了一些最基本的功能,如下
1在服务器上或远程客户端上通过一些基础的命令向服务器上面的本地域上的用户发邮件
2服务器上的用户相互发邮件
因此我们需要的功能还远远未实现,现在我们继续向下配置,现在发邮件没有验证用户信息,为了实现简单的认证功能,我们需要配置cyrus-sasl
4.配置cyrus-sasl(认证)
请确定以下cyrus-sasl相关包已经安装
[root@cp-rdsrv00 ~]# yum list installed |grep cyrus
Unable to read consumer identity
cyrus-sasl.x86_64 2.1.23-13.el6 @anaconda
cyrus-sasl-devel.x86_64 2.1.23-13.el6 @localyum
cyrus-sasl-lib.x86_64 2.1.23-13.el6 @anaconda-
cyrus-sasl-plain.x86_64 2.1.23-13.el6 @anaconda-
为了对比cyrus配置前后效果,达到只有认证通过的用户才能发邮件的效果,所以先修改postfix配置,使postfix认为只有本机的127.0.0.1的网段的邮件为非中继邮件,同时127.0.0.0/8的网段为允许中继的网段,其他所有网段的用户都需要认证以后才能发邮件。
更改后如下
[root@cp-rdsrv00Packages]# vim /etc/postfix/main.cf
mydestination =localhost
mynetworks=127.0.0.0/8
更改后重启postfix
[root@cp-rdsrv00Packages]# service postfix restart
Shutting downpostfix: [ OK ]
Startingpostfix: [ OK ]
重启完成后,我们再次使用windows客户端对服务器发邮件
220 mail.test.comESMTP Postfix
mailfrom:test@test.com
250 2.1.0 Ok
rcpt to:root@mail.test.com
554 5.7.1<root@mail.test.com>: Relay access denied
提示Relay accessdenied(目的效果已达成),如果想要telnet成功,除非在服务器上telnet 127.0.0.1 25 可以成功。
我们现在已经无法在windows客户端中继邮件了,所以等我们配置完cyrus以后,如果通过认证的用户可以发邮件,那么就证明了我们的cyrus配置是正确的,当然,我们现在还没有配置cyrus,我们继续
下面启动cyrus-sasl的服务,并进行配置
[root@cp-rdsrv00Packages]# service saslauthd start
Startingsaslauthd: [ OK ]
[root@cp-rdsrv00Packages]# chkconfig saslauthd on
[root@cp-rdsrv00Packages]# chkconfig | grep saslauthd
saslauthd 0:off1:off2:on3:on4:on5:on6:off
使用testsaslauthd –u username –p password命令可以测试saslauthd服务是否正常,记住不要使用root用户进行测试,创建一个新用户进行测试,测试完成后删除该用户
[root@cp-rdsrv00sasl2]# testsaslauthd -u testuser -p 123
0:NO "authentication failed"
提示验证失败
因为系统默认认证机制是使用pam认证,我们改为shadow认证
[root@cp-rdsrv00sasl2]# vim /etc/sysconfig/saslauthd
Pam改为shadow
#MECH=pam
MECH=shadow
更改完成过后重启服务
[root@cp-rdsrv00sasl2]# service saslauthd restart
Stoppingsaslauthd: [ OK ]
Startingsaslauthd: [ OK ]
再次使用testsaslauthd命令测试saslauthd服务是否正常
[root@cp-rdsrv00sasl2]# testsaslauthd -u testuser -p 123
0:OK "Success."
验证成功,服务正常
然后开始配置
首先确认smtp能够使用sasl进行认证
查看/etc/sasl2/smtpd.conf配置文件中是否有如下配置
[root@cp-rdsrv00sasl2]# cat /etc/sasl2/smtpd.conf
pwcheck_method:saslauthd
mech_list:plain login
配置postfix使用cyrus-sasl进行认证
[root@cp-rdsrv00~]# vim /etc/postfix/main.cf
在最底部添加如下内容
#################postfix中跟cyrus-sasl相关的配置################################
smtpd_sasl_auth_enable= yes
smtpd_sasl_local_domain= $myhostname
#broken_sasl_auth_clients定义是否支持向outlook,foxmail等非标准认证协议
broken_sasl_auth_clients= yes
#定义允许哪些限制,拒绝哪些限制,哪些规则不认证也是接受的或者拒绝的smtpd_recipient_restrictions= permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
#telnet时不显示smtp软件信息
smtpd_banner= welcome to our mailsystem
配置完成后重启postfix服务
[root@cp-rdsrv00~]# service postfix restart
Shuttingdown postfix: [ OK ]
Startingpostfix: [ OK ]
再次在从windows客户端使用telnet命令向服务器发送邮件进行测试,但是这次我们使用telnet时,我们先登录认证一下,认证时需要输入的用户名和密码,但是我们输入的用户名和密码一定要转换成base64的编码形式才行,例如我的用户名是testuser 我的密码是123,我们需要在服务器端将用户名和密码转换编码后复制,然后再需要输入的时候粘贴
例如,现在服务器将用户名和密码转换编码格式,记住一定要加 –n 参数哦,否则测死你你也测不出来,切记啊,骚年,我就是吃了这个亏的,白测了一个星期
[root@cp-rdsrv00~]# echo -n 'testuser' | openssl base64
dGVzdHVzZXI=
[root@cp-rdsrv00~]# echo -n '123' | openssl base64
MTIz
然后再在windows客户端中使用telnet命令
220mail.test.com ESMTP Postfix
authlogin
334VXNlcm5hbWU6
dHR1c2Vy
334UGFzc3dvcmQ6
dHR1c2Vy
2352.7.0 Authentication successful
mailfrom:asd@af.com
2502.1.0 Ok
rcptto:root@mail.test.com
2502.1.5 Ok
data
354End data with <CR><LF>.<CR><LF>
Subject:testsasl111
testsasl111
.
2502.0.0 Ok: queued as 0AB2DE0100
quit
2212.0.0 Bye
测试后未收到邮件
查看日志
Sep10 00:27:33 cp-rdsrv00 postfix/smtp[17521]: 44E96E00A6: to=<root@mail.test.com>,relay=none, delay=27, delays=27/0.01/0/0, dsn=5.4.6, status=bounced (mail formail.test.com loops back to myself)
更改了postfix 中的 mydestination选项
mydestination= localhost,$myhostname
重启postfix
再次测试,auth login 验证通过后发邮件,服务器端收到刚才发的邮件,证明sasl验证没有问题了
5.配置dovecot(收邮件)
[root@cp-rdsrv00 log]# yum install dovecot
Dovecot安装以后修改配置文件,在rhel6中,dovecot的配置文件已经模块化,不同功能的配置在相对应的配置文件中,首先,更改dovecot的主配置文件
[root@cp-rdsrv00 ~]# cd /etc/dovecot/
[root@cp-rdsrv00 ~]# cp dovecot.conf dovecot.conf.back
[root@cp-rdsrv00 ~]# vim/etc/dovecot/dovecot.conf
将#protocols = imap pop3 lmtp的注释去掉,因为这里只是用pop3的服务,所以配置如下
protocols = pop3
同时找到#login_trusted_networks = 将注释去掉,同时制定允许登陆的网段地址,为了方便,我们设置为0.0.0.0/0,更具自己的情况进行设定。
login_trusted_networks = 0.0.0.0/0
在主配置文件的最下方,我们可以看到!include conf.d/*.conf,所以,其他配置,我们进入对应的配置文件配置
[root@cp-rdsrv00 dovecot]# cp -R conf.d/conf.d.back
[root@cp-rdsrv00 dovecot]# cd conf.d
[root@cp-rdsrv00 conf.d]# vim 10-mail.conf
找到# mail_location =mbox:~/mail:INBOX=/var/mail/%u
将注释去掉,如下
mail_location =mbox:~/mail:INBOX=/var/mail/%u
重启dovecot服务
[root@cp-rdsrv00 conf.d]# service dovecotrestart
Stopping Dovecot Imap: [ OK ]
Starting Dovecot Imap: [ OK ]
开始测试
测试步骤,向测试用户发邮件,确定发送成功后,使用收邮件用户的身份telnet查看收到的邮件
为了测试方便,让postfix发邮件进行测试的时候不会status=bounced,所以更改postfix的mydestination设置调整为如下
mydestination =localhost,$myhostname,localhost.$mydomain,$mydomain
重启postfix
然后向测试用户发送一封邮件
[root@cp-rdsrv00 ~]# mail -vs 'testtest' ttuser
然后在服务器端或者windows客户端使用telnet命令进行测试
telnet mail.test.com 110
Looking up host 'mail.test.com'...
Host 'mail.test.com' resolved to 192.168.88.88.
Connecting to 192.168.88.88:110...
Connection established.
Escape character is '^@]'.
+OK Dovecot ready.
user ttuser
+OK
pass ttuser
+OK Logged in.
stat
+OK 1 491
LIST (注:LIST大写)
+OK 1 messages: (注:可以看到有一封邮件)
1 491
.
RETR 1 (注:使用RETR 加序号 查看对应邮件)
查看完成,quit退出
测试成功
[root@cp-rdsrv00 yum.repos.d]# chkconfigdovecot on
6.过渡
现在我们可以使用postfix发件,发件时可以使用cyrus-sasl进行简单的认证,可以使用dovecot收件了,基本的邮件功能我们已经实现,但是,现实的邮件系统中,我们不可能为每个用户创建一个服务器上面的系统用户,这样非常不安全,而且维护麻烦,所以我们要使用虚拟用户,因为我们要使用虚拟用户,所以我们需要安装一个数据库(这里使用mysql),数据库中存放虚拟用户的信息,例如:每个用户的用户名,密码,邮箱目录,邮件信息等,但是postfix没有认证功能,虽然我们已经配置了cyrus-sasl进行简单认证,但是如果要对虚拟用户进行认证,还远远不够,为了达到目的,我们还需要依赖一个认证库(这里使用courier-authlib),让postfix同时使用cyrus-sasl和courier-authlib对mysql数据库中的虚拟用户进行认证,这样我们就能够达到在发件时对虚拟用户进行认证的目的,同时,我们在收件时也需要进行认证,但是因为dovecot天生就有基于mysql的认证功能,所以,我们不用再安装别的软件,只需要对dovecot进行相应的配置,还有,因为我们需要使用虚拟用户,所以我们需要在数据库中创建一个我们邮件系统使用的数据库,数据库中需要创建一些表,一些字段,来存放我们的数据,但是这些表之间的关系字段之间的关系我们可不了解,怎么办,不用怕,extmail已经为我们准备好了一些模板,和一些命令,我们只要执行相对应的命令,就可以创建一个我们需要的库,然后就可以使用extmail的web页面进行收发邮件了,同时,我们可以使用extman对我们的邮件系统进行配置和管理,这样,我们就有了一个非常好用的web端的MUA了,这段话只是为了理清思路,我们继续向下进行。
7安装mysql(数据库)
因为courier-authlib会需要mysql的一些配置路径,所以,为了保险起见,我们先安装mysql
[root@cp-rdsrv00 yum.repos.d]# yum listinstalled | grep mysql
Unable to read consumer identity
mysql.x86_64 5.1.61-4.el6 @localyum
mysql-devel.x86_64 5.1.61-4.el6 @localyum
mysql-libs.x86_64 5.1.61-4.el6 @anaconda-*
mysql-server.x86_64 5.1.61-4.el6 @localyum
[root@cp-rdsrv00 lib]# cd /usr/bin/
[root@cp-rdsrv00 bin]# ./mysql_install_db
然后执行如下命令(注:命令后面有&)
[root@cp-rdsrv00 bin]# mysqld_safe &
启动mysql服务
[root@cp-rdsrv00 bin]# /etc/init.d/mysqldstart
Starting mysqld: [ OK ]
测试
[root@cp-rdsrv00 bin]# mysql
添加自动启动
[root@cp-rdsrv00 bin]# chkconfig mysqld on
8配置courier-authlib(认证库)
因为我们已经配置过EMOS的本地的yum源,所以我们我们直接yum安装courier-authlib
[root@cp-rdsrv00 yum.repos.d]# yum list |grep emosyum | grep courier
Unable to read consumer identity
courier-authlib.x86_64 0.62.4-1.el6.FT emosyum
courier-authlib-devel.x86_64 0.62.4-1.el6.FT emosyum
courier-authlib-mysql.x86_64 0.62.4-1.el6.FT emosyum
[root@cp-rdsrv00 yum.repos.d]# yum installcourier-authlib courier-authlib-devel courier-authlib-mysql
设置authdaemon目录权限为755
[root@cp-rdsrv00 authdaemon]# chmod -R 755/var/spool/authdaemon/
[root@cp-rdsrv00 authlib]# pwd
/etc/authlib
[root@cp-rdsrv00 authlib]# cp authmysqlrcauthmysqlrc.back
[root@cp-rdsrv00 authlib]# cp authdaemonrcauthdaemonrc.back
首先,配置authdaemonrc文件,此文件是一些认证的配置
[root@cp-rdsrv00 authlib]# vim authdaemonrc
找到authmodulelist参数,这个选项表示courier-authlib支持使用哪些模块进行认证,我们可以把不用的模块删除,只剩下mysql
authmodulelist="authmysql"
authmodulelistorig参数同理
authmodulelistorig="authmysql"
daemons=5 此参数表示一共启动几个进程
authdaemonvar目录为我们刚才权限改为755的目录
authdaemonvar=/var/spool/authdaemon
DEBUG_LOGIN=0 表示是否打开调试日志 ,1打开,0关闭,2打开并记录密码,2可在测试的时候使用,正常使用最好选0或1
然后编辑authmysqlrc文件,此文件为一些mysql认证相关配置
[root@cp-rdsrv00 authlib]# vim authmysqlrc
使用如下配置
MYSQL_SERVER localhost 此配置表示mysql服务地址
MYSQL_USERNAME extmail 表示使用哪个数据库用户到数据库中进行认证
MYSQL_PASSWORD extmail 数据库用户对应的密码
MYSQL_SOCKET /var/lib/mysql/mysql.sock
此选项制定mysql的套接字文件路径,我是用的是rpm包安装的,所以路径应该为上述路径,如果不确定,请使用find命令进行查找
[root@cp-rdsrv00 ~]# find / -namemysql.sock
/var/lib/mysql/mysql.sock
MYSQL_PORT 3306 设置mysql对应的端口号
MYSQL_OPT 0 保持默认即可
MYSQL_DATABASE extmail 指定连接哪个库进行认证
MYSQL_USER_TABLE mailbox 指定去哪张表获取用户账号信息,因为extmail脚本生成的数据库中在mailbox这张表中存放用户信息,所以更改之,下面的密码和用户名同理。
MYSQL_CRYPT_PWFIELD password 制定去哪个字段获取用户密码进行认证
MYSQL_UID_FIELD 2525 需要与postfix用户id保持一致
MYSQL_GID_FIELD 2525 需要与postfix属组保持一致
MYSQL_LOGIN_FIELD username 虚拟用户使用哪个字段作为登陆的用户名
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir) 如此配置表示将两个路径连接起来,/var/mailbox这个路径目前还没有,我们会在后面创建,注意mailbox路径后需要加/。
MYSQL_NAME_FIELD name 保持默认
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir) 将注释去掉并更改,制定邮件目录配置
保存退出
启动服务
[root@cp-rdsrv00 authlib]# servicecourier-authlib start
Starting Courier authentication services:authdaemond
确定服务是否启动争取
[root@cp-rdsrv00 authlib]# cd/var/spool/authdaemon/
到此目录下,查看是否存在socket文件,这个目录的配置文件只有courier服务启动时才会存在
[root@cp-rdsrv00 authdaemon]# ll
total 4
-rw-r--r-- 1 root root 5 Sep 10 22:42 pid
-rw------- 1 root root 0 Sep 10 22:42pid.lock
srwxrwxrwx 1 root root 0 Sep 10 22:42socket
配置自动启动
[root@cp-rdsrv00 authlib]# chkconfigcourier-authlib on
到此为止,courier-authlib的配置暂时截止,虽然配置完成,也启动了服务,但是我们还没有办法使用,因为我们还没有初始化数据库,所以那些表和字段都还不存在,我们继续
9整合postfix与courier
新建虚拟用户邮箱所在目录,并对postfix用户授权
[root@cp-rdsrv00 authdaemon]# mkdir -pv/var/mailbox
(注:此目录为我们在courier中配置的目录)
mkdir: created directory `/var/mailbox'
[root@cp-rdsrv00 mailbox]# chown -R postfix/var/mailbox/
重新配置smtp认证,因为我们一开始为了配置简单认证,使用的认证方式是saslauthd,现在要结合courier进行认证,所以更改为authdaemond的认证方式
[root@cp-rdsrv00 mailbox]# vim/etc/sasl2/smtpd.conf
更改如下
pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
log_level:3
#注:日志级别3,为调试级别,运行正常后可将此项注释
authdaemond_path:/var/spool/authdaemon/socket
#注:此路径为courier-authlib的socket路径
10配置postfix使之支持虚拟域和虚拟用户
[root@cp-rdsrv00 docs]# vim/etc/postfix/main.cf
在最下方加入如下内容
#####################virtualmailbox##########################
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps =mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains =mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_domains =
virtual_alias_maps =mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:2525
virtual_gid_maps = static:2525
virtual_transport = virtual
配置完成后保存退出,目前不需要重启postfix,因为目前这些mysql的虚拟用户的相关配置文件我们还没有(例如/etc/postfix/mysql_virtual_mailbox_maps.cf),我们先把配置文件的路径写入,这些配置文件在extman的包中已经包含,我们会在以后复制过去就可以直接使用,而且我们现在也没有初始化数据库,所以不要重启postfix
注:
virtual_mailbox_base 虚拟用户邮箱位置(跟courier保持一致)
virtual_mailbox_maps 虚拟用户邮箱的映射,哪个用户访问哪个邮箱等等相关信息
virtual_mailbox_domains 主要为哪些域收发邮件,虚拟域配置
virtual_alias_domains 虚拟域别名配置
virtual_alias_maps 虚拟用户别名配置
virtual_uid_maps = static:2525 每个虚拟用户都映射为哪个系统用户
virtual_gid_maps = static:2525
virtual_transport = virtual 虚拟投递代理使用哪个代理
继续配置,启用虚拟域以后,需要取消中心域,即注释掉myhostname,mydestination,mydomain,myorign几个参数,当然,你也可以吧mydestination的值改为自己需要的
[root@cp-rdsrv00 docs]# vim/etc/postfix/main.cf
注释掉以下几项
#mydestination = localhost,$myhostname,localhost.$mydomain,$mydomain
#myhostname = mail.test.com
#mydomain = test.com
#myorigin = $mydomain
保存退出,不要重启,等我们初始化数据库后再重启
11初始化数据库
先将extman包解压
[root@cp-rdsrv00 ~]# cd/opt/softtoinstall/extmail/
[root@cp-rdsrv00 extmail]# tar -xvf extman-1.1.tar.gz
[root@cp-rdsrv00 docs]# pwd
/opt/softtoinstall/extmail/extman-1.1/docs
[root@cp-rdsrv00 docs]# cp mysql_virtual_*/etc/postfix/
将所有mysql_virtual开头的文件复制到postfix目录下,这些文件都是postfix会用到的配置文件,这样,我们刚才配置postfix支持虚拟域和虚拟用户的配置文件才会存在,否则,postfix将找不到对应的配置文件
使用extman源码目录下的docs目录中的extmail.sql和init.sql建立数据库
但是,这两个sql脚本中的关键字和当前版本的mysql支持的关键字不一样,我们还需要小小更改一下
找到extmail.sql和init.sql , 执行如下命令替换这两个配置文件中的关键字
[root@cp-rdsrv00 docs]# pwd
/opt/softtoinstall/extmail/extman-1.1/docs
[root@cp-rdsrv00 docs]# sed -i 's@TYPE=MyISAM@Engine=MyISAM@g'extmail.sql
[root@cp-rdsrv00 docs]# sed -i's@TYPE=MyISAM@Engine=MyISAM@g' init.sql
然后执行这两个脚本,初始化数据库,执行次序:先执行extmail.sql 后执行init.sql,使用如下命令执行脚本
注:目前使用root登陆mysql没有密码,如果提示输入密码,直接回车即可,如果设置了密码,请输入对应密码。
[root@cp-rdsrv00 docs]# mysql -uroot -p< extmail.sql
Enter password:
[root@cp-rdsrv00 docs]# mysql -uroot -p< init.sql
Enter password:
进入mysql查看是否初始化成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| extmail |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
然后创建数据库用户,因为我们在courier-authlib中配置的数据库用户名和密码是都是extmail,所以这里一定要对应。
mysql> grant all privileges on extmail.*to extmail@localhost identified by 'extmail';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on extmail.*to extmail@127.0.0.1 identified by 'extmail';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
数据库初始化完成,重启postfix
[root@cp-rdsrv00 docs]# service postfixrestart
Shutting down postfix: [ OK ]
Starting postfix: [ OK ]
重启成功,postfix配置告一段落,我们继续
12配置dovecot基于mysql进行认证
Postfix配置完了,我们开始配置dovecot
[root@cp-rdsrv00 docs]# vim/etc/dovecot/conf.d/10-mail.conf
将我们原先的配置注释掉
#mail_location =mbox:~/mail:INBOX=/var/mail/%u
改成
mail_location =maildir:/var/mailbox/%d/%n/Maildir
注:%d表示对应的虚拟域,%n表示对应的虚拟用户名
[root@cp-rdsrv00 docs]# vim /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain 保持不变
在配置文件的最下方,应该可以看到默认包含使用哪个认证配置
!includeauth-system.conf.ext
#!includeauth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext
改为使用sql的认证的配置文件
#!includeauth-system.conf.ext
!includeauth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext
[root@cp-rdsrv00 docs]# vim/etc/dovecot/conf.d/auth-sql.conf.ext
passdb改为如下
passdb {
driver = sql
#Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
#args = /etc/dovecot/dovecot-sql.conf.ext
args = /etc/dovecot/dovecot-mysql.conf
}
同理userdb改为如下
userdb {
driver = sql
#args = /etc/dovecot/dovecot-sql.conf.ext
args = /etc/dovecot/dovecot-mysql.conf
}
但是dovecot-mysql.conf目前还不存在,我们需要手动创建,当然,也可以把dovecot-sql.conf.ext复制一下,然后更改
[root@cp-rdsrv00 conf.d]# find / -namedovecot-sql.conf.ext
find: File system loop detected;`/var/named/chroot/var/named' is part of the same file system loop as`/var/named'.
/usr/share/doc/dovecot-2.0.9/example-config/dovecot-sql.conf.ext
[root@cp-rdsrv00 conf.d]# cp/usr/share/doc/dovecot-2.0.9/example-config/dovecot-sql.conf.ext/etc/dovecot/dovecot-mysql.conf
[root@cp-rdsrv00 docs]# vim/etc/dovecot/dovecot-mysql.conf
更改如下
driver = mysql
connect = host=/var/lib/mysql/mysql.sockdbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username ASuser,password AS password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, uidnumber ASuid,gidnumber AS gid FROM mailbox WHERE username = '%u'
注释:
driver = mysql 表示使用mysql驱动连接
connect = host=/var/lib/mysql/mysql.sockdbname=extmail user=extmail password=extmail
表示怎样连接数据库,因为我们的数据库在本机,所以直接使用本机的mysql套接字连接,
可以使用find命令查找mysql.sock的位置,加以更改
default_pass_scheme = CRYPT 表示我们的密码为加密存放
password_query = 定义的语句表示已哪个用户登录就以用户名为条件查询。
user_query = 同上为sql语句
因为我们使用了driver=mysql参数,所以我们需要安装dovecot-mysql,否则dovecot无法使用mysql驱动
[root@cp-rdsrv00 extmail]# yum installdovecot-mysql
重启dovecot服务
[root@cp-rdsrv00 docs]# service dovecotrestart
Stopping Dovecot Imap: [ OK ]
Starting Dovecot Imap: [ OK ]
Dovecot配置完成了
13配置httpd服务与extmail
因为我们的目标是使用extmail这个webmail,所以我们需要web服务器
安装httpd
[root@cp-rdsrv00 Packages]# yum listinstalled | grep httpd
Unable to read consumer identity
httpd.x86_64 2.2.15-15.el6_2.1 @anaconda-
httpd-tools.x86_64 2.2.15-15.el6_2.1 @anaconda-
extmail配置
extmail默认目录为/var/www/extsuite,所以创建此目录
然后将extmail和extman的网页复制到此目录并重命名即可
首先,找到extmail和extman的包,解压包
复制这两个文件夹及文件夹下所有内容到extsuite文件夹下,并命名为extmail和extman
[root@cp-rdsrv00 extmail]# cp -rextmail-1.2 /var/www/extsuite/extmail
[root@cp-rdsrv00 extmail]# cp -r extman-1.1/var/www/extsuite/extman
更改extmail相关配置文件
[root@cp-rdsrv00 extmail]# cd/var/www/extsuite/extmail/
[root@cp-rdsrv00 extmail]# cpwebmail.cf.default webmail.cf
如果你一直按照文档操作,默认路径什么的都不用改,更改一下默认语言
SYS_USER_LANG = zh_CN
确认认证方式是mysql
SYS_AUTH_TYPE = mysql
更改SYS_MAILDIR_BASE选项,需要对应我们之前的邮件路径
SYS_MAILDIR_BASE = /var/mailbox
然后更改mysql相关设置
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET =/var/lib/mysql/mysql.sock
数据库用户名密码要与之前的对应,我们使用默认
mysql.sock的套接字文件路径可使用find命令确认
找到SYS_AUTHLIB_SOCKET配置选项,确认courier-authlib的套接字文件路径
SYS_AUTHLIB_SOCKET =/var/spool/authdaemon/socket
因为yum安装默认路基为上述路径,保持默认即可
其他保持默认即可
保存退出
extman配置
更改extman相关配置文件
[root@cp-rdsrv00 extmail]# cd/var/www/extsuite/extman/
[root@cp-rdsrv00 extman]# cpwebman.cf.default webman.cf
[root@cp-rdsrv00 extman]# vim/var/www/extsuite/extman/webman.cf
同extmail一样,将SYS_MAILDIR_BASE 改为如下,与以前对应
SYS_MAILDIR_BASE = /var/mailbox
确认,SYS_SESS_DIR 目录如下,但是/tmp/extman/此运行时临时目录不存在,我们需要手动创建
SYS_SESS_DIR = /tmp/extman/
[root@cp-rdsrv00 authdaemon]# mkdir/tmp/extman
[root@cp-rdsrv00 authdaemon]# chown -Rpostfix.postfix /tmp/extman/
继续修改,SYS_CAPTCHA_ON = 1表示用户注册时需要填写验证码,改为0,如果改为1
需要安装perl-GD模块才能使用验证码功能,否则验证码无法正常显示。
SYS_CAPTCHA_ON = 0
下面这两个id一定要与邮件投递用户保持一致,所以,跟我们postfix保持一致
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
下面为一些默认磁盘配置,可保持默认
# maxquota, alias, users and netdisk quotafor domain
SYS_DEFAULT_MAXQUOTA = 500
SYS_DEFAULT_MAXALIAS = 100
SYS_DEFAULT_MAXUSERS = 100
SYS_DEFAULT_MAXNDQUOTA = 500
# per user default quota, netdisk quota andexpire
SYS_USER_DEFAULT_QUOTA = 5
SYS_USER_DEFAULT_NDQUOTA = 5
SYS_USER_DEFAULT_EXPIRE = 1y
找到mysql数据库相关配置,确认如下,当然,我们还没有创建webman这个数据库用户,一会儿创建,mysql.sock路径仍然要与以前保持一致,这里默认就行。
SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET =/var/lib/mysql/mysql.sock
其他保持默认即可
保存退出
为了保持默认,我们还需要在mysql数据库中创建一个webman数据库用户
mysql> grant all privileges on extmail.*to webman@localhost identified by 'webman';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on extmail.*to webman@127.0.0.1 identified by 'webman';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
更改extmail和extman两个目录下cgi目录的属主
[root@cp-rdsrv00 /]# chown -Rpostfix.postfix /var/www/extsuite/extmail/cgi/
[root@cp-rdsrv00 /]# chown -Rpostfix.postfix /var/www/extsuite/extman/cgi/
httpd配置
配置httpd,创建虚拟主机
[root@cp-rdsrv00 extmail]# cp/etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.back
[root@cp-rdsrv00 extmail]# vim/etc/httpd/conf/httpd.conf
启用NameVirtualHost 选项,将前面的注释去掉
NameVirtualHost *:80
在尾部添加如下内容,添加虚拟主机,根据自己的情况适当修改,
<VirtualHost *:80>
ServerName mail.test.com
DocumentRoot/var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi/var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
ScriptAlias /extman/cgi/var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
#suexecUserGroup postfix postfix
</VirtualHost>
注:
ServerName 虚拟主机名
DocumentRoot 对应刚才extmail中html路径
ScriptAlias 脚本路径别名
Alias 路径别名
#suexecUserGroup postfix postfix 由于/var/mailbox需要用postfix用户访问,但是运行web进程的用户默认为apache用户,所以为了让apache在运行extmail的webmail的时候使用的用户为postfix,可以使用suexecUserGroup参数,suexecUserGroup参数表示为运行extmail这个程序的时候,httpd进程的用户任然为apache,但是一旦当程序访问到DocumentRoot/var/www/extsuite/extmail/html/这些路径的时候,就临时的切换到postfix用户和用户组里面,但是需要注意,如果需要使用suexecUserGroup参数,需要httpd支持suexec的功能,
但是我们没有添加suexec模块,所以我们注释掉此参数,使用另一种方法达到目的,直接把运行httpd进程的用户和组直接改为postfix,如果使用suexec,不用修改用户和用户组配置。
将默认使用apache用户直接改为使用postfix用户
#User apache
#Group apache
User postfix
Group postfix
因为我们建立了虚拟主机,所以取消中心主机
注释掉DocumentRoot
#DocumentRoot "/var/www/html"
保存退出
检查语法
[root@cp-rdsrv00 extmail]# service httpdconfigtest
Syntax OK
[root@cp-rdsrv00 emosyum]# service httpdstart
Starting httpd: [ OK ]
[root@cp-rdsrv00 ~]# chkconfig httpd on
因为extmail是基于Perl写成的,所以需要依赖一些Perl的模块,我们才能够正常访问所
[root@cp-rdsrv00 emosyum]# yum installperl-Unix-Syslog
14访问及设置
检查需要的服务是否都已经开机启动
[root@cp-rdsrv00 ~]# chkconfig | grep -E'named|postfix|saslauthd|courier-authlib|dovecot|httpd|mysqld'
courier-authlib0:off1:off2:on3:on4:on5:on6:off
dovecot 0:off1:off2:on3:on4:on5:on6:off
httpd 0:off1:off2:on3:on4:on5:on6:off
mysqld 0:off1:off2:on3:on4:on5:on6:off
named 0:off1:off2:on3:on4:on5:on6:off
postfix 0:off1:off2:on3:on4:on5:on6:off
saslauthd 0:off1:off2:on3:on4:on5:on6:off
我们现在从windows客户端进行访问测试
添加网络中的dns服务器或者修改host文件,是本地客户端可以访问mail.test.com
在浏览器中输入http://mail.test.com
选择登陆邮箱管理,可进入extman对extmail邮件系统进行配置
超管默认密码extmail*123*
登陆到extman管理后台,点击 域列表 --- 添加域
添加test.com
其他的按需配置
欢迎访问个人博客地址:http://www.zsythink.net/