当前位置:首页 > 技术问答

环境搭建及配置


2016-03-23 16:42

环境搭建及配置(Centos6.7 Postfix+Extmail+Dovecot+Maildrop)

1.1概述

安装环境Centos6.7,邮件存储目录/var/mailbox.存储邮件目录/var/vmail.Postfix存储队列的存储目录/var/spool/postfix.

courier-authlib 为 maildrop 提供与用户相关的信息查询.

dovecot提供系统的POP3和IMAP服务,同时给postfix提供SMTP的SASL认证服务.

postfix作为MTA(Mail Transfer Agent),负责创建smtp服务(smtpd)接收本域用户或其他域名服务器投递来的邮件,负责向其他服务器投递      (转发)邮件,管理邮件队列.

maildrop作为MDA(Mail Delivery Agent)负责把从postfix接收到邮件存入邮件夹,同时还支持自动转发、自动回复,邮件过滤等功能.

web模块是最先需要确定的,因为它决定了邮箱系统最核心的数据结构,这里选用国产的extmail,其他所有模块都按照extmail的结构进行          配置修改.
  webmail使用 extmail-1.0.5,web管理模块用extman-0.2.5.

1.2 配置前的准备工作

1.2.1系统环境

[root@Mail ~]# cat /etc/redhat-release

CentOS release 6.7 (Final)

1.2.2 关闭Selinux

[root@Mail ~]# getenforce 0

Disabled

[root@Mail ~]# vim /etc/selinux/config

7 SELINUX=disabled

1.2.3 如果系统有Sendmail服务要先停止

[root@Mail ~]# service sendmail stop

[root@Mail ~]# chkconfig sendmail off

1.2.4 关闭防火墙服务

[root@Mail ~]# service iptables stop

1.2.5 新建虚拟用户邮箱所在目录并将其权限赋予postfix用户

[root@Mail ~]# mkdir -p /var/mailbox

[root@Mail ~]# chown -R postfix /var/mailbox/


1.3 Postfix安装及配置

由于是编译安装postfix,所以如果有rpm的postfix,要删除掉,并且把postfix用户等信息也删除掉,因为我们后面要配合做mysql认证,好像rpm的postfix不支持mysql认证,本人没有验证过为了安全起见,直接源码安装了!

      1.3.1 首先卸载系统安装postfix,并删除账号

[root@Mail ~]# yum remove postfix

[root@Mail ~]# userdel postfix

[root@Mail ~]# groupdel postfix

1.3.2 创建postfix用户及组

安装Postfix的时候需要指定专门的用户和组

[root@Mail ~]# groupadd -g 2525 postfix

[root@Mail ~]# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix

[root@Mail ~]# groupadd -g 2526 postdrop

[root@Mail ~]# useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop

注:这里不要为了偷懒而不去删除postfix用户,postfix的rpm包安装好之后,postfix用户的UID和GID是89,如果这里以这样一个ID去运行服务,后面会出一些错误.所以最好自己创建一个用户,ID号大于1000的.我这里使用的是2525,也不建议大家改,因为这里一改,后面很多很多地方,都需要改.postfix搞起来本身就非常的麻烦!

1.3.3 安装编译环境及依懒软件包

[root@Mail ~]# yum groupinstall 'Development Libraries' 'Development Tools'  pcre-devel  perl-rrdtool  amavisd-new  pcre-devel  perl-Time-HiRes   perl-devel

1.3.4 Yum的方式安装ApacheMysqlphp等内容

[root@Mail ~]# yum install httpd php php-mysql 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 perl-Unix-Syslog  db4 db4-devel cyrus-sasl-* dovecot-mysql perl-CGI perl-GD

[root@Mail ~]# rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Unix-Syslog-1.1-1.el6.rf.x86_64.rpm

[root@Mail ~]# wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/extras/RPMS/ perl-GD-2.45-1.el6.rfx.x86_64.rpm

[root@Mail ~]# yum localinstall perl-GD-2.45-1.el6.rfx.x86_64.rpm

1.3.5 启动saslauthd服务及mysqld服务并设置开机自启

[root@Mail ~]# service saslauthd start

[root@Mail ~]# chkconfig saslauthd on

[root@Mail ~]# service mysqld start

[root@Mail ~]# chkconfig mysqld on

1.3.6 编译安装postfix

[root@Mail ~]# wget ftp://ftp.cuhk.edu.hk/pub/packages/mail-server/postfix/official/postfix-2.10.2.tar.gz

[root@Mail ~]# tar zxvf postfix-2.10.2.tar.gz

[root@Mail ~]# cd postfix-2.10.2

[root@Mail postfix-2.10.2]# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -      I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/lib64/mysql -lmysqlclient -lz -lm -L/usr/lib64/sasl2 -lsasl2 -lssl -lcrypto'

[root@mail postfix-2.10.2]# newaliases 生成新的别名文件,提高postfix的效率.

1.3.7 Postfix启动脚本并设置开机自启动!

[root@Mail ~]# cd /etc/init.d/

[root@Mail init.d]# touch postfix

[root@Mail init.d]# vim /etc/init.d/postfix

[root@Mail ~]# cat /etc/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 s                                                                                                             tart"

        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 st                                                                                                             op"

        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 a                                                                                                             bort"

        return $?

}

 

flush() {

        /usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog f                                                                                                             lush"

        return $?

}

 

check() {

        /usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog c                                                                                                             heck"

        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|con                                                                                                             drestart}"

        exit 1

