Postfix+Cyrus-sasl+courier-authlib+Dovecot+extmail+extman
一、 前提条件:
本实验是在LAMP平台上再做的。因为Extmail和Extman都需要Mysql和Apache的支持。
二、 安装Postfix:
1、如果现有的Linux系统中安装了Sendmail,则要把Sendmail给卸载:rpm -e sendmail --nodeps,或者把Sendmail服务停用。Service Sendmail Stop、Chkconfig  Sendmail Off
 
 
2、添加Postfix服务的用户postfix、组postfix postdrop
# groupadd –g 1100 postdrop
# groupadd –g 1000 postfix
# useradd –M –u 1000 –g 1000 –G 1100 –s /sbin/nologin postfix
 
 
3、将Postfix源码包解压到“/usr/src”目录中:
# tar zxf /mnt/postfix-2.9.0.tar.gz   –C   /usr/src
# cd /usr/src/postfix-2.9.0
 
 
4、预配置编译参数:
在编译前需要使用“make makefiles”命令来调整编译参数,以便Postfix支持SASL认证和查询Mysql数据库。具体的编译参数可以参考源码目录中的README_FILES子目录下的说明文件,例如:SASL_README文件和MYSQL_README文件。现在我采用的是系统自带的cyrus-sasl认证软件,所以Mysql、Cyrus-sasl的库文件和头文件安装位置对编译参数CCARGS和AUXLIBS进行适当调整。如下:
****在编译的时候有一个Mysql的库文件会提示找不到,其实是有的,就在/usr/local/mysql/lib/这个目录下,既然它提示找不到,那我就把它cp到/usr/lib/目录下面,果然问题解决了。
 #cp /usr/local/mysql/lib/libmysqlclient.so.15 /usr/lib/
#make makefiles \
'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH \
-DUSE_CYRUS_SASL -I/usr/include/sasl' \
'AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 '
---注意:如果mysql是5.5.2版本的话,它的库路径不再是这个了,是/usr/local/mysql/lib/ ,还有就是在输入上面这些参数的时候一定要注意,不要出错,切记!切记!
 
其中编译参数CCARGS和AUXLIBS的作用如下:
◎CCARGS参数:为编译器提供额外的参数,“-I"选项指出标准的额外头文件的存放目录。例如,mysql和cyrus-sasl的头文件分别位于目录:/usr/local/mysql/lib/mysql、/usr/include/sasl
◎AUXLIBS参数:指出位于标准位置外的额外函数库。如果需要链接SASL、Mysql或者任何其它函数库,而且它们不是存放在标准位置(/usr/lib/目录),则必需在AUXLIBS参数中指出这些函数库的路径。例如mysql和cyrus-sasl的库文件分别位于目录:/usr/local/mysql/lib/mysql、/usr/lib/sasl2
 
 
5、编译并进行安装:
# make
# make install   (执行make install 后会出现一些安装参数的设置,直接按回车保持默认就行了)。
 
 
 6、安装完成后,可以通过postconf -n 来得到一个与系统默认配置不同的配置文件,具体做法如下:
 #postconf -n > main2.cf
 #mv main.cf main.cf.bak
 #mv main2.cf main.cf
 
 
7、postfix的基本配置:
 #vi /etc/postfix/main.cf
 myhostname=mail.xfzhou.com     --设置服务器的主机名
 mydomain=xfzhou.com    --设置域名
 inet_interfaces=192.168.10.200,127.0.0.1 --设置服务器侦听的IP
 myorigin=$mydomain    --设置外发邮件时发件人的邮件域名
 #mydestination=$myhostname,$mydomain  --设置服务器可以接收的邮件中的域名,录有虚拟域的时候要把这项给注销了!
 home_mailbox=Maildir/    --设置邮件的存储方法,有两方式,一种是Mailbox,一种是Maildir,Mailbox的存储方式比 较老了,它是把同一个用户的邮件放在同一个文件中,存放的位置是在/var/spool/mail/下面,以用户名命名,使用这种方式,当用户的 邮件比较多的时候,找邮件就有点麻烦了。而Maildir存储方式是在/var/spool/mail/文件夹下面为每个用户创建一个文件夹,然后在用户 的文件夹里,每封邮件使用单独的文件来存储。
 
 ##########################Virtual user setting##########################
 virtual_mailbox_base = /mailbox       //指定虚拟邮箱存储目录的起点
 virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf  //指定虚拟用户对应的别名位置
 virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf //指定记录虚拟邮箱地址与存储位置对应关系的 映射文件位置
 virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf //设置postfix服务器可以接收的虚拟邮件域的域 名,作用类似于mydestination 
 virtual_uid_maps = static:1000  //设置所有虚拟邮件用户映射的本地用户的UID号
 virtual_gid_maps = static:1000  //设置所有虚拟邮件用户映射的本地用户的GID号
 
 #######################Sasl Authentication Setting#################
 smtpd_sasl_auth_enable = yes
 smtpd_sasl_security_options = noanonymous
 mynetworks = 127.0.0.1
 smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
