配置邮件服务器
一、配置好yum源
  确认开发包组“Development tools” “Development libraries”是否安装。# yum  grouplist all
若没有则安装:  #   yum  groupinstall “Development tools” “Development libraries”  -y
二、上一篇的理论讲到了邮件服务与DNS 的关系,所以这里我们还要配置DNS服务。
#  yum  install  bind  -y
#  yum  install  caching-nameserver -y
#  vim /etc/named.conf
options {
      directory "/var/named";
      forwarders { 172.16.0.1; };
};
zone "." IN {
      type hint;
      file "named.ca";
};
zone "localhost" IN {
     type master;
     file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
    type master;
   file "named.local";
};
zone "magedu.com" IN {
    type master;
    file "magedu.com.zone";
    forwarders {};
};
zone "16.172.in-addr.arpa" IN {
    type master;
    file "172.16.zone";
    forwarders {};
};
# cd  /var/named
# vim magedu.com.zone
$TTL 600
$ORIGIN magedu.com.
@          IN          SOA     ns.magedu.com.  admin.magedu.com. (
                                          2012040101
                                          2H
                                          20M
                                          7D
                                          1D )
                 IN       NS         ns
                 IN      MX   10  mail
ns             IN      A          172.16.30.8
mail           IN     A           172.16.30.8
www         IN      CNAME    mail
pop3         IN      CNAME    mail
imap          IN      CNAME    mail
# vim 172.16.zone
$TTL 600
@       IN      SOA     ns.magedu.com.  admin.magedu.com. (
                                   2012040101
                                   2H
                                   20M
                                    7D
                                   1D )
                IN      NS      ns.magedu.com.
                IN      MX  10  mail.magedu.com.
8.30         IN      PTR     ns.magedu.com.
8.30         IN      PTR     mail.magedu.com.
# vim /etc/hosts    添加如下行
172.16.30.8  mail.magedu.com  主机IP
# vim /etc/sysconfig/network  将hostname改为如下:
   HOSTNAME=mail.magedu.com
# vim /etc/resolv.conf  用本机解析
nameserver   172.16.30.8
DNS服务准备好了接下来配置邮件服务器。
红帽系统默认已经安装好了sendmail,可以确认一下,看25号端口是否已经启用了
# netstat -tnlp   如图1-1 但是此时只监听在127.0.0.1本主机上,只对本机服务,不对外服务。图1-1
                                                                    图1-1
三、系统为什么会自带mail呢?
 因为过一段时间邮件就会提示系统有哪些情况,所以mail是用来向管理员通告一些系统监控情况的,所以系统默认情况下是安装好的。
四、下面我们来讲postfix
两者不能同时监听在25号,可以把sendmail停掉或用命令在两者之间替换,这里演示停掉sendmail。
1、停掉sendmail
# service sendmail  stop
# chkconfig  sendmail  off
安装额外的rpm包
httpd, mysql, mysql-server, mysql-devel, openssl-devel, dovecot, perl-DBD-MySQL, tcl, tcl-devel, libart_lgpl, libart_lgpl-devel, libtool-ltdl, libtool-ltdl-devel, expect
安装httpd是提供webmail的,为他几个是postfix的一些工具所依赖的,可装可不装,这里我配置好了yum源,直接用yum来装了
#  yum  install  httpd  mysql  mysql-server dovecot tcl-devel perl-DBD-MySQL openssl-devel  libart_lgpl-devel  libtool-ltdl-devel  expect  -y
3、启动mysql数据库,并给mysql的root用户设置密码:
     # service mysqld start
     # chkconfig mysqld on
     # mysqladmin -uroot password '123456'  不设置密码也可以
4、启动saslauthd服务,并将其加入到自动启动队列,启用认证功能:
    #  service saslauthd start
    # chkconfig saslauthd on
5、安装配置postfix
需要注意的是用rpm包安装的postfix,默认不支持基于mysql虚拟用户,这不是我们要的,所以这里我们不用rpm包的postfix。
可以到postfix的官方网站www.postfix.org,选择download这项里可以下载,打开之后找到镜像China Hong Kong 或 China Chengdu 中去下载源码包,下载最新的。要想用基于mysql的虚拟用户,当然要事先安装好mysql。
安装postfix,这里用postfix-2.9.1.tar.gz
6、postfix依赖两个用户postfix和postdrop,所以先创建用户
        # groupadd -g 2525 postfix
        # useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
        # groupadd -g 2526 postdrop
        # useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