esac

exit $?

[root@Mail ~]# chmod +x /etc/init.d/postfix

[root@Mail ~]# chkconfig --add postfix

[root@Mail ~]# chkconfig postfix on

[root@Mail ~]# chown postfix.postfix -R /var/lib/postfix/

[root@Mail ~]# chown postfix.postfix -R /var/spool/

[root@Mail ~]# service postfix start

为postfix开户基于cryus-sasl的认证功能,使用postconf –a验证postfix是否支持cyrus风格的sasl认证,如果出现以下结果,则是支持的.

[root@Mail ~]# postconf -a

cyrus

dovecot

       1.3.8 Postfix的主配置文件修改

(1) 为postfix开启基于Rycus-sasl认证功能

==========================CYTUS-SASL========================

[root@Mail ~]# vim /etc/postfix/main.cf

661 broken_sasl_auth_clients = yes

662smtpd_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

663 smtpd_sasl_auth_enable = yes

664 smtpd_sasl_local_domain = $myhostname

665 smtpd_sasl_security_options = noanonymous

666 smtpd_sasl_application_name = smtpd

667 smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!

(2)使postfix服务器支持读取保存在Mysql数据库中的虚拟用户以及虚拟域.

=======================Virtual Mailbox Settinds====================

指定虚拟邮箱存储目录的路径起点

670 virtual_mailbox_base = /var/mailbox

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

设置Postfix服务器可以接收的虚拟邮件域的域名,作用类似于配置参数mydestination

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

673 virtual_alias_domains =

指定虚拟邮件用户对应的别名文件位置

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

设置所有虚拟邮件用户映射的本地用户的UID号

675 virtual_uid_maps = static:1000

设置所有虚拟邮件用户映射的本地用户的GID号

676 virtual_gid_maps = static:1000

677 virtual_transport = maildrop  用maildrop投递邮件,后面会安装maildrop

678 maildrop_destination_recipient_limit = 1 一次投递1个

679 # maildrop_destination_concurrency_limit = 10 并发投递限制

(3)设置DKIM

###########################DKIM Setting#####################

smtpd_milters = inet:localhost:8891

non_smtpd_milters = inet:localhost:8891

milter_protocol = 2

milter_default_action = accept

688 smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,rej    ect_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,r    eject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_dom    ain,reject_unauth_pipelining,reject_unauth_destination,reject_sender_login_m    ismatch,check_policy_service unix:private/policy,reject_authenticated_sender    _login_mismatch

690 #filter mail

691 content_filter=amavisfeed:[127.0.0.1]:10025

1.4 Courier authentication library的安装及配置

courier-authlib是Courier组件中的认证库,它是courier组件中一个独立的子项目,用于为Courier的其它组件提供认证服务.其认证功能通常包括验正登录时的帐号和密码、获取一个帐号相关的家目录或邮件目录等信息、改变帐号的密码等.而其认证的实现方式也包括基于PAM通过/etc/passwd和/etc/shadow进行认证,基于GDBM或DB进行认证,基于LDAP/MySQL/PostgreSQL进行认证等. courier-authlib也常用来与courier之外的其它邮件组件(如postfix)整合为其提供认证服务.

1.4.1 Courier Authentication安装

[root@Mail ~]# wget http://jaist.dl.sourceforge.net/project/courier/authlib/0.66.1/courier-authlib-0.66.1.tar.bz2

[root@Mail ~]# tar xf courier-authlib-0.66.1.tar.bz2

[root@Mail ~]# cd courier-authlib-0.66.1

[root@Mail ~]# ./configure \

--prefix=/usr/local/courier-authlib \

--sysconfdir=/etc \

--without-authpam \

--without-authshadow \

--without-authvchkpw \

--without-authpgsql \

--with-authmysql \

--with-mysql-libs=/usr/lib64/mysql \

--with-mysql-includes=/usr/include/mysql \

--with-redhat \

--with-authmysqlrc=/etc/authmysqlrc \

--with-authdaemonrc=/etc/authdaemonrc \

--with-mailuser=postfix

[root@Mail courier-authlib-0.66.1]# make

[root@Mail courier-authlib-0.66.1]# make install

1.4.2 修改authdaemonrc主配置文件,仅保留authmysql认证方式.

[root@Mail ~]# cp /etc/authdaemonrc.dist /etc/authdaemonrc

[root@Mail ~]# cp /etc/authmysqlrc.dist /etc/authmysqlrc

[root@Mail ~]# vim /etc/authdaemonrc

27 authmodulelist="authmysql"  连接Mysql进行认证

34 authmodulelistorig="authmysql" 连接Mysql进行认证

53 daemons=10  服务进程数量

60 authdaemonvar=/usr/local/courier-authlib/var/spool/authdaemon

1.4.3 修改authmysqlrc文件,用户描述如何向Mysql数据库查询信息

[root@Mail ~]# vim /etc/authmysqlrc

26 MYSQL_SERVER         localhost 数据库地址

27 MYSQL_USERNAME      extmail后文要用的数据库的管理的用户名

28 MYSQL_PASSWORD      extmail 数据库管理员账户密码

49 MYSQL_SOCKET     /var/lib/mysql/mysql.sock mysql运行时的socket位置

56 MYSQL_PORT       3306 数据库端口号

68 MYSQL_DATABASE    extmail 虚拟用户数据库

83 MYSQL_USER_TABLE  mailbox 从mailbox表获得邮件账户信息