:wq
 
 
8、将extman下面的docs里面的虚拟用户映射表样例文件都复制到/etc/postfix目录下面(我是提前把extmail、extman解压到了htdocs目录下面):
 [root@mail extman]# cp ./docs/mysql_virtual_* /etc/postfix/
 [root@mail extman]#
Postfix服务的控制:postfix start|stop|check|reload

 
三、Courier-authlib的安装,这个软件是为了弥补cyrus-sasl的不足的,cyrus-sasl只能做本地认证,不支持数据库认证。
 
  1、#tar jxf /mnt/courier-authlib-0.63.0.tar.bz2
 #cd courier-authlib-0.63.0
 #./configure --prefix=/usr/local/courier-authlib --without-stdheaderdir --with-authmysql --with-mysql- libs=/usr/local/mysql/lib/mysql/ --with-mysql-includes=/usr/local/mysql/include/mysql
 #make && make install
 #make install-configure ---生成默认的配置文件authmysqlrc和authdaemonrc
 
 在./configure编译的时候出现如下提示:
 configure: WARNING: -----------------------------------------------------
 configure: WARNING: expect not found - will not be able to change passwds
 configure: WARNING: in webmail
 configure: WARNING: -----------------------------------------------------
其实对于这种提示,不用担心的,事后经我测试发现是可以修改密码的!
 
 
  2、将courier-authlib的库路径添加到系统的搜索的路径中。
 #vi /etc/ld.so.conf
  /usr/local/courier-authlib/lib/courier-authlib
  :wq
 #ldconfig  ---加载设置
 
 
3、修改authdaemonrc主配置文件,仅保存authmysql认证方式,去掉其它方式:
 vi /usr/local/courier-authlib/etc/authlib/authdaemonrc
 authmodulelist="authmysql"
 authmodulelistorig="authmysql"
 :wq
 
 
4、修改authdaemon这个文件夹的权限为755,以便postfix用记能够读取,然后里面的方法。
 [root@mail courier-authlib]# chmod -R 755 /usr/local/courier-authlib/var/spool/authdaemon/
 
 
5、修改authmysqlrc文件,用于描述如何向mysql数据库查询信息:
 MYSQL_SERVER localhost -----mysql数据库服务器位置
 MYSQL_USERNAME extmail  -----extmail这个数据库的管理员的用户名
 MYSQL_PASSWORD extmail  -----管理员的密码
 MYSQL_PORT              3306    -----设置mysql服务器监听的端口,默认是0
 MYSQL_SOCKET /tmp/mysqld.sock ----指定mysql.sock的位置
 MYSQL_DATABASE extmail  -----指定虚拟用户的数据库名称
 MYSQL_USER_TABLE mailbox -----从mailbox表来获得邮件用户的信息
 MYSQL_CRYPT_PASSWD password ----从password字段获得帐户密码
 MYSQL_UID_FILED  uidnumber ----从uidnumber来获得映射的本地用户的UID
 MYSQL_GID_FILED  gidnumber ----从gidnumber来获得映射的本地用户的GID
 MYSQL_LOGIN_FILED username ----从username字段来获得帐户名称(带@后缀的)
 MYSQL_HOME_FILED concat('/mailbox',homedir)  ----合并出用户的宿主目录路径
 MYSQL_NAME_FILED name -----从name字段获得帐户名称(不带@后缀)
 MYSQL_MAILDIR_FILED concat('/mailbox',maildir)   ---合并出用户的邮件存储路径
 :wq
 
 
6、复制courier-authlib的服务脚本courier-authlib.sysvinit到/etc/init.d/目录下,并设置为开机自动启动。
 [root@mail authlib]# cd /usr/src/courier-authlib-0.63.0/
 [root@mail courier-authlib-0.63.0]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib
 [root@mail courier-authlib-0.63.0]# chmod 755 /etc/init.d/courier-authlib
 [root@mail courier-authlib-0.63.0]# chkconfig --add courier-authlib
 [root@mail courier-authlib-0.63.0]# chkconfig --level 35 courier-authlib on
 [root@mail courier-authlib-0.63.0]# chkconfig --list courier-authlib
 courier-authlib 0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
 [root@mail courier-authlib-0.63.0]#
 
 
