安装postfix+apache+mysql+courier-authlib+extmail+extman邮件系统所用到的软件:

 Postfix-2.6.5.tar.gz courier-authlib-0.63.1.tar.bz2 extman-1.1.tar.gz extmail-1.2.tar.gz Unix-Syslog-1.1.tar.gz

前提:1.将本机上的sendmail服务关闭,如果卸载的话最好能够 --nodeps
      2.配置好DNS的正反向解析,这里我使用yayu.com域名192.168.106网段,主机ip 192.168.106.4
 

第一   准备工作:
1         安装一些postfix所需要的特定软件包
[root@linux named]# yum install httpd dovecot mysql mysql-server mysql-devel openssl-devel tcl tcl-devel libart_lgpl libart_lgpl-devel
2 安装相关的开发包组,配置编译环境
[root@linux named]# yum -y groupinstall "Development Libraries" "Development Tools" "Legacy Software Development" "X Software Development"
3         启动mysql 准许mysql可以让root用户远程登录,并保证开机能够自动启动
[root@linux ~]# service mysqld start
[root@linux ~]# chkconfig --add mysqld
[root@linux ~]# chkconfig mysqld on
[root@linux ~]# mysql
   mysql> GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'redhat';
   mysql> FLUSH PRIVILEGES;
   mysql> \q
第二 安装配置postfix
[root@linux ~]# tar zxf postfix-2.6.5.tar.gz
[root@linux ~]# cd postfix-2.6.5-2.8.2
[root@linux postfix--2.6.52.8.2]# groupadd -g 2525 postfix
[root@linux postfix-2.6.5]# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
[root@linux postfix-2.6.5]# groupadd -g 2526 postdrop
[root@linux postfix-2.6.5]# useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
[root@linux postfix-2.6.5]# 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'
 
[root@linux postfix-2.6.5-2.8.2]#make
[root@linux postfix-2.6.5]#make install
  install_root: [/] /
  tempdir: [/usr/local/src/ postfix-2.6.5] /tmp
  config_directory: [/etc/postfix] /etc/postfix
  daemon_directory: [/usr/libexec/postfix]
  command_directory: [/usr/sbin]
  queue_directory: [/var/spool/postfix]
  sendmail_path: [/usr/sbin/sendmail]
  newaliases_path: [/usr/bin/newaliases]
  mailq_path: [/usr/bin/mailq]
  mail_owner: [postfix]
  setgid_group: [postdrop]  
html_directory: [no] /var/www/postfix_html
 
    manpages: [/usr/local/man]
readme_directory: [no]
[root@linux postfix-2.6.5]# newaliases
 #生成别名二进制文件,这个步骤如果忽略,会造成postfix效率极低
[root@linux postfix-2.6.5]# cd /etc/postfix/
[root@linux postfix]# cp main.cf{,.bak}
[root@linux postfix]# vim main.cf
 #进行一些基本配置,测试启动postfix并进行发信,修改以下几项为您需要的配置
   myhostname = mail.yayu.com
   mydomain = yayu.com
   myorigin = $mydomain
   inet_interface = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
        mail.$mydomain,
   mynetworks = 192.168.106.0/24, 127.0.0.0/8
说明:
#myorigin参数用来指明发件人所在的域名;
#mydestination参数指定postfix接收邮件时收件人的域名,即您的postfix系统要接收到哪个域名的邮件;
#myhostname 参数指定运行postfix邮件系统的主机的主机名,默认情况下,其值被设定为本地机器名;
#mydomain参数指定您的域名,默认情况下,postfix将myhostname的第一部分删除而作为mydomain的值;
#mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问;
#inet_interfaces 参数指定postfix系统监听的网络接口
注意
1、在postfix的配置文件中,参数行和注释行是不能处在同一行中的;
2、任何一个参数的值都不需要加引号,否则,引号将会被当作参数值的一部分来使用;
3、每修改参数及其值后执行 postfix reload 即可令其生效;但若修改了inet_interfaces,则需重新启动postfix;
4、如果一个参数的值有多个,可以将它们放在不同的行中,只需要在其后的每个行前多置一个空格即可;postfix会把第一个字符为空格或tab的文本行视为上一行的延续
[root@linux postfix]# /usr/sbin/postfix start
[root@linux postfix]# netstat –tnl
 #查看25号端口是否开启
 