92 MYSQL_CRYPT_PWFIELD    password从password字段获得账户密码

105 DEFAULT_DOMAIN         opentb.com 默认域

113 MYSQL_UID_FIELD         '1000'

119 MYSQL_GID_FIELD         '1000'

128 MYSQL_LOGIN_FIELD     username从username字段获得账户名称

133 MYSQL_HOME_FIELD      concat(`/var/mailbox/`,homedir) 合并出用户的宿主目录路径

139 MYSQL_NAME_FIELD   name从name字段获得账户名称(不带@后缀)

150 MYSQL_MAILDIR_FIELD  concat('/var/mailbox/',maildir) 合并出用户的邮件存储路径

1.4.4 复制courier-authlib脚本,并启动courier-authlib服务

[root@Mail ~]# cp /root/courier-authlib-0.66.1/courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib

[root@Mail ~]# echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf

[root@Mail ~]# ldconfig -v

[root@Mail ~]# chmod 755 /etc/init.d/courier-authlib

[root@Mail ~]# chkconfig --add courier-authlib

[root@Mail ~]# chkconfig --level 2345 courier-authlib on

[root@Mail ~]# service courier-authlib start

[root@Mail ~]# chkconfig courier-authlib on

修改authdaemon socket目录权限如果该目录的权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证.(这里我暂时没有修改我想看看会出现什么错误)

[root@Mail ~]# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon/

/usr/local/courier-authlib/var/spool/authdaemon

由于是socket的方式,所以没有端口验证一下进程有没有启动.

[root@orcl ~]# echo '/usr/local/courier-authlib/sbin/authdaemond start' >> /etc/rc.local 

1.4.5 配置smtp认证,编辑/usr/lib64/sasl2/smtpd.conf(默认这个文件是不存在的)

[root@Mail ~]# vim /usr/lib64/sasl2/smtpd.conf

pwcheck_method: authdaemond

log_level: 3

mech_list:PLAIN LOGIN

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

1.5 配置dovecot

1.5.1 配置支持协议及邮件存储格式位置

[root@Mail ~]# vim /etc/dovecot/dovecot.conf

20 protocols = imap pop3 lmtp  支持邮局协议

85 disable_plaintext_auth=no   不检查明文密码(这个加到文件的末尾即可)

[root@Mail ~]# vim /etc/dovecot/conf.d/10-mail.conf

30 mail_location = maildir:/var/mailbox/%d/%n/Maildir  邮件存储格式及位置

1.5.2调整Dovecot服务器配置,修改邮件存储位置并设置启用数据库查询功能.

[root@Mail ~]# cp /etc/dovecot/conf.d/auth-sql.conf.ext /etc/dovecot/conf.d/auth-sql.conf

[root@Mail ~]# vim /etc/dovecot/conf.d/auth-sql.conf

5 passdb {

6   driver = sql

7

8   # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext

9   args = /etc/dovecot-mysql.conf

10 }

 

19 userdb {

20   driver = sql

21   args = /etc/dovecot-mysql.conf

22 }

1.5.3 编辑dovecot通过mysql认证的文件(建立数据查询配置文件)

[root@Mail ~]# vim /etc/dovecot-mysql.conf 这个文件默认没有需要手动去建

driver = mysql

connect = host=localhost dbname=extmail user=extmail password=extmail

default_pass_scheme = CRYPT MySQL数据库中存储的密码串的加密算法

password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u' 用于查询用户密码的SQL语句

user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u' 用户身份查询的SQL语句

1.5.4 启动dovecto服务

[root@Mail ~]# service dovecot start

[root@Mail ~]# chkconfig dovecot on

1.6 安装Extmail

Extmail是一款国人开发的开源的webmail工具,主要是使用perl写的.Extmail用于用户的登陆注册,发送接收邮件等.Extman是Extmain的管理工具,主要用于管理员来管理Extmail的信息,比如添加虚拟用,添加用户等!

1.6.1 安装extmail

[root@Mail ~]# tar zxvf extmail-1.2.tar.gz

[root@Mail ~]# mkdir -p /var/www/extsuite

[root@Mail ~]# mv extmail-1.2 /var/www/extsuite/extmail

[root@Mail ~]# cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf

1.6.2 修改extmail的主配置文件

[root@Mail ~]# vim /var/www/extsuite/extmail/webmail.cf

104 SYS_MESSAGE_SIZE_LIMIT = 5242880 用户可以发送的最大邮件

38 SYS_SESS_DIR = /tmp/extmail 用户的session保存位置

41 SYS_UPLOAD_TMPDIR = /tmp/extmail/upload

77 SYS_USER_LANG = en_CN 语言选项

107 SYS_MIN_PASS_LEN = 8  最短密码长度

127 SYS_MAILDIR_BASE = /var/mailbox    用户邮件的存放目录

139 SYS_MYSQL_USER = extmail        访问mysql数据库的用户

140 SYS_MYSQL_PASS = extmail        访问mysql数据库的用户密码

141 SYS_MYSQL_DB = extmail            Mysql数据库名字

142 SYS_MYSQL_HOST = localhost      Mysql服务器的地址

143 SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock MySQL套接字文件位置

以下用来指定验正用户登录里所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称

145 SYS_MYSQL_TABLE = mailbox

146 SYS_MYSQL_ATTR_USERNAME = username

147 SYS_MYSQL_ATTR_DOMAIN = domain

148 SYS_MYSQL_ATTR_PASSWD = password