Postdrop是用来实现邮件投递的专门用户。Postfix是收发邮件,运行postfix进程服务的用户帐号,这里的id号至关重要,一般来讲我们要让他们的id号大于500、大于1000,有些特定的服务如maildrop,它要求用户的id号必须大于1000,但是一定要记住这里用的id号后面会多次调用到所以与后面的一定要匹配起来。
7、安装postfix,事先一定要确保开发包组“Development Libraries” ”Development Tools“已经装上,因为postfix可能依赖其中的某些包
      #  tar xf postfix-2.9.1.tar.gz
      #  cd  postfix-2.9.1
      # make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2  -lssl -lcrypto'
      #  make
   # make  install 
8、上面命令执行后会出现如图1-2所示,让你选一些文件的安装位置,根据自己的需求,这里我把tempdir的路径给为了临时路径/tmp/postfix
将html_directory: [no] 改为了 /var/www/html/postfix,其他均可不变
                                                                   图1-2
9、配置完成之后就可以启动postfix了 ,但是此时postfix只监听在0.0.0.0 的25号端口,但只能给本机的客户端发送邮件。Postfix程序是模块化,它启用的第一个模块是master,master负责启动其他几个子模块,它的子模块非常的多,但并不是都启动起来的,用到哪个才启动哪个子进程,master是最主要的进程,在/etc/postfix/master.cf 配置文件中,定义了,main.cf设定postfix工作的所有参数,这些文件中的参postfix的模块,postfix的主配置文件在/etc/postfix/main.cf,所以master进程会读取这两个配置文件master.cf是为了协调其他几个子进程的数都可以用一个二进制命令来查看, postconf
 #  newaliases    生成别名二进制文件
    #  postfix start  启动postfix
 #  tail /var/log/maillog  可以看日志
 #  netstat  -tnlp     这时再看25号端口就启用了,如图1-3

                                                                                    图1-3
10、进行一些基本配置,测试启动postfix并进行发信
 # vim /etc/postfix/main.cf
 修改以下几项为您需要的配置
 myhostname = mail.magedu.com
 myorigin = magedu.com
 mydomain = magedu.com
 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
 mynetworks = 192.168.1.0/24, 127.0.0.0/8
11、为postfix提供SysV服务脚本/etc/rc.d/init.d/postfix,内容如下(#END 之前):
#  vim  /etc/rc.d/init.d/postfix
 #!/bin/bash
 #
 # 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
 
 # Source function library.
 . /etc/rc.d/init.d/functions
 
 # Source networking configuration.
 . /etc/sysconfig/network
 
 # Check that networking is up.
 [ $NETWORKING = "no" ] && exit 3
 
 [ -x /usr/sbin/postfix ] || exit 4
 [ -d /etc/postfix ] || exit 5
 [ -d /var/spool/postfix ] || exit 6
 
 RETVAL=0
 prog="postfix"
 
 start() {
  # Start daemons.
  echo -n $"Starting postfix: "
         /usr/bin/newaliases >/dev/null 2>&1
  /usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
  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 $"$prog stop"
  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 $"$prog reload"
  RETVAL=$?
  echo
  return $RETVAL
 }
 
 abort() {
  /usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
  return $?
 }
 
 flush() {
  /usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
  return $?
 }
 
 check() {
  /usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
  return $?
 }
 
 restart() {
  stop
  start
 }
 
 # See how we were called.
 case "$1" in
   start)
  start
  ;;
   stop)
  stop
  ;;
   restart)
  stop
  start
  ;;
   reload)
  reload
  ;;
   abort)
  abort
  ;;
   flush)
  flush
  ;;
   check)
  check
  ;;
   status)
    status master
  ;;
   condrestart)
  [ -f /var/lock/subsys/postfix ] && restart || :
  ;;
   *)
  echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
  exit 1
 esac
 
 exit $?
 
 # END
12、修改脚本的权限  
   #  chmod +x /etc/rc.d/init.d/postfix
将postfix添加进服务列表,使其开机可自动启用
   #chkconfig  --add  postfix
 # chkconfig   postfix  on
 #  chkconfig   postfix  restart  重新启用postfix
13、测试 如图1-4所示
                                                         图1-4
五、为postfix开启基于cyrus-sasl的认证功能
 1、 使用以下命令验正postfix是否支持cyrus风格的sasl认证,如果您的输出为以下结果,   则是支持的:
# /usr/local/postfix/sbin/postconf  -a
cyrus
dovecot
#vim /etc/postfix/main.cf
添加以下内容:
############################CYRUS-SASL############################
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_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
# vim /usr/lib/sasl2/smtpd.conf
添加如下内容:
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
重启配置文件:#  service  postfix  reload
2、测试如1-5所示
                                                                                   图1-5