连接postfix,验正服务启动状况
[root@linux postfix]## telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.test.com ESMTP Postfix
ehlo mail.test.com
250-mail.test.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:root@test.com
250 2.1.0 Ok
rcpt to:redhat@test.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject:Mail test!
Mail test!!!
.
250 2.0.0 Ok: queued as AB94A1A561
quit
221 2.0.0 Bye
Connection closed by foreign host.
 
切换到redhat用户进行收信:
# su - redhat
$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/redhat": 1 message 1 new
>N 1 root@test.com        Wed Sep 5 10:59 15/488   "Mail test!"
&
为postfix编写启动脚本
[root@linux ~]#vim postfix
#!/bin/bash
# chkconfig: 2345 80 30
 
# 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
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
}
 
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 $?
[root@linux postfix]#chmod +x postfix
[root@linux postfix]#cp postfix /etc/init.d/
[root@linux postfix]#service postfix restart
第三 为postfix开启基于cyrus-sasl的认证功能
[root@linux postfix]# postconf –a
 #使用这个命令来验证postfix是否支持cyrus-sasl的认证
cyrus
dovecot
[root@linux ~]# 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 yayu Available!
[root@linux ~]# vim /usr/lib/sasl2/smtpd.conf
   #添加如下内容
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
[root@linux ~]#telnet mail.yayu.com 25
Trying 192.168.106.4...
Connected to localhost.localdomain (192.168.106.4).
Escape character is '^]'.
220 Welcome to our mail.test.com ESMTP,Warning: Version yayu Available!
ehlo mail.test.com
250-mail.test.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN               (请确保您的输出以类似两行)
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
 
 #安装Courier authentication library
[root@linux ~]# tar jxf courier-authlib-0.62.4.tar.bz2
[root@linux ~]# cd courier-authlib-0.62.4
[root@linux courier-authlib-0.62.4]# ./configure
--prefix=/usr/local/courier-authlib
--sysconfdir=/etc 
--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-ltdl-lib=/usr/lib
--with-ltdl-include=/usr/include
 
#这里笔者是粘上的,因为排版的问题,并且想表示清楚,所以分行写,在实际中,每行其实之间是一个空格
[root@linux courier-authlib-0.62.4]#make
[root@linux courier-authlib-0.62.4]#make install
[root@linuxcourier-authlib-0.62.4]#chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
[root@linux courier-authlib-0.62.4]# cp /etc/authdaemonrc.dist /etc/authdaemonrc
[root@linux courier-authlib-0.62.4]# cp /etc/authmysqlrc.dist /etc/authmysqlrc
[root@linux courier-authlib-0.62.4]# vim /etc/authdaemonrc
 #修改内容如下
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=10
[root@linux courier-authlib-0.62.4]# vim /etc/authmysqlrc
#编辑/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)
[root@linux courier-authlib-0.62.4]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib
#提供courier-authlib的启动脚本
[root@linux courier-authlib-0.62.4]# chmod 775 !$
[root@linux courier-authlib-0.62.4]# chkconfig --add courier-authlib
[root@linux courier-authlib-0.62.4]# chkconfig courier-authlib on
[root@linux courier-authlib-0.62.4]# echo "/usr/local/courier-authlib/lib/courier-authlib" > /etc/ld.so.conf.d/courier-authlib.conf
#配置courier-authlib库文件路径
[root@linux courier-authlib-0.62.4]#ldconfig –v
#重读库文件
[root@linux courier-authlib-0.62.4]# service courier-authlib start
[root@linux courier-authlib-0.62.4]# mkdir -pv /var/mailbox
#新建虚拟用户邮箱所在的目录,并将其权限赋予postfix用户
[root@linux courier-authlib-0.62.4]# chown -R postfix /var/mailbox
[root@linux ~]# 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
 
第四、让postfix支持虚拟域和虚拟用户
[root@linux ~]# vim /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
[root@linux ~]# tar zxf extman-1.1.tar.gz
[root@linux ~]# cd extman-1.1/docs
#使用extman源码目录下docs目录中的extmail.sql和init.sql建立数据库
[root@linux docs]# mysql -u root -p <extmail.sql
Enter password: redhat
#使用extmail.sql初始化数据库
[root@linux docs]# mysql -u root -p <init.sql
Enter password; redhat
#使用init.sql初始化数据库
[root@linux docs]# cp mysql* /etc/postfix/
[root@linux docs]# mysql -uroot -p
#授予用户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
[root@linux ~]# vim /etc/postfix/main.cf
启用虚拟域以后,需要取消中心域;所以要注释掉
myhostname, mydestination, mydomain, myorigin几个指令
 