下面这句用来指明authdaemo socket文件的位置.

197 SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket

1.6.3 建立extmail的临时文件目录及session目录

[root@Mail ~]# mkdir -p /tmp/extmail/upload

[root@Mail ~]# chown vmail.postfix -R /tmp/extmail

1.7 apache相关配置

由于extmail要进行本地邮件的投递操作,故必须将运行apache服务器用户的身份修改为您的邮件投递代理的用户,如果apache打开了suexec需要配置suexec挺麻烦的这里我直接关掉了!

1.7.1 修改httpd的主配置文件

[root@Mail ~]# vim /etc/httpd/conf/httpd.conf

292 #DocumentRoot "/var/www/html" 关闭中心主机,开启虚拟主机

198 # LoadModule suexec_module modules/mod_suexec.so 关闭suexec

242 User postfix

243 Group postfix

1.7.2 在Apache服务中建立Extmail虚拟主机的配置文件

[root@Mail ~]# vim /etc/httpd/conf.d/extmail.conf

<VirtualHost *:80>

ServerName mail.opentb.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

</VirtualHost>

1.7.3 启动Apache服务并设置为开机自启动

[root@Mail ~]# service httpd restart

[root@Mail ~]# chkconfig httpd on

1.8 部署Extman web管理界面安装及配置Extman

部署好ExtMail程序套件以后,电子邮件用户可以通过Web界面登录和使用邮件系统.但是在默认情况下,只有一个虚拟邮件域extmail.org,还无法满足实际应用的需要,下面继续介绍安装Extman程序套件,以便通过Web界面对Postfix邮件系统进行管理操作,如添加虚拟邮件域、虚拟邮件账户等.

   1.8.1 Extman安装及配置

[root@Mail ~]# tar zxvf extman-1.1.tar.gz

[root@Mail ~]# mv extman-1.1 /var/www/extsuite/extman

[root@Mail ~]# cp /var/www/extsuite/extman/webman.cf.default /var/www/extsuite/extman/webman.cf

[root@mail ~]# vim /var/www/extsuite/extman/webman.cf

你前文设置的用户邮件存放目录

12 SYS_MAILDIR_BASE = /var/mailbox 

下面这两项为创建的postfix用户和postfix组的ID号,本文使用的是1000.

98 SYS_DEFAULT_UID = 1000

101 SYS_DEFAULT_GID = 1000

127 SYS_MYSQL_USER = extmail

128 SYS_MYSQL_PASS = extmail

129 SYS_MYSQL_DB = extmail

130 SYS_MYSQL_HOST = localhost

131 SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock

    1.8.2 修改cgi目录的属主

[root@Mail ~]# chown -R postfix.postfix /var/www/extsuite/extman/cgi/

[root@Mail ~]# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/

1.9 Mysql数据库配置

1.9.1 初始化数据库设置root用户数据库密码

[root@Mail ~]# service mysqld start

修改密码方法一:

[root@Mail ~]# mysql -u root -p

Enter password:

mysql> set password for 'root'@'localhost' = PASSWORD('Mysql5.5@)!^.C0M');

修改密码方法二:

mysqladmin -u root password "123.com"

如果root已经设置过密码,采用如下方法

mysqladmin -u root password oldpass "123.com"

修改密码方法三:

mysql> use mysql;

mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';

mysql> FLUSH PRIVILEGES;

破解Mysql数据库密码:

mysqld_safe --skip-grant-tables&

mysql -u root mysql

mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';

mysql> FLUSH PRIVILEGES;

1.9.2 导入Extmail数据库

这里是导入数据库extmail表结构

[root@Mail ~]# cd /var/www/extsuite/extman/docs/

[root@Mail docs]# mysql -u root -p < extmail.sql

Enter password:

[root@Mail docs]# mysql -u root -p < init.sql

Enter password:

[root@Mail docs]# cp mysql_virtual_* /etc/postfix/

1.9.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;

1.9.4 Extman创建临时目录并授予权限

[root@Mail ~]# mkdir /tmp/extman

[root@Mail ~]# chown vmail.postfix -R /tmp/extman/

上面的工作全部做完后,就可以通过IP地址或者域名来访问Extmail了,Extmail的首页可以在域名哪里输入你的域名,然后点下面的注册来注册一个用户,不过默认只有一个Extmail的域,所以我们需要登陆Extman来管理域列表,添加一个我们自己的虚拟域.

1.9.5 通过IP地址或者域名访问Extmail

默认的用户名是root@extmail.org, 默认的密码:extmail*123*  http://mail.opentb.com/extmail/cgi/index.cgi



1.10 配置Mail日志每天回滚

一个简单东西,但是这个也很重要,试想一下一个邮件的日志达到GB级别,分析起来也是很吃力的,如果能按日来每天回滚,这个日志不会太大,也方便查看日志分析某一天的日志,我们只需要使用logroute来简单的配置一下就可以了!这样做完之后就可以把日志回滚到/data/maillog目录里面去了.


[root@Mail ~]# cat /etc/logrotate.d/maillog这个maillog文件是我自己创建的默认是没有这个文件的.

/var/log/maillog {

        daily

        missingok

        compress

        rotate 365

        nocompress

        copytruncate

        notifempty

        create 0600 root root

        olddir /data/maillog/

        postrotate

        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true

        endscript

}


1.11 使用OpendkimPostfix邮件服务器添加DKIM签名