六、安装Courier authentication library
  1、 简介:courier-authlib是Courier组件中的认证库,它是courier组件中一个独立的子项目,用于为Courier的其它组件提供认证服务。其认证功能通常包括验正登录时的帐号和密码、获取一个帐号相关的家目录或邮件目录等信息、改变帐号的密码等。而其认证的实现方式也包括基于PAM通过/etc/passwd和/etc/shadow进行认证,基于GDBM或DB进行认证,基于LDAP/MySQL/PostgreSQL进行认证等。因此,courier-authlib也常用来与courier之外的其它邮件组件(如postfix)整合为其提供认证服务。
 2、开始编译安装
    # tar xf courier-authlib-0.62.4.tar.bz2
    # cd courier-authlib-0.62.4
    #./configure \
    --prefix=/usr/local/courier-authlib \
    --sysconfdir=/etc \
    --without-authpam \
    --without-authshadow \
    --without-authvchkpw \
    --without-authpgsql \
    --with-authmysql \
    --with-mysql-libs=/usr/lib/mysql \
    --with-mysql-includes=/usr/include/mysql \
    --with-redhat \
    --with-authmysqlrc=/etc/authmysqlrc \
    --with-authdaemonrc=/etc/authdaemonrc \
    --with-mailuser=postfix \
    --with-mailgroup=postfix \
    --with-ltdl-lib=/usr/lib \
    --with-ltdl-include=/usr/include
# make
# make install
# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
# cp /etc/authdaemonrc.dist  /etc/authdaemonrc
# cp /etc/authmysqlrc.dist  /etc/authmysqlrc
3、修改/etc/authdaemonrc 文件
 # vim  /etc/authdaemonrc  找到authmodulelist和authmodulelistoring这两行将其值改为如下所示:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=10
七、配置其通过mysql进行邮件帐号认证
1、编辑/etc/authmysqlrc 为以下内容,其中2525,2525 为postfix 用户的UID和GID。
MYSQL_SERVER localhost
MYSQL_PORT 3306                   (指定你的mysql监听的端口,这里使用默认的3306)
MYSQL_USERNAME  extmail      (这时为后文要用的数据库的所有者的用户名)
MYSQL_PASSWORD extmail        (密码)
MYSQL_SOCKET  /var/lib/mysql/mysql.sock
MYSQL_DATABASE  extmail
MYSQL_USER_TABLE  mailbox
MYSQL_CRYPT_PWFIELD  password
MYSQL_UID_FIELD  '2525'
MYSQL_GID_FIELD  '2525'
MYSQL_LOGIN_FIELD  username
MYSQL_HOME_FIELD  concat('/var/mailbox/',homedir)
MYSQL_NAME_FIELD  name
MYSQL_MAILDIR_FIELD  concat('/var/mailbox/',maildir)
提供SysV服务脚本
# cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
# chmod 755 /etc/init.d/courier-authlib
# chkconfig --add courier-authlib
# chkconfig --level 2345 courier-authlib on
#echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf
# ldconfig -v
# service courier-authlib start   (启动服务)
九、事件postfix和courier-authlib
新建虚拟用户邮箱所在的目录,并将其权限赋予postfix用户:
#mkdir –pv /var/mailbox
#chown –R postfix /var/mailbox
# vim /usr/lib/sasl2/smtpd.conf 重新配置SMTP 认证,此配置文件,确保其为以下内容:
pwcheck_method: authdaemond
log_level: 3
mech_list:PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
# service  postfix  restart
十、让postfix支持虚拟域和虚拟用户
1、#  vim /etc/postfix/main.cf编辑/etc/postfix/main.cf,添加如下内容:
########################Virtual Mailbox Settings########################
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
maildrop_destination_recipient_limit = 1
maildrop_destination_concurrency_limit = 1
##########################QUOTA Settings########################
message_size_limit = 14336000
virtual_mailbox_limit = 20971520
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/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 Tidy your mailbox and try again later.
virtual_overquota_bounce = yes
2、使用extman源码目录下docs目录中的extmail.sql和init.sql建立数据库:
# tar xf  extman-1.1.tar.gz
# cd extman-1.1/docs
# mysql  < extmail.sql   mysql初始化
# mysql  <init.sql
# cp mysql*  /etc/postfix/
3、授予用户extmail访问extmail数据库的权限
mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
mysql> GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'extmail';
Mysql > FLUSH PRIVILEGES
启用虚拟域以后,需要取消中心域,即注释掉myhostname, mydestination, mydomain, myorigin几个指令;当然,你也可以把mydestionation的值改为你自己需要的。
十一、配置dovecot
 1、# vim  /etc/dovecot.conf
   启用 protocols = imap pop3