7、修改cyrus-sasl的设置:(我的理解是让cyrus-sasl把认证的请求转发给courier-authlib这个程序,让courier-authlib可以查询数据库)
vi /usr/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
authdaemond_path: /usr/local/courier-authlib/var/spool/authdaemon/socket
:wq
 
 
8、把saslauthd服务也改成开机自启动,不然在做认证的时候,会提示认证不成功,我做的时候就遇到这种情况,很是无语!!
 #chkconfig --level 35 saslauthd on
 #service saslauthd start
 
 
四、 构建Dovecot服务器:(如果使用的是dovecot-2.的版本的话,还要建立一个dovenull用户,再有就是它的配置文件不能像下面这样来写有点小复杂,所以我又换到1.0的版本了,不过做还是可以做的,只是它把几个配置文件相互关联,不是写在一个文件里而已。)
 
1、添加Dovecot要用的程序用户:
 # useradd -M -s /sbin/nologin dovecot  (-M 是不创建属主目录)
 
 
2、编译安装Dovecot软件包:
 # tar zxf dovecot-1.2.16/.tar.gz -C /usr/src
 # cd dovecot-1.2.16/
 # ./configure --sysconfdir=/etc/ --with-mysql 
 # make && make install
 
 
3、复制配置文件到/etc/目录下面,并修改相关内容:
 #cp /usr/local/share/doc/doevcot/example-config/dovecot.conf /etc/
 #vi /etc/dovecot.conf
 protocols = imap pop3
 mail_location = maildir:/mailbox/%d/%n/Maildir
 
 auth default {
        mechanisms = plain
        passdb sql {
                args = /etc/dovecot/dovecot_mysql.conf
        }
        userdb sql {
                args = /etc/dovecot/dovecot_mysql.conf
        }
 }
 :wq
 
 
4、建立dovecot数据查询文件了:
 [root@mail etc]# vi /etc/dovecot/dovecot_mysql.conf
 driver = mysql
 connect = host=localhost dbname=extmail user=extmail password=extmail
 default_pass_scheme = CRYPT
 password_query = SELECT username AS user,password AS password FROM mailbox WHERE username='%u'
 user_query = SELECT maildir,uidnumber AS uid,gidnumber AS gid FROM mailbox WHERE usernmae='%u'
 :wq

 
五、构建extmail、extman邮件Web平台,其中extmail是给普通用户来登陆邮箱使用的,extman是供管理员来管理邮件后台的。
 
1、先来说说extmail,前面我已经把extmail-1.2.tar.gz 和 extman-1.1.tar.gz这两个文件都解压到了网站的根目录/usr/local/apache/htdocs/下面,并给它们分别重命名为extmail、extman。现在就要用到extman/docs/里面的extmail.sql init.sql这两个文件导入到mysql数据库中去建相关的数据库和表。
 #mysql -u root -p < extmail.sql  ---这个是导入extmail数据库的一些模板。
 #mysql -u root -p < init.sql    ---这个是初始化extmail这个数据库。这两个的顺序不能错,想下应该先有数据库,再来初始化它。
 ***这里要注意的是如果你使用的是mysql-5.5.2及以上的版本的话,就要修改下extmail.sql这个文件,因为5.5的版本它不在支持使用 TYPE=MyISAM  这样的写法,要把“TYPE”改成:“ENGINE”就行了。这里可以用VI去修改,完成后,就可以直接导入了,否则会报错的。
 
 
2、由于安装和运行extmail套件需要用到三个Perl软件包:Unix-Syslog、DBI和DBD-MySQL。这些软件都可以从 www.chinaunix.net 这个网站上去下载的。下面就按顺序来安装这三个Perl软件包:
 
A、安装Unix-Syslog-1.1.tar.gz:
  #cd Unix-Syslog-1.1
  #perl Makefile.PL
  #make && make install
 
 B、安装DBI-1.607.tar.gz:
  #cd DBI-1.607
  #perl Makefile.PL
  #make && make install
 
 C、安装DBD-mysql-4.020.tar.gz:
  #cd DBD-mysql-4.020
  #perl Makefile.PL
  #make && make install
 
 
3、调整/usr/local/apache/htdocs/extmail/cgi/ 这个目录的权限,以便让apache服务器能够有权限执行suexec操作:
 #chown -R postfix:postfix cgi
 
 