用一句话来讲DKIM就是一种防垃圾邮件的机制!域名密钥DomainKeys(DK)和域名密钥标识邮件技术(DKIM)是使用密码的email验证系统,它能用于防止网络诈骗,而且,因为大多数的垃圾邮件都包含欺骗性的地址,DK/DKIM能从很大程度上减少垃圾邮件,尽管它们不是专门设计用于反垃圾邮件的工具。DK/DKIM还能用于确保收到邮件的完整性,或确保邮件在发件人服务器被发出直到到达接收者服务器的过程中,没有被更改过。

换句话说,有了DK/DKIM密码验证系统,收件人服务器就能确信到达的邮件是来自发件人的并且没有人用任何方式改变过邮件信息。为了确保邮件的有效性和完整性,DKIM使用一个公共和密码的keypairs系统,一个加密的公钥被发布到发送服务器的DNS记录,然后每个发出的邮件都被服务器用相应的私钥进行了签名。对于收到的邮件,当收件服务器发现它是一个被做了DKIM签名的邮件时,它将从发件服务器的DNS记录中找回公钥,然后将期与邮件中的签名比对来确定邮件的合法性。如果收到的邮件不能通过验证,那么收件服务器就知道其包含了伪造的地址或曾被篡改.而接下来我们要安装的opendkim就是用于实现对我们邮件服务器发送出的邮件,进行数字签名的一种软件,它可以实现DKIM的功能.


1.11.1 安装配置Opendkim

[root@Mail ~]# wget -P /tmp http://mirror.pnl.gov/epel/6/i386/epel-release-6-8.noarch.rpm

[root@Mail ~]# rpm -Uvh /tmp/epel-release-6-8.noarch.rpm

[root@Mail ~]# rm -f /tmp/epel-release-6-8.noarch.rpm

[root@Mail ~]# yum -y install opendkim

[root@Mail ~]# opendkim-genkey -d opentb.com -s default

[root@Mail ~]# mv default.private /etc/opendkim/keys/

[root@Mail ~]# chown opendkim.opendkim /etc/opendkim/keys/default.private

[root@Mail ~]# cat default.txt

default._domainkey      IN      TXT     ( "v=DKIM1; k=rsa; "

          "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuoxOw56mF5JBKD5GhQdf5KYuilyTOUgn9nrOCHbMosdjZ1lrJsN/ww+YANyI68dUhX2L6Z2Gk2bzclM74xdSq+KyjdNv4AhAabBeyV7wEu7s5Pl/9owdaLIpVEx4CFJKV+PbjASwn2lBiZmQ+OqM2Goa7s/p8Nd0M5ASQkNHOrwIDAQAB" )  ; ----- DKIM key default for opentb.com

这样就为域opentb.com生成了一对用于DKIM签名的公钥和私钥,我们把私钥放到了opendkim默认的存储密钥文件的目录下.

上面default.txt里面的内容是我们公钥文件,我们需要把上面的内容在我们的DNS服务器上新建一个TXT类型的记录存储起来.名字就是default._domainkey内容是Default是刚才生成密钥的时候-S参数后面的名字,也就是一个selector,可以创建多个selector,不同域名使用不同的selector来做签名的.


1.11.2 修改Opendkim的配置文件

[root@Mail ~]# cat /etc/opendkim/KeyTable

# OPENDKIM KEY TABLE

# To use this file, uncomment the #KeyTable option in /etc/opendkim.conf,

# then uncomment the following line and replace example.com with your domain

# name, then restart OpenDKIM. Additional keys may be added on separate lines.

6 default._domainkey.opentb.com opentb.com:default:/etc/opendkim/keys/default.private


1.11.3 在文件的末尾添加即可

[root@Mail ~]# vim /etc/opendkim/SigningTable

*@opentb.com default._domainkey.opentb.com


1.11.4 配置opendkim.conf文件

[root@Mail ~]# vim /etc/opendkim.conf

39 Mode    sv

42 Syslog  yes

56 Socket  inet:8891@localhost

98 KeyFile /etc/opendkim/keys/default.private

Domain opentb.com最后一行添加就行


1.11.5 修改完以上配置文件启动opendkimpostfix服务

[root@Mail ~]# /etc/init.d/opendkim start

[root@Mail ~]# /etc/init.d/postfix restart

[root@Mail ~]# chkconfig opendkim on


1.12 Postfix发送出的邮件做SPF签名

SPF是Sender Policy Framework的缩写,也是一种反垃圾邮件的策略。主要是用来通过IP地址来验证发送邮件的用户是否合法的一种手段,这个IP地址指的是MTA邮件服务器的IP地址,因为一般的邮件服务器发送邮件都是需要验证的,而如果用户通过了邮件服务器的验证,并且发送出的邮件确实是MTA服务器的IP地址,那么用户的身份也就得到了验证。我们知道在Linux中,发件人的地址是可以伪造的,但是如果我们用了SPF,你虽然伪造了发件人,但是你发出去邮件的地址,是没有办法进行伪造的.更详细的信息,可以查看http://www.openspf.org/.


1.12.1Postfix来增加SPF签名

首先我们需要一个脚本来实现SPF签名,实现SPF的脚本有两种perl和python,当然也可以自己写,需要对SPF有更深一层的认识才可以。我们这里使用perl脚本来实现SPF签名首先来安装SPF的perl模块.

[root@Mail ~]# yum -y install perl-CPAN

[root@Mail ~]# rpm -q perl-CPAN