配置dovecot,使之能接受mysql数据库中的虚拟用户账号,不在是本地的账号
[root@linux ~]# vim /etc/dovecot.conf
#修改内容如下:
mail_location = maildir:/var/mailbox/%d/%n/Maildir
#%d表示域名,%n是和用户相关的
auth default {
    mechanisms = plain
    passdb sql {
        args = /etc/dovecot-mysql.conf
         #这是这个文件不存在,我们要使用这个文件中定义的语句来查询账号密码
    }
    userdb sql {
        args = /etc/dovecot-mysql.conf
    }
……
[root@linux ~]# 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' 
#%u表示宏,就是用户在登录mysql的时候输入的用户名                         
user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u'
[root@linux ~]# service dovecot start
[root@linux ~]# netstat –tnl 
#看110端口是否启用着
[root@linux ~]# chkconfig dovecot on
 
安装extmail
[root@linux ~]# tar zxf extmail-1.2.tar.gz
[root@linux ~]# mkdir -pv /var/www/extsuite
[root@linux ~]# mv extmail-1.2 /var/www/extsuite/extmail
[root@linux~]#cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf
[root@linux ~]# vim /var/www/extsuite/extmail/webmail.cf
#extmail也是有一个配置文件,这里需要修改
SYS_USER_LANG = zh_CN
#这里可以修改成中文的
SYS_MAILDIR_BASE = /var/mailbox
#此处即为您在前文所设置的用户邮件的存放目录
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
#以上两句句用来设置连接数据库服务器所使用用户名、密码和邮件服务器用到的数据库,
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
#以上用来指定验正用户登录里所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称;这里默认即可
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
#此句用来指明authdaemo socket文件的位置
 
配置apache
[root@linux extmail]# vim /etc/httpd/conf/httpd.conf
注释 DocumentRoot
启用NameVirtualHost *:80
修改
User postfix
Group postfix
 
在最后一行添加
<VirtualHost *:80>
ServerName mail.yayu.com
DocumentRoot /var/www/extsuite/extmail/html
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
</VirtualHost>
[root@linux extmail]# chown -R postfix:postfix /var/www/extsuite/extmail/cgi/
[root@linux extmail]# setenforce 0
#这里将selinux关闭,否则会找不到目录,或者修改标签
[root@linux extmail]# service httpd start
[root@linux ~]# tar zxf Unix-Syslog-1.1.tar.gz
#extmail将会用到perl的Unix::syslogd功能,您可以去http://search.cpan.org搜索下载原码包进行安装
[root@linux ~]# cd Unix-Syslog-1.1
[root@linux Unix-Syslog-1.1]# perl Makefile.PL
[root@linux Unix-Syslog-1.1]# make && make install
[root@linux Unix-Syslog-1.1]# service httpd restart
 
 
安装extman
[root@linux ~]# tar zxvf extman-1.1.tar.gz
[root@linux ~]# mv extman-1.1 /var/www/extsuite/extman
[root@linux ~]# cd !$
[root@linux extman]#cp /var/www/extsuite/extman/webman.cf.default /var/www/extsuite/extman/webman.cf
#我们的extman也是需要配置文件
[root@linux extman]# vim !$
SYS_MAILDIR_BASE = /var/mailbox
#此处即为您在前文所设置的用户邮件的存放目录
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
#此两处后面设定的ID号需更改为前而创建的postfix用户和postfix组的id号,本文使用的是2525,
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
[root@linux extman]# chown -R postfix:postfix /var/www/extsuite/extman/cgi/
[root@linux extman]# vim /etc/httpd/conf/httpd.conf
#在<VirtualHost *:80> </VirtualHost>之间添加
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
[root@linux extman]# mkdir -pv /tmp/extman
#extman在运行的时候需要一个临时的目录
[root@linux extman]# chown -R postfix:postfix !$
[root@linux ~]#service httpd restart
 
 

浏览器中 http://mail.yayu.com/extmail 就可以访问,不过我们的yayu.com域在httpd中是一个虚拟域,所以我们要选择登录邮箱管理(用户名: root@extmail.org 密码:extmail*123*)创建这个域,

     本人刚接触linux,很多东西不太懂,希望大家多多指教,这个邮件系统不够完善,tcp协议的传输多是明文的,可能还应该用到imaps pop3s的功能,这时在公司内部需要自建CA服务器,实现邮件的加密传输!