4、建立并修改extmail的配置文件webmail.cf:
 在extmail这个目录下面有一个默认的配置文件webmail.cf.default,我这把它复制一份成为webmail.cf
 #cd /usr/local/apache/htdocs/extmail/
 #cp webmail.cf.default webmail.cf
 然后,再来修改webmail.cf这个配置文件:
 #vi webmail.cf
 SYS_CONFIG = /usr/local/apache/htdocs/extmail/  --程序根目录
 SYS_LANGDIR = /usr/local/apache/htdocs/extmail/lang  --语言包文件位置
 SYS_TEMPDIR = /usr/local/apache/htdocs/extmail/html  --系统模板的目录
 SYS_MAILDIR_BASE = /mailbox      --邮件的存储位置
 SYS_MYSQL_USER = extmail      --访问MYSQL的用户
 SYS_MYSQL_PASS = extmail      --访问MYSQL的用户的密码
 SYS_MYSQL_DB = extmail      --使用的数据库名称
 SYS_MYSQL_HOST = localhost      --指定MYSQL服务器的位置
 SYS_MYSQL_SOCKET = /tmp/mysql.sock    --MYSQL套接字文件位置
 
 
5、修改httpd.conf文件,给extmail添加一个虚拟主机(我这里使用的是同一IP,不同端口号的方法,80端口用来做普通用户使用邮件的访问,8080用来做管理员使用extman来管理的访问),这个添加完后要重新启动httpd这个服务。
 #vi /usr/local/apache/conf/httpd.conf
  Listen 192.168.10.200:80
  Listen 192.168.10.200:8080
  <VirtualHost 192.168.10.200:80>
   ServerName mail.xfzhou.com
   DocumentRoot /usr/local/apache/htdocs/extmail/html/
   ScriptAlias /extmail/cgi/ /usr/local/apache/htdocs/extmail/cgi/
   Alias /extmail /usr/local/apache/htdocs/extmail/html/
   SuexecUserGroup postfix postfix    --这里的配置,如果在编译apache的时候,没有开启这个功能,那还可以修改httpd.conf配置文件中的User postfix和Group postfix这两个地方来实现。
  </VirtualHost>
 
 现在来重启下httpd这个服务:
  #/usr/local/apache/bin/apachectl stop
  #/usr/local/apache/bin/apachectl start
 现在就可以使用 http://192.168.10.200来访问extmail了。
 
 
 6、安装和运行extman套件需要用到perl支持软件包GD、Fail-Tail和rrdtool绘图引擎工具包。GD软件包可以有效地解决extman登陆界面中图片验证无法显示的问题,Fail-Tail和rrdtool工具用于支持查看图形日志。
 
A、解压、安装GD软件包:
  #tar zxf GD-2.41.tar.gz
  #cd GD-2.41
  #perl Makefile.PL
  #make && make install
 
 B、解压、安装Fail-Tail软件包:
  #tar zxf File-Tail-0.99.3.tar.gz
  #cd File-Tail-0.99.3
  #perl Makefile.PL
  #make && make install
 
 C、安装rrdtool绘图引擎rpm包:
 #rpm -ivh rrdtool-1.2.23-3.e15.i386.rpm
 #rpm -ivh rrdtool-perl-1.2.23-3.e15.i386.rpm
 安装的时候如果没有办法一个一个的安装,那就用#rpm -ivh rrdtool-* 的方法来把两个一次性给安装了!
 
 
7、同样要调整extman的cgi目录的权限:
 #chown -R postfix:postfix cgi
 
 
8、编辑extman的配置文件webman.cf,基本上和那个webmail修改的一样,就是数据库的用户名和密码变了。
 #vi /usr/local/apache/htdocs/extman/webman.cf
 SYS_CONFIG = /usr/local/apache/htdocs/extman/
 SYS_LANGDIR = /usr/local/apache/htdocs/extman/lang
 SYS_TEMPDIR = /usr/local/apache/htdocs/extman/html
 SYS_MAILDIR_BASE = /mailbox      --邮件的存储位置
 SYS_MYSQL_USER = webman      --访问MYSQL的用户
 SYS_MYSQL_PASS = webman      --访问MYSQL的用户的密码
 SYS_MYSQL_DB = extmail      --使用的数据库名称
 SYS_MYSQL_HOST = localhost      --指定MYSQL服务器的位置
 SYS_MYSQL_SOCKET = /tmp/mysql.sock    --MYSQL套接字文件位置
:wq
 
 
9、再来给extman也来个虚拟主机,让管理员能够通过extman来管理邮件的后台:
 #vi /usr/local/apache/conf/httpd.conf
 <VirtualHost 192.168.10.200:8080>
  ServerName mail.xfzhou.com
  DocumentRoot /usr/local/apache/htdocs/extman/html/
  ScriptAlias /extmail/cgi/ /usr/local/apache/htdocs/extmail/cgi/
  Alias /extmail /usr/local/apache/htdocs/extmail/html/
  ScriptAlias /extman/cgi/ /usr/local/apache/htdocs/extman/cgi/
  Alias /extman /usr/local/apache/htdocs/extman/html/
  SuexecUserGroup postfix postfix
 </VirtualHost>