[root@Mail ~]# perl –MCPAN –e shell

执行完这个命令会有一个提示直接按Y,后面可能会等好长时间,耐心等待一下.

cpan[1]> install Mail::SPF

然后我们再来下载一个脚本,来做SPF签名,这个脚本叫postfix-policyd-spf-perl,可以在http://www.openspf.org/blobs/这里下载到.

[root@Mail ~]# wget http://www.openspf.org/blobs/postfix-policyd-spf-perl-2.007.tar.gz

[root@Mail ~]# tar zxvf postfix-policyd-spf-perl-2.007.tar.gz

[root@Mail ~]# cd postfix-policyd-spf-perl-2.007

[root@Mail postfix-policyd-spf-perl-2.007]# cp postfix-policyd-spf-perl /usr/libexec/postfix/

因为我安装postfix的时候,指定的postfix的libexec目录是/usr/libexec/postfix/,所以这里要根据你自己的配置来确定放到哪个目录.


1.12.2 修改master.cf配置文件

需要注意的是policy一行需要顶格写,不能有空格,第二行user的内容前面要空两个格.(添加到文件的末尾即可)

[root@Mail ~]# cat /etc/postfix/master.cf

amavisfeed unix    -       -       n       -       2     smtp

            -o smtp_data_done_timeout=1200

            -o smtp_send_xforward_command=yes

            -o smtp_tls_note_starttls_offer=no

            -o disable_dns_lookups=yes

            -o max_use=20

#说明,请注意在maxproc栏内的数值 2 必须要与/etc/amavisd.conf内的$max_servers设定一致。有关各选项的详细解释请参阅Amavisd-new##的文档vim /usr/share/doc/amavisd-new-2.8.0/README.postfix).然后我们定义一个专用的服务把邮件重新注入Postfix.我们为此在/etc/postfix/master.cf内加入一个localhost(127.0.0.1)的tcp 10025端口/etc/amavisd.conf的预设值)上监听的smtp服务.

127.0.0.1:10025 inet n    -       n       -       -     smtpd

            -o content_filter=

            -o smtpd_delay_reject=no

            -o smtpd_client_restrictions=permit_mynetworks,reject

            -o smtpd_helo_restrictions=

            -o smtpd_sender_restrictions=

            -o smtpd_recipient_restrictions=permit_mynetworks,reject

            -o smtpd_data_restrictions=reject_unauth_pipelining

            -o smtpd_end_of_data_restrictions=

            -o smtpd_restriction_classes=

            -o mynetworks=127.0.0.0/8

            -o smtpd_error_sleep_time=0

            -o smtpd_soft_error_limit=1001

            -o smtpd_hard_error_limit=1000

            -o smtpd_client_connection_count_limit=0

            -o smtpd_client_connection_rate_limit=0

            -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters,no_address_mappings

            -o local_header_rewrite_clients=

            -o smtpd_milters=

            -o local_recipient_maps=

policy  unix  -       n       n       -       0       spawn

  user=nobody argv=/usr/libexec/postfix/postfix-policyd-spf-perl

maildrop  unix  -       n       n       -       -       pipe

  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}


1.12.3 修改main.cf配置文件(都直接放到文件末尾)

#filter mail

content_filter=amavisfeed:[127.0.0.1]:10025

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,reject_sender_login_mismatch,check_policy_service unix:private/policy,reject_authenticated_sender_login_mismatch


按照以上添加一下,然后重启reload 服务即可,或者重启postfix也是可以的.


[root@Mail ~]# /etc/init.d/postfix restart


1.13 Postfix安装配置防垃圾防病毒服务

每个公司的邮件服务器,不可能收不到垃圾邮件的,现在垃圾邮件太多了.如果不做一下防范措施,真的会让人崩溃.因为人一天的工作时间有限,如果大多数时间都在处理垃圾邮件了,工作效率肯定下降了.目前有一些开源的,比较好用的防垃圾邮件的工具的,比如spamassassin、clamAV等.

ClamAV是一个unix系统平台上的开源反病毒工具,它是特地为在邮件网关上进行邮件扫描而设计的.整套软件提供了许多的实用工具,包括一个可伸缩和可升级的多线程守护进程、一个命令行扫描工具和病毒库自动升级工具.

SpamAssassin是目前最好的、最流行的开源反垃圾邮件软件之一.它是一个邮件过滤器,使用了多种反垃圾邮件技术,如:文本分析、贝叶斯过滤、DNS黑名单和分布式协同过滤数据库等.

amavisd-new是一个连接MTA和内容检测工具(诸如病毒扫描工具和SpamAssassin)的高性能接口程序,使用perl语言写成.它一般通过SMTP、ESMTP或者LMTP和MTA进行通讯,当然也可以借助于其它外部程序进行.同postfix(MTA)协同工作时表现尤佳.当它呼叫SpamAssassin进行内容过滤时,对于一封邮件只需要呼叫一次,而不管这封邮件将发往多少个收件人;同时,它亦会尽力保证实现每一位收件人的偏好设置,如接收/拒绝,检测/不检测.垃圾邮件级别等;它还会在邮件头部分插入spam相关信息.

由于这些软件比较流行,所以目前已经有rpm包了,不用再痛苦的苦逼的去编译安装了.添加一下yum源即可,rpmforget这个源里就有. 把源贴出来,方便大家这个是centos6的.


1.13.1 配置Yum

[root@Mail ~]# cat /etc/yum.repos.d/CentOS-Base.repo 添加到文件的最后即可