mail_location = maildir:/var/mailbox/%d/%n/Maildir
……
auth default {
    mechanisms = plain
    passdb sql {
        args = /etc/dovecot-mysql.conf
    }
    userdb sql {
        args = /etc/dovecot-mysql.conf
    }
    ……
2、# vim /etc/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 username = '%u'
3、启动dovecot服务:
# service dovecot start
# chkconfig dovecot on
十二、安装Extmail-1.2
1、安装
# tar xf extmail-1.2.tar.gz
# mkdir -pv /var/www/extsuite
# mv extmail-1.2 /var/www/extsuite/extmail
# cp /var/www/extsuite/extmail/webmail.cf.default  /var/www/extsuite/extmail/webmail.cf
2、修改主配置文件
#vim  /var/www/extsuite/extmail/webmail.cf 修改选项的说明:
SYS_USER_LANG = en_US
语言选项,可改作:
SYS_USER_LANG = zh_CN
SYS_MAILDIR_BASE = /home/domains
此处即为您在前文所设置的用户邮件的存放目录,可改作:
SYS_MAILDIR_BASE = /var/mailbox
3、下面两句用来设置连接数据库服务器所使用用户名、密码和邮件服务器用到的数据库,SYS_MYSQL_USER = db_user
SYS_MYSQL_PASS = db_pass
修改为:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_HOST = localhost  指明数据库服务器主机名,这里默认即可
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
以上用来指定验正用户登录里所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称;这里默认即可
SYS_AUTHLIB_SOCKET = /var/spool/authdaemon/socket
此句用来指明authdaemo socket文件的位置,这里修改为:
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket

4、apache相关配置
  1)、由于extmail要进行本地邮件的投递操作,故必须将运行apache服务器用户的身份修改为您的邮件投递代理的用户;本例中打开了apache服务器的suexec功能,故使用以下方法来实现虚拟主机运行身份的指定。此例中的MDA为postfix自带,因此将指定为postfix用户:
<VirtualHost *:80>
ServerName mail.magedu.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
</VirtualHost>
  2)、将 User  apache  和 Group  apache
改为 User  postfix  和 Group  postfix
修改 cgi执行文件属主为apache运行身份用户:
# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
  3)、启动 httpd 服务
     # chkconfig  httpd  start
      # chkconfig  httpd  on
5、依赖关系的解决,提供perl模块
   1)、extmail将会用到perl的Unix::syslogd功能,您可以去http://search.cpan.org搜索下载原码包进行安装。
# tar  xf  Unix-Syslog-0.100.tar.gz
# cd Unix-Syslog-0.100
# perl Makefile.PL
# make
# make install
浏览器访问测试 如图1-6所示:
                                                                           图1-6
这时点击登录邮箱管理,然后点击登录,还会失败,但是首页是出来了。
7、启动apache服务
# service httpd start
# chkconfig httpd on
12、安装Extman-1.1
1、安装及基本配置
# tar  xf  extman-1.1.tar.gz
# mv extman-1.1 /var/www/extsuite/extman
修改配置文件以符合本例的需要:
# cp /var/www/extsuite/extman/webman.cf.default  /var/www/extsuite/extman/webman.cf
# vi /var/www/extsuite/extman/webman.cf
SYS_MAILDIR_BASE = /home/domains
此处即为您在前文所设置的用户邮件的存放目录,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_DEFAULT_UID = 1000
SYS_DEFAULT_GID = 1000
此两处后面设定的ID号需更改为前而创建的postfix用户和postfix组的id号,本文使用的是2525,因此,上述两项需要修改为:
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman
修改为:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
而后修改cgi目录的属主:
# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
在apache的主配置文件中Extmail的虚拟主机部分,添加如下两行:
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
创建其运行时所需的临时目录,并修改其相应的权限:
#mkdir  -pv  /tmp/extman
#chown postfix.postfix  /tmp/extman
修改
SYS_CAPTCHA_ON = 1

SYS_CAPTCHA_ON = 0
好了,到此为止,重新启动apache服务器后,您的Webmail和Extman已经可以使用了,可以在浏览器中输入指定的虚拟主机的名称进行访问,  如我这里用172.16.30.8 在图1-6的基础上刷新一些页面就会出现如图1-7所示:默认管理帐号为:root@extmail.org  密码为:extmail*123*,输入之后就登陆到了后台了。
登录到后台后就可以点击域列表添加域了:登陆后的界面如图1-8所示:
                                                                     图1-8
 
这里我新加一个域,域名为magedu.com,下面是在此域中添加虚拟用户,在首页的域名上填写magedu.com点击免费注册邮箱,会弹出一个注册页面,如图1-9所示,这里以用户fedora为例,点击提交
 
 
                                                                                           图1-9
提交之后会出现如图1-10所示:
                                                                                                 图1-10
再点击提交会告诉你用户创建成功,如图1-11所示:
                                                                                             图1-11
到此虚拟用户就创建好了。用不同的浏览器新建用户后就可以互发邮件了。