:wq
 
 
六、现在就可以通过 http://192.168.10.200:8080来访问extman了。现在我把在访问过程中可能会出现的问题写在下面:
 
 1、当你登陆的时候,如果一直提示你验证码错误,但是你确定你没有输入错误的时候,你就要看下,你电脑的时间和服务器的时间是不是相差的太远了,如果相差太远是登陆不进去的。只要改下系统的时间就可以正常登陆了。
 #date -s 08/04/2012
 #date -s 14:09:00
 #clock -w  ----将设置的时候保存到BIOS中,不然这样在当时有用,当服务器一重启后,系统时间又错了!
 
 
 2、登陆进去了后,显示 No such file or directory 或者 Connection refused,这时要把cmdserver这个命令执行下:
 #/usr/local/apache/htdocs/extman/daemon/cmdserver -d (最后要加上这个参数d)
 
 
3、当点击图形日志的时候发现,有关邮件的一些图片出不来,是个叉。是因为你没有启动mailgraph-init这个程序。
 [root@mail sbin]# cd /usr/local/apache/htdocs/extman/addon/mailgraph_ext/
 [root@mail mailgraph_ext]# ./mailgraph-init start
 Starting mail statistics grapher: mailgraph_ext
 nice: /usr/local/mailgraph_ext/mailgraph_ext.pl: 没有那个文件或目录
 Starting queue statistics grapher: qmonitor
 nice: /usr/local/mailgraph_ext/qmonitor.pl: 没有那个文件或目录
 提示:没有这两个文件,但是,我发现这两个文件都在/usr/local/apache/htdocs/extman/addon/mailgraph_ext/这个目录下面。我的做法是在/usr/local/下面创建一个mailgraph_ext目录,然后再把这两个文件做个软链接到/usr/local/mailgraph_ext/目录,最后:再来启动mailgraph-init 就不会出错了。
 [root@mail local]# mkdir mailgraph_ext
 [root@mail local]# cd mailgraph_ext/
 [root@mail mailgraph_ext]# ln -s /usr/local/apache/htdocs/extman/addon/mailgraph_ext/mailgraph_ext.pl  ./
 [root@mail mailgraph_ext]# ln -s /usr/local/apache/htdocs/extman/addon/mailgraph_ext/qmonitor.pl  ./
 
 [root@mail mailgraph_ext]# cd /usr/local/apache/htdocs/extman/addon/mailgraph_ext/
 [root@mail mailgraph_ext]# ./mailgraph-init start   ---启动mailgraph-init
 Starting mail statistics grapher: mailgraph_ext
 Starting queue statistics grapher: qmonitor
 [root@mail mailgraph_ext]#
 现在再次进入extman的时候,就可以看到邮件队列等信息的图象了。
 
 
七、说下要开机自启动的程序:
 
 1、postfix
 #echo "/usr/sbin/postfix start" >> /etc/rc.local
 
2、cyrus-sasl
 #chkconfig --level 35 sasld on
 
3、courier-authlib
 #chkconfig --level 35 courier-authlib on
 
 4、dovecot
 # echo "/usr/local/sbin/dovecot -c /etc/dovecot.conf" >> /etc/rc.local
 
 5、显示extman版本信息的cmdserver
 #echo "/usr/local/apache/htdocs/extman/daemon/cmdserver -d" >> /etc/rc.local
 
 6、mailgraph-init 绘图程序:
 # echo "/usr/local/apache/htdocs/extman/addon/mailgraph_ext/mailgraph-init start" >> /etc/rc.local
 
 最后把/etc/rc.local的内容给出来:
 [root@mail ~]# cat /etc/rc.local
 #!/bin/sh
 #
 # Thi s script will be executed *after* all the other init scripts.
 # You can put your own initialization stuff in here if you don't
 # want to do the full Sys V style init stuff.
 touch /var/lock/subsys/local
 /usr/local/apache/bin/apachectl start
 /usr/sbin/postfix start
 /usr/local/sbin/dovecot -c /etc/dovecot.conf
 /usr/local/apache/htdocs/extman/daemon/cmdserver -d
 /usr/local/apache/htdocs/extman/addon/mailgraph_ext/mailgraph-init start
 [root@mail ~]#

 
其实这只是一个具有收发邮件的一个邮件服务器,垃圾邮件的过滤,还没有写文档。可以根据企业的需要来对里面的内容进行修改。