### Name: RPMforge RPM Repository for RHEL 6 - dag

### URL: http://rpmforge.net/

[rpmforge]

name = RHEL $releasever - RPMforge.net - dag

baseurl = http://apt.sw.be/redhat/el6/en/$basearch/rpmforge

mirrorlist = http://mirrorlist.repoforge.org/el6/mirrors-rpmforge

#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge

enabled = 1 是否启用这个仓库,1为启用0为禁用.

protect = 0

gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag

gpgcheck = 1设置gpgcheck=1会让yum检查每个下载的RPM的GnuPG签名.这么做是因为你需要适当的GnuPG key注册到您的RPM数据库.可以防止被欺骗,如:非法入侵发行版网站,木马导入软件包.


1.13.2 Yum安装clamavclamdamavisd

[root@mail ~]# yum –y install amavisd-new clamav clamav-devel clamd spamassassin


1.13.3 修改local.cf配置文件

[root@Mail ~]# vim /etc/mail/spamassassin/local.cf直接在配置文件的原有基础上添加即可!

required_hits 5

report_safe 0

rewrite_header Subject [SPAM]

use_bayes 1

bayes_auto_learn 1

skip_rbl_checks 0

use_razor2 1

use_pyzor 0


1.13.4 修改clamd.conf配置文件

[root@Mail ~]# cat /etc/clamd.conf

85 LocalSocket /var/run/clamav/clamd.sock

101 #TCPSocket 3310


1.13.5 修改amavisd.conf配置文件

(1).通过去除以下数行的注释来停止检查病毒域垃圾邮件(由于下面数行默认是被注释掉的,因此病毒及垃圾邮件在预设中默认是被启动的

12 @bypass_virus_checks_maps = (1);  # controls running of anti-virus code

13 @bypass_spam_checks_maps  = (1);  # controls running of anti-spam code

14 $bypass_decode_parts = 1;         # controls running of decoders&dearchivers

(2) 接着可以看到下面几行

16 $max_servers = 2;          # num of pre-forked children (2..30 is common), -m

17 $daemon_user  = 'amavis';    # (no default;  customary: vscan or amavis), -u

18 $daemon_group = 'amavis';    # (no default;  customary: vscan or amavis), -g

20 $mydomain = 'opentb.com';

58 $inet_socket_port = 10024;   # listen on this local TCP port(s)

154 # $notify_method  = 'smtp:[127.0.0.1]:10025';

155 # $forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter!

$max_servers 设定同步执行的Amavisd-new进程数量,而且必须与/etc/postfix/master.cf内的amavisfeed服务的maxproc中相符合

(3)以下是必须修改选项

20 $mydomain = 'opentb.com';   # a convenient default for other settings

22 $MYHOME = '/var/amavis';   # a convenient default for other settings, -H

33 $helpers_home = "$MYHOME/var";  # working directory for SpamAssassin, -S

34 $lock_file = "$MYHOME/var/amavisd.lock";  # -L

35 $pid_file  = "$MYHOME/var/amavisd.pid";   # -P

152 $myhostname = 'mail.cloudchinese.com ';  # must be a fully-qualified domain name!

(4)下面是SpamAssassin设定来替换预设的SpamAssassin设置

94 $sa_tag_level_deflt  = 2.0;  # add spam info headers if at, or above that level

95 $sa_tag2_level_deflt = 6.2;  # add 'spam detected' headers at that level

96 $sa_kill_level_deflt = 6.9;  # triggers spam evasive actions (e.g. blocks mail)

97 $sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent

98 $sa_crediblefrom_dsn_cutoff_level = 18; # likewise, but for a likely valid From

99 # $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off

100 $penpals_bonus_score = 8;    # (no effect without a @storage_sql_dsn database)

101 $penpals_threshold_high = $sa_kill_level_deflt;  # don't waste time on hi spam

102 $bounce_killer_score = 100;  # spam score points to add for joe-jobbed bounces

104 $sa_mail_body_size_limit = 400*1024; # don't waste time on SA if mail is larger

105 $sa_local_tests_only = 0;    # only tests which do not require internet access?

说明,默认不需要修改但你得知道它们和意义,可以方便的帮助我们设置垃圾邮件‘

$sa_tag_level_deflt  指定Amavisd-new由哪一个级别开始写入X-Spam-Flag、X-Spam-Score、X-Spam-Status等垃圾邮件资讯标头,假如你想为所有邮件加入资讯标头,请把此值设为 -999

$sa_tag2_level_deflt  指定由哪一个级别开始在垃圾邮件的标头上标签它们 

$sa_kill_level_deflt  指定Amavisd-new由哪一个级别开始拦截和扣留邮件。这个用途很大,因为SpamAssassin在预设情况下不会这样做 

$sa_dsn_cutoff_level  指定由哪一个级别开始寄件失败通告不会被发送给寄件人。由于多数垃圾邮件寄件者的地址都是伪造的,不为明显的垃圾邮件发送寄件失败通告是最合理的,要不然你只会加剧反向散寄的问题 

$sa_quarantine_cutoff_level  指定哪一个级别开始不必扣留垃圾邮件。这个选项预设是被注释掉的,意思是所有邮件都会被扣留

(5)下面是发送通告的邮件地址(默认是管理员邮箱,接收垃圾邮件通告的邮箱)

118 $virus_admin      ="postmaster\@$mydomain";   # notifications recip.

121 $mailfrom_notify_admin  ="postmaster\@$mydomain";  # notifications sender

122 $mailfrom_notify_recip   ="postmaster\@$mydomain";  # notifications sender

123 $mailfrom_notify_spamadmin ="postmaster\@$mydomain";  # notifications sender

(6) 设置ClamAV的部分

381  ### http://www.clamav.net/

382  ['ClamAV-clamd',

383  \&ask_daemon, ["CONTSCAN {}\n", "/var/spool/amavisd/clamd.sock"],

384  qr/\bOK$/m, qr/\bFOUND$/m,

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


1.13.6 重新启动postfixclamdamavis服务,及设置为开机启动

[root@Mail ~]# chkconfig clamd on

[root@Mail ~]# chkconfig amavisd on

[root@Mail ~]# chkconfig spamassassin on

[root@Mail ~]# /etc/init.d/clamd start

[root@Mail ~]# /etc/init.d/amavisd start

[root@Mail ~]# /etc/init.d/spamassassin start


1.14 postfix配置maildrop实现邮件转发

安装好postfix+extmain+extman以及所有的防垃圾、防病毒、DKIM签名、SPF等功能之后,发现登陆到Extmail之后,设置的转发没有生效,收到的邮件并没有转发到我们指定的邮箱!这是因为我们默认配置的的是virtual,这个是不具有邮件转发功能的,我们可以使用dovecot或者maildrop来实现强大的邮件转发功能。

二、安装配置maildrop

如果你安装的postfix是按照我本博客里的文档进行安装的,那么就跟着我下面的进行操作。如果不是按照我的文档安装的,可能有些地方会不太一样,需要自己分析一下,根据自己的情况做相应的修改。没有哪一份文档是绝对万能的,因为大家的环境都不一样,想要写出一份任何环境都适应的文档,实在是太难了。

编译安装maildrop

在编译maildrop前需要将courier-authlib 的头文件及库文件链接至/usr目录,在编译的时候会到/usr目录下找相关的文件,maildrop需要结合courier-authlib,因为在做邮件转发的时候,需要对用户进行判断,来判断要转发的用户,是不是本域的用户,所以会去库里面取被转发的用户名。如果是本域用户,就好办了,直接拷贝一份放到被转发的用户的目录即可,如果非本域用户,再看是不是本机所负责的域,如果不是的话就要把邮件提交给第三方邮件服务器,如果是本域也同样是拷贝一份到被转发的用户邮件目录.


1.14.1 创建用户别切换用户

[root@Mail ~]# useradd -u 1000 vmail

[root@Mail ~]# su - vmail

[vmail@Mail ~]$

[root@Mail2 ]# chmod 644 /etc/{passwd,group} 这一步可以不做

[root@mail ~]# ln -sv /usr/local/courier-authlib/bin/courierauthconfig  /usr/bin

[root@mail ~]# ln  -sv /usr/local/courier-authlib/include/*  /usr/include


1.14.2 编译安装maildrop

[root@Mail ~]# wget http://downloads.sourceforge.net/project/courier/maildrop/2.7.1/maildrop-2.7.1.tar.bz2

[root@Mail ~]# tar xf maildrop-2.7.1.tar.bz2

[root@Mail ~]# cd maildrop-2.7.1

[root@Mail maildrop-2.7.1]#  ./configure  --enable-sendmail=/usr/sbin/sendmail  --enable-trusted-users='root vmail' --enable-syslog=1 --enable-maildrop-uid=1000 --enable-maildrop-gid=1000 && make && make install

Maildrop安装完成后我们执行maildrop -v

[root@Mail maildrop-2.7.1]# maildrop –v


1.14.3 创建maildroprc文件并配置

[root@Mail ~]# cat /etc/maildroprc

logfile "/var/log/maildrop.log"

to "$HOME/Maildir"

#这里会有点问题,如果添加了to这一行,可能extmail里面设置了转发,但实际上转发不了,如果不设置,会报错


1.14.4 修改authmysqlrc配置文件

[root@Mail ~]# vi /etc/authmysqlrc

113 MYSQL_UID_FIELD         '1000'

119 MYSQL_GID_FIELD         '1000'


1.14.5 修改webman.cf配置文件

[root@Mail ~]# vim /var/www/extsuite/extman/webman.cf

98 SYS_DEFAULT_UID = '1000'

101 SYS_DEFAULT_GID = '1000'


1.14.6 修改httpd.conf配置文件

[root@Mail ~]# vim /etc/httpd/conf/httpd.conf

242 User vmail

243 Group vmail


1.14.7 修改相应文件的权限

[root@Mail ~]# chmod 700 /var/mailbox/ -R

[root@Mail ~]# chown vmail /tmp/extma* -R

[root@Mail ~]# chgrp postdrop /var/spool/postfix/maildrop/

[root@Mail ~]# chown vmail.vmail -R /tmp/viewlog/

[root@Mail ~]# /etc/init.d/postfix restart


1.14.8 启动courier-authlib时下面的提示不是错误不用理会

[root@Mail ~]# /etc/init.d/courier-authlib restart

Stopping Courier authentication services: authdaemond

[root@Mail ~]# /etc/init.d/httpd restart


1.14.9 将vmail用户ID更新到数据库

[root@Mail ~]# mysql -u root -p

mysql> use extmail;

mysql> update mailbox set uidnumber='1000';

mysql> update mailbox set gidnumber='1000';

mysql> flush privileges;