邮件系统搭建(ExtMail Solution for Linux)

Wikipedia,自由的百科全书

返回技术向导首页 (http://wiki.lupaworld.com/index.php/Guide)

目录

ExtMail Solution结构

ExtMail Solution 是一个基于优秀开源软件的电子邮件系统解决方案,核心部件包括了Postfix, Amavisd-new, ClamAV, ExtMail 和ExtMan, Courier系列软件。是一个功能相对比较齐全的免费电子邮件系统。以下是其主要的特性列表:

  • 支持SMTP/POP3/HTTP协议
  • 支持SMTP认证及ESMTP
  • 可支持大容量邮箱(大于1GB)
  • 高速Web界面访问邮箱
  • 完整的Web管理后台
  • 在线服务端病毒过滤
  • 内建内容过滤
  • SMTP行为识别垃圾邮件
  • 支持大量反垃圾邮件技术
  • 图形化邮件日志分析
  • 支持别名/多域/域管理员等
  • 支持网络磁盘/POP3邮件
  • 支持读/写HTML格式邮件
  • 支持定制模板及多语言

  • 整个邮件解决方案由如下软件组成:

    功能模块 内容 备注
    操作系统(OS CentOS 4.3 CentOSRHEL是一样的,而且升级免费
    邮件传输代理(MTA Postfix 2.3snapshot 使用2.3 snapshot,虽然不是最新但是对一般人而言足够用了
    数据库/目录服务 MySQL 4.1 可选openLDAPNetScape LDAP,本文以MySQL为蓝本
    邮件投递代理(MDA maildrop 2.0.x 支持过滤和强大功能
    Web帐户管理后台 ExtMan 0.16-pre1 支持无限域名、无限用户
    POP3 服务器 Courier-IMAP 只使用pop3部分,对于大部分企业而言完全足够
    WebMail 系统 ExtMail 0.24-pre8 支持多语言、全部模板化,功能基本齐全
    防病毒软件(Anti-Virus ClamAV 0.88 最热门的开源杀毒软件
    SMTP阶段反垃圾邮件工具 Spam Locker 0.083 基于SMTP行为识别的Antispam软件,大量可选插件
    内容过滤器 Amavisd-new 2.40 Content-Filter软件,支持与clamav/sa的挂接
    内容级别的反垃圾邮件工具 SpamAssassin 著名的SA,可以支持大量规则,但速度慢
    SMTP认证库 Cyrus SASL 2.1x 标准的SASL实现库,可以支持Courier authlib
    其他数据认证库 Courier Authlib 0.57 authlibmaildrop, courier-imap等服务的关键部件
    日志分析及显示 mailgraph_ext ExtMan中已经包含了
    Web 服务器 Apache 2.0.x CentOS 自带

    硬件配置

    要流畅地运行邮件系统,建议的硬件配置如下:

  • 物理内存:256M+ 推荐512M
  • 交换区:2倍物理内存大小
  • CPU:PIII 1G+ 推荐P4
  • 主板:推荐Intel原装
  • 网卡:100M/1000M 推荐3Com/Intel
  • 操作系统安装

    本文档支持RedHat Enterprise 4.x 及CentOS 4.x版本。要注意的是安装系统时,只安装如下的组件:

  • Web Server
  • 要注意必须选中httpd-suexec软件包,否则下文的配置将失效

  • MYSQL数据库
  • 注意必须选中mysql-server, libdbi-dbd-mysql, perl-DBD-mysql等模块,否则extmail将无法连接mysql

  • VIM编辑器
  • 强烈建议安装vim-enhanced软件包,它支持main.cf彩色高亮语法分析

    其余的Xwindows, 打印,KDE/Gnore, 服务器配置工具,网络工具,开发包等全部都不要选上。安装完毕进入操作系统后,建议禁止root直接登陆,并增加一个非root帐户,例如叫sysadmin。这样要以root权限操作的话,必须先以sysadmin身份登陆再su到root执行。方法:

    CentOS4.3安装步骤图解

    以下将以详细的图解来介绍如何安装CentOS4.3

    Image:wd3.7.3.1.gif

    CentOS启动光盘的启动画面,直接回车即可。

    Image:wd3.7.3.2.gif

    系统提示“是否需要校验CD媒质”,请选择“Skip”。

    Image:wd3.7.3.3.gif

    选择“English”作为安装界面的语言。

    Image:wd3.7.3.4.gif

    安装类型请务必选择“Custom”,以便之后详细选择要装的软件包。

    Image:wd3.7.3.5.gif

    磁盘分区设置请选择“Manually partition with disk Druid”(手工分区)。

    Image:wd3.7.3.6.gif

    如图,我们将/,/usr,/var,/var/spool/postfix等单独分成一个分区,注意:如果磁盘大小允许,请将/var/spool/vscan目录也单独成一个分区,该目录主要存放被过滤的临时邮件。

    Image:wd3.7.3.7.gif

    配置网卡及子网掩码,记得点选“Activate boot”。

    Image:wd3.7.3.8.gif

    配置网关及DNS,请将离你的服务器最近DNS服务器IP地址填入“Primary DNS”。

    Image:Wd3.7.3.9.gif

    防火墙配置时,打开防火墙(选Enable FireWall),并放行常规的服务(服务列表全选),最重要的是记得打开SELinux(选Active)

    Image:Wd3.7.3.10.gif

    时区选“上海”。

    Image:Wd3.7.3.11.gif

    输入root帐户密码,建议使用较长的密码,并混杂数字与字母及特殊字符。

    Image:Wd3.7.3.12.gif

    进入软件组的选择对话界面后,我们只选择Editors组。

    Image:Wd3.7.3.13.gif

    其次选择是Web Server及FTP Server组。

    Image:wd3.7.3.14.gif

    再次选择MySQL DataBase组,并点击右边的Details

    Image:wd3.7.3.15.gif

    在Details对话框里,确保libdbi-dbd-mysql,mysql-server,perl-DBD-MySQL等模块都被选中。extmail依赖这些软件包。

    Image:wd3.7.3.16.gif

    最后,确认一下所做的选择。其他没有被提到的软件模块/组全部都去掉。总共软件大小有814MB左右。

    Image:wd3.7.3.17.gif

    点Next后,安装系统提示必须要准备好CentOS的第1,2,3张光盘。

    Image:wd3.7.3.18.gif

    系统进行初始化,磁盘分区等。

    Image:wd3.7.3.19.gif

    系统安装到后面时,需要换安装盘。请将盘2及盘3按提示放入光驱。

    Image:wd3.7.3.20.gif

    安装完毕后,出现祝贺完成的界面,点Reboot重新启动。

    Image:wd3.7.3.21.gif

    如无意外,系统进入登陆提示符界面。至此,CentOS4.3的安装就结束了。

    以root身份登进系统后,增加一个非root帐户,名称为sysadmin,密码按您的需求设置一个即可。接下来我们要禁止root直接登陆,编辑/etc/ssh/sshd_config 修改以下配置为:

    PermitRootLogin no 
    

    然后重新启动sshd:

    /etc/init.d/sshd restart
    

    这样禁止了root直接登陆。


    配置SELinux


    自从RHEL4/CentOS4以后,系统默认打开了SELinux支持,简单说SELinux就是一个强制性的安全机制,但是它也带来了不少麻烦,为了避免编写烦琐的policy规则,本文档将屏蔽掉SELinux对MySQL及httpd的保护。方法如下:

    setsebool httpd_disable_trans=1
    setsebool mysqld_disable_trans=1
    

    操作完毕后,重新启动mysql及apache,并将如下命令加入/etc/rc.d/rc.local以便服务器启动后能自动生效:

    /usr/sbin/setsebool httpd_disable_trans=1
    /usr/sbin/setsebool mysqld_disable_trans=1
    /etc/init.d/mysqld restart
    /etc/init.d/httpd restart
    

    下载ExtMail Solution软件包

    x86_32系统

    基本假定

    整个系统的安装全过程都要求以root身份执行,如果机器没有访问外部网络的能力,则事先下载好ExtMail Solution软件包,并用ftp以sysadmin帐户的身份,上载到服务器。

    下载软件包

    我们统一将软件包下载到/root目录里。

    su - root
    cd /root
    wget http://www.extmail.org/source/ExtMail-Solution-Linux-0.1.tar.gz
    

    校验

    下载的文件必须校验确认过没损坏才能使用。命令如下:

    wget http://www.extmail.org/source/md5sum.es_linux-0.1
    cat md5sum.es_linux-0.1
    md5sum ExtMail-Solution-Linux-0.1.tar.gz 
    

    一个可能的结果:

    # cat md5sum.es_linux-0.1
    168eced41c0cac0ed9f981e791f3783b ExtMail-Solution-Linux-0.1.tar.gz
    # md5sum ExtMail-Solution-Linux-0.1.tar.gz
    168eced41c0cac0ed9f981e791f3783b ExtMail-Solution-Linux-0.1.tar.gz
    

    由于软件包不断的变更,所以上述结果和您的结果可能不一致,请以下载的md5sum为准

    解压

    目前最新的ExtMail-Solution软件包版本号为0.1,软件包文件名为:ExtMail-Solution-Linux-0.1.tar.gz,下载回来后,在/root目录解开:

    tar xfz ExtMail-Solution-Linux-0.1.tar.gz 
    

    此外,我们假设本次安装默认域是extmail.org,主机名为:mail.extmail.org,ExtMail Solution的文件目录是/root/ExtMail-Solution-Linux-0.1/

    重要步骤:

    我们进入/root/ExtMail-Solution-Linux-0.1/目录,该目录下包括如下文件/目录:

    conf/
    docs/
    RPMS/
    src/
    README
    

    其中RPMS目录是本文的重点,里面包含了所需要的全部rpm包,src目录则是存放webmail, anti-spam等相关软件的源码,而README则是说明文件,docs目录则是本文档相关的html及图片。

    下文所涉及的操作,绝大部分都是发生在/root/ExtMail-Solution-Linux-0.1目录里,请确保当前目录为:/root/ExtMail-Solution-Linux-0.1

    x86_64系统

    基本假定

    整个系统的安装全过程都要求以root身份执行,如果机器没有访问外部网络的能力,则事先下载好ExtMail Solution软件包,并用ftp以sysadmin帐户的身份,上载到服务器。

    下载软件包

    我们统一将软件包下载到/root目录里。

    su - root
    cd /root
    wget http://www.lunsou.org/source/ExtMail-Solution-Linux-x86_64-0.1.tar.bz2
    

    校验

    下载的文件必须校验确认过没损坏才能使用。命令如下:

    wget http://www.lunsou.org/source/ExtMail-Solution-Linux-x86_64-0.1.tar.bz2
    md5sum ExtMail-Solution-Linux-x86_64-0.1.tar.bz2 
    

    一个可能的结果:

    #md5sum ExtMail-Solution-Linux-x86_64-0.1.tar.bz2
    8eef9b53c713eeca8559b3e176a6d8dc  ExtMail-Solution-Linux-x86_64-0.1.tar.bz2
    

    由于软件包不断的变更,所以上述结果和您的结果可能不一致,请以下载的md5sum为准

    解压

    目前最新的ExtMail-Solution软件包版本号为0.1,软件包文件名为:ExtMail-Solution-Linux-x86_64-0.1.tar.bz2,下载回来后,在/root目录解开:

    tar xfj ExtMail-Solution-Linux-x86_64-0.1.tar.bz2 
    

    此外,我们假设本次安装默认域是lunsou.com,主机名为:mail.lunsou.com,ExtMail Solution的文件目录是/root/ExtMail-Solution-Linux-x86_64-0.1/

    重要步骤:

    我们进入/root/ExtMail-Solution-Linux-x86_64-0.1/目录,该目录下包括如下文件/目录:

    RPMS/
    src/
    

    其中RPMS目录是本文的重点,里面包含了所需要的全部rpm包和src.rpm包,src目录则是存放extmail、extman等相关软件的源码。本文也将把所有的rpm包或src.rpm包等的来源地址列出,用户也可以根据自己的实际需要下载。

    下文所涉及的操作,绝大部分都是发生在/root/ExtMail-Solution-Linux-x86_64-0.1目录里,请确保当前目录为:/root/ExtMail-Solution-Linux-x86_64-0.1

    配置MTA-Postfix

    删除冲突软件,sendmail,需要执行:

    rpm -e --nodeps sendmail
    


    mysql有关软件:

    CentOS4.x/ RedHat EL4.x 都自带mysql-server,请用户自行安装好,包括mysql-client和devel等包

    注:x86_64系统相关
    
    编译postfixhttp://postfix.wl0.org/ftp/official/2.2/SRPMS/下载postfix的src包
    这些包支持mysql、sasl、tls等的功能,然后自己手动编译。编译src包需要安装rpmbuild等软件包。
    
    rpm -ivh postfix-2.2.11-1.src.rpm
    
    然后转移到/usr/src/redhat/SPECS,修改postfix.spec文件,让其支持mysql、sasl。
    
    cd /usr/src/redhat/SPECS
    vi postfix.spec
    
    将:
    
    %define with_mysql_redhat 0
    %define with_sasl         0
    
    改成:
    
    %define with_mysql_redhat 1
    %define with_sasl         2
    
    以上表示开启mysql和sasl2(为1表示支持sasl1)的支持
    最后编译生成rpm包:
    
    rpmbuild -bb postfix.spec
    
    在/usr/src/redhat/RPMS/x86_64生成相关的rpm包。
    

    安装postfix

    rpm -ivh --nodeps RPMS/postfix-2.3.20050716-1hzq.i386.rpm 
    
    注:x86_64系统
    
    rpm -ivh --nodeps postfix-2.2.11-1.rhel4.x86_64.rpm
    

    配置postfix

    简化postfix配置:

    postconf -n > /etc/postfix/main2.cf
    mv /etc/postfix/main.cf /etc/postfix/main.cf.old
    mv /etc/postfix/main2.cf /etc/postfix/main.cf
    

    再编辑main.cf:

    vi /etc/postfix/main.cf
    

    增加如下内容:

    # hostname
    mynetworks = 127.0.0.1
    myhostname = mail.extmail.org
    mydestination = $mynetworks $myhostname
     
    # banner
    mail_name = Postfix - by extmail.org
    smtpd_banner = $myhostname ESMTP $mail_name
     
    # response immediately
    smtpd_error_sleep_time = 0s
    unknown_local_recipient_reject_code = 450
     
    # extmail config here
    virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
    virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
    virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
    virtual_transport = maildrop:
    

    编辑mysql_virtual_alias_maps.cf

    vi /etc/postfix/mysql_virtual_alias_maps.cf
    

    内容如下:

    user = extmail
    password = extmail
    hosts = localhost
    dbname = extmail
    table = alias
    select_field = goto
    where_field = address
    

    编辑mysql_virtual_domains_maps.cf

    vi /etc/postfix/mysql_virtual_domains_maps.cf
    

    内容如下:

    user = extmail
    password = extmail
    hosts = localhost
    dbname = extmail
    table = domain
    select_field = description
    where_field = domain
    #additional_conditions = and backupmx ='0' and active ='1'
    

    编辑mysql_virtual_mailbox_maps.cf

    vi /etc/postfix/mysql_virtual_mailbox_maps.cf
    

    内容如下:

    user = extmail
    password = extmail
    hosts = localhost
    dbname = extmail
    table = mailbox
    select_field = maildir
    where_field = username
    #additional_conditions = and active = '1'
    

    配置Courier-Authlib

    编译安装Courier-Authlib

    一、x86_32系统

    运行如下命令安装相关软件包

    rpm -ivh RPMS/libtool-libs-1.5.6-4.EL4.1.c4.3.i386.rpm
    rpm -ivh RPMS/courier-authlib-0.57-1hzq.i386.rpm
    rpm -ivh RPMS/courier-authlib-devel-0.57-1hzq.i386.rpm
    rpm -ivh RPMS/courier-authlib-mysql-0.57-1hzq.i386.rpm
    

    编辑/etc/authlib/authmysqlrc文件,并将其内容清空,然后增加如下内容:

    MYSQL_SERVER            localhost
    MYSQL_USERNAME          extmail
    MYSQL_PASSWORD          extmail
    MYSQL_SOCKET            /var/lib/mysql/mysql.sock
    MYSQL_PORT              3306
    MYSQL_OPT               0
    MYSQL_DATABASE          extmail
    MYSQL_USER_TABLE        mailbox
    MYSQL_CRYPT_PWFIELD     password
    MYSQL_UID_FIELD         uidnumber
    MYSQL_GID_FIELD         gidnumber
    MYSQL_LOGIN_FIELD       username
    MYSQL_HOME_FIELD        homedir
    MYSQL_NAME_FIELD        name
    MYSQL_MAILDIR_FIELD     maildir
    MYSQL_QUOTA_FIELD       quota
    MYSQL_SELECT_CLAUSE     SELECT username,password,"",uidnumber,gidnumber,\
                            CONCAT('/home/domains/',homedir),               \
                            CONCAT('/home/domains/',maildir),               \
                            quota,                                          \
                            name                                            \
                            FROM mailbox                                    \
                            WHERE username = '$(local_part)@$(domain)'
    

    存盘退出后启动courier-authlib:

    /etc/init.d/courier-authlib start 
    

    如一切正常,命令行将返回如下信息:

    Starting Courier authentication services: authdaemond 
    


    二、x86_64系统

    编译前先确认系统是否已经安装了expect包,如果没有,请安装:

    rpm -ivh expect-5.42.1-1.x86_64.rpm
    

    http://www.extmail.org/source/courier-authlib-0.57-1hzq.src.rpm下载courier-authlib的src包,然后重新编译:

    rpmbuild --rebuild courier-authlib-0.57-1hzq.src.rpm
    

    编译结束后,在/usr/src/redhat/RPMS/x86_64生成如下文件:

    courier-authlib-0.57-1hzq.x86_64.rpm
    courier-authlib-devel-0.57-1hzq.x86_64.rpm
    courier-authlib-mysql-0.57-1hzq.x86_64.rpm
    

    运行如下命令安装相关软件包

    libtool-libs-1.5.6-4.EL4.1.c4.4.x86_64.rpm可以到:

    http://mirror.centos.org/centos-4/4.4/os/x86_64/CentOS/RPMS/ 下载
    
    rpm -ivh RPMS/libtool-libs-1.5.6-4.EL4.1.c4.4.x86_64.rpm
    rpm -ivh RPMS/courier-authlib-0.57-1hzq.x86_64.rpm
    rpm -ivh RPMS/courier-authlib-devel-0.57-1hzq.x86_64.rpm
    rpm -ivh RPMS/courier-authlib-mysql-0.57-1hzq.x86_64.rpm
    

    编辑/etc/authlib/authmysqlrc文件,并将其内容清空,然后增加如下内容:

    MYSQL_SERVER            localhost
    MYSQL_USERNAME          extmail
    MYSQL_PASSWORD          extmail
    MYSQL_SOCKET            /var/lib/mysql/mysql.sock
    MYSQL_PORT              3306
    MYSQL_OPT               0
    MYSQL_DATABASE          extmail
    MYSQL_USER_TABLE        mailbox
    MYSQL_CRYPT_PWFIELD     password
    MYSQL_UID_FIELD         uidnumber
    MYSQL_GID_FIELD         gidnumber
    MYSQL_LOGIN_FIELD       username
    MYSQL_HOME_FIELD        homedir
    MYSQL_NAME_FIELD        name
    MYSQL_MAILDIR_FIELD     maildir
    MYSQL_QUOTA_FIELD       quota
    MYSQL_SELECT_CLAUSE     SELECT username,password,"",uidnumber,gidnumber,\
                            CONCAT('/home/domains/',homedir),               \
                            CONCAT('/home/domains/',maildir),               \
                            quota,                                          \
                            name                                            \
                            FROM mailbox                                    \
                            WHERE username = '$(local_part)@$(domain)'
    

    存盘退出后启动courier-authlib:

    /etc/init.d/courier-authlib start 
    

    如一切正常,命令行将返回如下信息:

    Starting Courier authentication services: authdaemond 
    

    修改authdaemon socket目录权限

    如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证:

    chmod 755 /var/spool/authdaemon/
    
    附:x86_64还需添加
    
    修改/etc/authlib/目录下的authdaemonrc文件,修改内容以下:
    
    详细内容:
    
    authmodulelist=" authpam authpgsql authldap authmysql authcustom authpipe"
    
    更改为:
    
    authmodulelist="authmysql"
    authmodulelistorig="authpam authpgsql authldap authmysql authcustom authpipe"
    
    更改为:
    
    authmodulelistorig="authmysql"
    daemons=5
    
    更改为:
    
    daemons=10
    

    安装maildrop

    注意事项:

    1. 如果您需要重新编译maildrop软件包,首先必须获得其源码rpm包,其次必须先装好courier-authlib及其devel软件包,否则编译maildrop之后将无法打开authlib支持。

    2. maildrop RPM包安装时,会自动创建vuser用户及vgroup用户组,专门用于邮件的存储,vuser:vgroup的uid/gid都是1000,这与一般的邮件文档中提及用postfix用户存邮件不一样。因为postfix用户的uid一般都低于500,而Suexec模块编译时对UID/GID的要求是要大于500,因此显然用postfix用户不能满足,会导致报错。其次,如果用maildrop作为投递(MDA),以postfix身份投递的话,postfix mta也会报错的。

    安装maildrop

    rpm -ivh RPMS/maildrop-2.0.1-1hzq.i386.rpm
    rpm -ivh RPMS/maildrop-man-2.0.1-1hzq.i386.rpm
    
    注:x86_64需先编译,方法如下:
    
    编译Maildrop:
    
    首先从:http://postfix.org.cn/download/maildrop-2.0.1-1hzq.src.rpm 下载maildrop的src包,然后重新编译:
    rpmbuild --rebuild maildrop-2.0.1-1hzq.src.rpm
    
    编译结束后,将在/usr/src/redhat/RPMS/x86_64生成:
    
    maildrop-2.0.1-1hzq.x86_64.rpm
    maildrop-man-2.0.1-1hzq.x86_64.rpm
    


    配置master.cf

    为了使Postfix支持Maildrop,必须修改/etc/postfix/master.cf文件,注释掉原来的maildrop的配置内容,并改为:

    maildrop   unix        -       n        n        -        -        pipe
        #flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
        flags=DRhu user=vuser argv=maildrop -w 90 -d ${user}@${nexthop} ${recipient} ${user}  ${extension} {nexthop}
    

    配置main.cf

    由于maildrop不支持一次接收多个收件人,因此必须在main.cf里增加如下参数:

    maildrop_destination_recipient_limit = 1
    

    最后重新启动postfix即可

    配置Apache

    编辑httpd.conf:

    vi /etc/httpd/conf/httpd.conf
    

    在730行左右,屏蔽掉AddDefaultCharset:

    #AddDefaultCharset UTF-8 
    

    使apache开机默认启动:

    chkconfig --level 3 httpd on 
    


    虚拟主机设置

    编辑/etc/httpd/conf/httpd.conf文件,在最后一行加上:

    NameVirtualHost *:80
    Include conf/vhost_*.conf
    


    编辑/etc/httpd/conf/vhost_extmail.conf,里面定义虚拟主机的相关内容,包括主目录,以及ExtMail和ExtMan的相关配置,Suexec的设置等。

    # VirtualHost for ExtMail Solution
    <VirtualHost *:80>
    ServerName mail.extmail.org
    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/
    
    # Suexec config
    SuexecUserGroup vuser vgroup
    </VirtualHost>
    

    重新启动apache:

    /etc/init.d/httpd restart
    

    注意:此时重新启动apache会产生以下警告信息,可不必理会

    Starting httpd: Warning: DocumentRoot [/var/www/extsuite/extmail/html/] does not exist
    

    安装ExtMan - web后台

    建立/var/www/extsuite并复制源码到该目录,相关命令:

    mkdir /var/www/extsuite
    cp -r src/extmail-0.24-pre8 /var/www/extsuite/extmail
    cd /var/www/extsuite/extmail
    cp webmail.cf.default webmail.cf
    cd $OLDPWD
    

    注意:上面命令行中最后一个cd $OLDPWD是返回原始路径(即ExtMail Solution软件包根目录)

    编辑webmail.cf

    用vi打开/var/www/extsuite/extmail/webmail.cf,并按2次ESC键以确保进入命令模式,然后输入:

    :1, $ s#/var/www/cgi-bin#/var/www/extsuite#g
    

    上述命令的作用是将默认路径从/var/www/cgi-bin下换到/var/www/extsuite下,处理完毕后,修改webmail.cf里的其他参数,主要变动的内容见下:

    SYS_USER_LANG = zh_CN
    SYS_USER_CHARSET = gb2312
    
    SYS_MFILTER_ON = 1
    SYS_NETDISK_ON = 1
    
    SYS_MYSQL_USER = extmail
    SYS_MYSQL_PASS = extmail
    SYS_MYSQL_DB = extmail
    
    SYS_G_ABOOK_TYPE = file
    SYS_G_ABOOK_FILE_CHARSET = gb2312
    


    其中SYS_MFILTER_ON及SYS_NETDISK_ON 设置为1是为了打开网络磁盘和过滤器。全局地址本默认为ldap格式,现在也改为文本格式,并将地址本的转换编码改为GB2312

    更新cgi目录权限

    由于SuEXEC的需要,必须将extmail的cgi目录修改成vuser:vgroup权限:

    chown -R vuser:vgroup /var/www/extsuite/extmail/cgi/
    

    安装管理后台-ExtMan

    在ExtMail-Solution软件包根目录下执行:

    cp -r src/extman-0.16-pre1 /var/www/extsuite/extman/
    


    配置webman.cf

    用vi编辑/var/www/extsuite/extman/webman.cf,并连按2次ESC,确保进入命令模式,然后输入如下命令:

    :1, $ s#/var/www/cgi-bin#/var/www/extsuite#g
    


    处理完毕后修改SYS_CHARSET及SYS_LANG参数为:

    SYS_CHARSET = gb2312 //新版中不用设置
    SYS_LANG = zh_CN  //新版中不用设置
    
    注:x86_64还需添加
    SYS_MYSQL_USER = webman
    SYS_MYSQL_PASS = webman
    SYS_MYSQL_DB = extmail
    SYS_MYSQL_HOST = localhost
    SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock
    SYS_SESS_DIR = /home/tmp/extman/
    


    其他参数基本上可以使用默认值。

    更新cgi目录权限

    由于SuEXEC的需要,必须将extman的cgi目录修改成vuser:vgroup权限:

    chown -R vuser:vgroup /var/www/extsuite/extman/cgi/ 
    


    确认MySQL状态

    在执行mysql操作前,必须确认它已被正确安装并启动,可以用rpm命令查询mysql server的安装情况,用ps ax的办法查看进程列表是否有mysqld进程:

    rpm -aq|grep -i mysql-server 
    

    正常情况下应该可以看到mysql-server被安装:

    mysql-server-4.1.12-3.RHEL4.1 
    

    如果没有,则表示没有安装好mysql-server,可以从本软件包RPMS目录里安装,也可以找安装光盘安装:

    rpm -ivh RPMS/mysql-server-4.1.12-3.RHEL4.1.i386.rpm 
    

    安装完毕后必须初始化mysql,然后重新启动

    /usr/bin/mysql_install_db
    /etc/init.d/mysqld start
    

    正常情况下将启动成功:

    Starting MySQL:                                            [  OK  ]
    

    然后用ps命令来检查mysqld是否正确运行:

    ps ax|grep mysqld 
    

    正常情况下应出现如下的结果:

    433 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf --pid-file=/var/run/mysqld/mysqld.pid
    466 pts/0 Sl 0:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking --socket=/var/lib/mysql/mysql.sock 
    

    如果mysql没正确启动,请检查/var/log/mysqld.log里面的出错提示,进行处理:

    tail /var/log/mysqld.log 
    


    数据库初始化

    执行以下命令导入mysql数据库结构及初始化数据,注意必须逐行输入以下命令,root密码默认为空,不可直接用鼠标复制两行命令直接输入,否则会报错!

    mysql -u root -p < /var/www/extsuite/extman/docs/extmail.sql
    mysql -u root -p < /var/www/extsuite/extman/docs/init.sql
    

    链接基本库到Extmail

    由于ExtMan的体系与ExtMail比较类似,因此ExtMan需要使用ExtMail中几个基础perl 模块,在extman的源码包里,包含了一个叫buildlink.sh 的小脚本,该脚本完成了这些链接的工作,使用方法:

    cd /var/www/extsuite/extman/libs/Ext
    ./buildlink.sh build /var/www/extsuite/extmail/libs/Ext
    mkdir /tmp/extman
    chown -R vuser:vgroup /tmp/extman
    cd $OLDPWD
    

    操作完毕后,需要建立刚才导入mysql的test@extmail.org帐户的Maildir,请输入如下命令:

    cd /var/www/extsuite/extman/tools
    ./maildirmake.pl /home/domains/extmail.org/test/Maildir
    chown -R vuser:vgroup /home/domains/extmail.org
    cd $OLDPWD
    

    注意事项:

    上面命令行中最后一个cd $OLDPWD是返回原始路径(即ExtMail Solution软件包根目录)

    由于RedHat发行版中包含了一个叫tmpwatch的工具,该工具会定期扫描/tmp/下的文件,如果这些文件很久都没被使用,将被删除,因此如果后台长期不使用,/tmp/extman目录有可能被tmpwatch删除,所以要么定期登陆后台,要么修改 webman.cf将临时目录修改到另一个地方。此处暂以/tmp/extman默认值为例。

    上述导入初始化SQL时,默认的uidnumber/gidnumber都是1000,这和vuser:vgroup 的uid/gid一致,是因为maildrop投递时会从数据库里取uidnumber/gidnumber,而在master.cf里已经定义好了投递时的运行身份(vuser:vgroup),所以这两个字段的内容必须为1000,否则将出现投递错误,例如报0x06等错误。


    测试authlib

    在命令行下执行:

    /usr/sbin/authtest -s login test@extmail.org test 
    

    结果如下:

    Authentication succeeded.
    
         Authenticated: test@extmail.org  (uid 1000, gid 1000)
        Home Directory: /home/domains/extmail.org/test
               Maildir: /home/domains/extmail.org/test/Maildir/
                 Quota: 5242880
    Encrypted Password: {crypt}uywiuN.XggXXc
    Cleartext Password: test
               Options: (none)
    

    这样表明ExtMan的正确安装,数据库也正确导入,courier-authlib能正确连接到mysql数据库

    最后访问http://mail.extmail.org/extmail/ ,如无意外,将看到webmail的登陆页,不过此时还没有加正式的用户,所以不能登陆,包括test@extmail.org也不行。必须要登陆到http://mail.extmail.org/extman/ 里增加一个新帐户才能登陆。

    ExtMan的默认超级管理员帐户是root@extmail.org,密码是extmail,登陆成功后,建议将密码修改,以确保安全。

    配置图形化日志系统-mailgraph_ext

    自ExtMan 0.14-pre2 开始,系统集成了Mailgraph_ext插件,该插件使extman具备图形化显示邮件日志的能力。mailgraph_ext融合了mailgraph和queuegraph两个软件包,除增加了更多的日志分析及图形显示能力外,还重写了web模块,集成到ExtMan后台里,这样邮件日志将只能给经过授权的用户查看,提高了安全性。

    mailgraph_ext及Extman都需要安装rrdtool工具

    必需的软件包

    - Perl 5.6+ (建议5.8以上)
    - rrdtool 及rrdtool的perl包,地址:
      http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
    - File::Tail (还需要Time::HiRes模块)
    

    RHEL/CentOS一般自带了perl-Time-HiRes(1.5x)所以以下的rpm安装也许会报错(提示冲突),可以不必理会。如果想安装本文所带的新版Time-HiRes模块,可以用如下命令删除系统自带的包:

    rpm -e perl-Time-HiRes --nodeps 
    
    附:x86_64系统
    
    到http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/下载以下软件包:
    
    rrdtool-1.2.15-1.el4.rf.x86_64.rpm
    perl-rrdtool-1.2.15-1.el4.rf.x86_64.rpm
    
    到rpmfind.net下载:
    
    perl-File-Tail-0.99.3-1.2.el4.rf.noarch.rpm
    perl-Time-HiRes-1.65-1.x86_64.rpm
    

    安装依赖包/RRDtool

    一、x86_32系统

    rpm -ivh RPMS/rrdtool-1.2.12-1hzq.i386.rpm RPMS/perl-rrdtool-1.2.12-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Time-HiRes-1.72-1hzq.i386.rpm
    rpm -ivh RPMS/perl-File-Tail-0.99.3-1hzq.i386.rpm
    

    二、x86_64系统

    rpm -ivh RPMS/rrdtool-1.2.15-1.el4.rf.x86_64.rpm RPMS/perl-rrdtool-1.2.15-1.el4.rf.x86_64.rpm
    rpm -ivh RPMS/perl-Time-HiRes-1.65-1.x86_64.rpm
    rpm -ivh RPMS/perl-File-Tail-0.99.3-1.2.el4.rf.noarch.rpm
    

    复制mailgraph_ext

    执行以下命令:

    cp -r /var/www/extsuite/extman/addon/mailgraph_ext/ /usr/local/mailgraph_ext/ 
    

    注意事项:

    本文使用qmonitor来搜集队列数据,而不是使用crontab来定时提取,这与官方网站上的文档有差异。使用qmonitor的好处是它实时的监视队列目录的变化,显示的结果更加精确。

    启动进程

    启动mailgraph_ext及qmonitor:

    /usr/local/mailgraph_ext/mailgraph-init start
    /usr/local/mailgraph_ext/qmonitor-init start
    


    加入自启动

    为了一开机就能自动执行上述进程,将上述命令加到rc.local 里面:

    echo "/usr/local/mailgraph_ext/mailgraph-init start" >> /etc/rc.d/rc.local
    echo "/usr/local/mailgraph_ext/qmonitor-init start" >> /etc/rc.d/rc.local
    

    使用方法

    等待大约15分钟左右,如果邮件系统有一定的流量,即可登陆到extman里,点“图形日志”即可看到图形化的日志。具体每天,周,月,年的则点击相应的图片进入即可。

    配置Cyrus-SASL认证

    RHEL4/CentOS4的cyrus-sasl默认没有打开authdaemon的支持,为了使用集中认证的authlib,必须打开这个支持。为此我们必须删除系统的cyrus-sasl软件包,替换成打开了authdaemon支持的sasl软件包。首先要删除系统老的cyrus-sasl:

    rpm -e --nodeps cyrus-sasl 
    
    附:x86_64系统下需先编译Cyrus-SASL:
    
    到:http://www.extmail.org/source/cyrus-sasl-2.1.19-5.EL4.src.rpm下载src包,然后:
    
    rpmbuild --rebuild cyrus-sasl-2.1.19-5.EL4.src.rpm
    
    在/usr/src/redhat/RPMS/x86_64下生成:
    
    cyrus-sasl-2.1.19-5.EL4.x86_64.rpm
    


    然后安装新的支持authdaemon的软件包

    rpm -ivh RPMS/cyrus-sasl-2.1.19-5.EL4.i386.rpm 
    


    x86_64:
    
    rpm -ivh RPMS/cyrus-sasl-2.1.19-5.EL4.x86_64.rpm 
    

    Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息,编辑/etc/postfix/main.cf,增加如下内容:

    # smtpd related config
    smtpd_recipient_restrictions =
        permit_mynetworks,
    	permit_sasl_authenticated,
    	reject_non_fqdn_hostname,
     	reject_non_fqdn_sender,
    	reject_non_fqdn_recipient,
    	reject_unauth_destination,
    	reject_unauth_pipelining,
    	reject_invalid_hostname,
    
    # SMTP AUTH config here
    broken_sasl_auth_clients = yes
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = $myhostname
    smtpd_sasl_security_options = noanonymous
    

    其次用vi编辑/usr/lib/sasl2/smtpd.conf,确保其内容为:

    x86_64系统下用vi编辑/usr/lib64/sasl2/smtpd.conf
    
    pwcheck_method: authdaemond
    log_level: 3
    mech_list: PLAIN LOGIN
    authdaemond_path:/var/spool/authdaemon/socket
    

    存盘退出后,重新启动postfix:

    /etc/init.d/postfix restart 
    


    测试SMTP认证

    通过以下命令获得test@extmail.org的用户名及密码的BASE64编码:

    perl -e 'use MIME::Base64; print encode_base64("test\@extmail.org")' dGVzdEBleHRtYWlsLm9yZw== perl -e 'use MIME::Base64; print encode_base64("test")' dGVzdA==

    然后本机测试,其过程如下(蓝色的文字是我们输入/发送到Postfix的)

    telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.localdomain (127.0.0.1).
    Escape character is '^]'.
    220 mail.extmail.org ESMTP Postfix - by extmail.org
    ehlo demo.domain.tld
    250-mail.extmail.org
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH LOGIN PLAIN
    250-AUTH=LOGIN PLAIN
    250-ENHANCEDSTATUSCODES
    250-8BITMIME
    250 DSN
    auth login
    334 VXNlcm5hbWU6
    dGVzdEBleHRtYWlsLm9yZw==
    334 UGFzc3dvcmQ6
    dGVzdA==
    235 2.0.0 Authentication successful
    quit
    221 2.0.0 Bye
    

    最后出现235 Authentication Successful 表明认证成功了。

    安装Courier-IMAP

    用以下命令安装courier-imap的rpm包,默认的courier-authlib及courier-imap都会增加系统自启动设置,因此下一次服务器启动将自动启动相应的authlib及POP3服务

    rpm -ivh RPMS/courier-imap-4.1.0-1hzq.i386.rpm 
    
    附:x86_64系统
    
    编译Courier-IMAP:转移到后面的编译courier-imap部分。
    
    用以下命令安装courier-imap的rpm包,默认的courier-authlib及courier-imap都会增加系统自启动设置
    因此下一次服务器启动将自动启动相应的authlib及POP3服务
    
    rpm -ivh RPMS/courier-imap-4.1.0-1.x86_64.rpm
    


    配置courier-imap

    由于Courier-imap的IMAP目录是按UTF-7编码的,ExtMail目前还没有正式支持IMAP目录,因此需要屏蔽IMAP,只提供pop3服务。而就目前的使用情况来看,IMAP使用的非常少,绝大部分OutLook/Foxmail用户都习惯使用POP3而非IMAP。

    vi /usr/lib/courier-imap/etc/imapd
    

    将如下这行配置:

    IMAPDSTART=YES 
    

    替换成为:

    IMAPDSTART=NO
    vi /usr/lib/courier-imap/etc/imapd-ssl
    

    再将如下配置:

    IMAPDSSLSTART=YES 
    

    替换成为:

    IMAPDSSLSTART=NO 
    

    然后重新启动courier-imap:

    /etc/init.d/courier-imap start 
    


    测试POP3

    请按如下步骤输入pop3命令测试其是否正常工作,注意蓝色的信息是我们输入到POP3服务器的

    telnet localhost 110
    Trying 127.0.0.1...
    Connected to localhost.localdomain (127.0.0.1).
    Escape character is '^]'.
    +OK Hello there.
    user test@extmail.org
    +OK Password required.
    pass test
    +OK logged in.
    list
    +OK POP3 clients that break here, they violate STD53.
    .
    quit
    +OK Bye-bye.
    Connection closed by foreign host.
    

    反病毒/内容过滤配置

    反病毒及内容过滤器是依赖Amavisd-new软件包,它是一个多功能的过滤器,能与杀毒软件及内容过滤软件(如SpamAssassin)结合,通用性较强。

    准备工作

    安装依赖的Perl包

    首先我们要确保系统自带的perl-Net-DNS软件包被删除干净,因为该包的版本较低(0.48),有已知的bug,所以必须替换成本文档提供的新版(0.5x),输入如下命令:

    rpm -e --nodeps perl-Net-DNS 
    

    Amavisd-new 及SpamAssassin需要依赖大量的第三方perl软件包,下列要安装的部分RPM在上述的操作中已经安装了,为了给出较明确的依赖关系,我们依然将这些包的名称列出,如果安装时提示有安装包已安装过,或者提示冲突,请不必惊慌。请安装如下的RPM软件包:

    一、x86_32系统

    rpm -ivh RPMS/perl-Digest-SHA1-2.07-5.i386.rpm
    rpm -ivh RPMS/perl-Digest-HMAC-1.01-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Net-IP-1.24-1hzq.i386.rpm
    rpm --nodeps -ivh RPMS/perl-Net-DNS-0.57-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Time-HiRes-1.72-1hzq.i386.rpm
    rpm -ivh RPMS/perl-HTML-Tagset-3.03-30.noarch.rpm
    rpm -ivh RPMS/perl-HTML-Parser-3.35-6.i386.rpm    
    rpm -ivh RPMS/spamassassin-3.0.5-3.el4.i386.rpm
    rpm -ivh RPMS/perl-IO-stringy-2.110-1hzq.i386.rpm
    rpm -ivh RPMS/perl-IO-Multiplex-1.08-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Net_SSLeay.pm-1.30-1hzq.i386.rpm
    rpm -ivh RPMS/perl-IO-Socket-SSL-0.97-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Net-Server-0.93-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Unix-Syslog-0.100-1hzq.i386.rpm
    rpm -ivh RPMS/perl-TimeDate-1.16-1hzq.i386.rpm
    rpm -ivh RPMS/perl-MailTools-1.67-1hzq.i386.rpm
    rpm -ivh --force RPMS/perl-MIME-Base64-3.05-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Convert-BinHex-1.119-1hzq.i386.rpm
    rpm -ivh RPMS/perl-MIME-tools-5.418-1hzq.i386.rpm
    rpm -ivh RPMS/perl-BerkeleyDB-0.26-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Convert-TNEF-0.17-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Convert-UUlib-1.051-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Compress-Zlib-1.41-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Archive-Zip-1.16-1hzq.i386.rpm
    rpm -ivh RPMS/perl-IO-Zlib-1.04-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Archive-Tar-1.26-1hzq.i386.rpm
    rpm -ivh RPMS/arc-5.21o-1hzq.i386.rpm
    rpm -ivh RPMS/zoo-2.10-9hzq.i386.rpm
    rpm -ivh RPMS/unarj-2.65-49hzq.i386.rpm
    export LANG=C
    rpm -ivh RPMS/amavisd-new-2.4.0-1hzq.i386.rpm
    chown amavis.amavis /var/spool/vscan/db/
    chkconfig --add amavisd
    

    二、x86_32系统

    以下软件包来源rpmfind.net
    
    rpm -ivh RPMS/perl-Digest-SHA1-2.07-5.x86_64.rpm
    rpm -ivh RPMS/perl-Digest-HMAC-1.01-13.noarch.rpm
    rpm -ivh RPMS/perl-Net-IP-1.25-1.el4.rf.noarch.rpm
    rpm --nodeps -ivh RPMS/perl-Net-DNS-0.59-1.fc3.rf.x86_64.rpm
    rpm -ivh RPMS/perl-Time-HiRes-1.65-1.x86_64.rpm
    rpm -ivh RPMS/perl-HTML-Tagset-3.03-30.noarch.rpm
    rpm -ivh RPMS/perl-HTML-Parser-3.35-6.x86_64.rpm    
    rpm -ivh RPMS/spamassassin-3.1.7-1.el4.rf.x86_64.rpm
    rpm -ivh RPMS/perl-IO-stringy-2.110-1.2.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-IO-Multiplex-1.08-3.el4.rf.noarch.rpm
    
    Net_SSLeay.pm包无法从rpmfind.net获得,需要通过源码安装,到http://www.cpan.org下载编译:
    tar zxvf Net_SSLeay.pm-1.30.tar.gz
    perl Makefile.PL
    make
    make test
    make install
    
    rpm -ivh RPMS/perl-Net_SSLeay.pm-1.30-el4.rf.x86_64.rpm
    rpm -ivh RPMS/perl-IO-Socket-SSL-1.01-1.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-Net-Server-0.94-1.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-Unix-Syslog-0.100-1.2.el4.rf.x86_64.rpm
    rpm -ivh RPMS/perl-TimeDate-1.16-1.2.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-MailTools-1.74-1.el4.rf.noarch.rpm
    
    MIME-Base64包无法从rpmfind.net获得,需要通过源码安装,到http://www.cpan.org下载编译:
    tar zxvf MIME-Base64-3.07.tar.gz
    perl Makefile.PL
    make
    make test
    make install
    
    rpm -ivh --force RPMS/perl-MIME-Base64-3.05-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Convert-BinHex-1.119-2.2.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-MIME-tools-5.420-1.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-BerkeleyDB-0.31-1.el4.rf.x86_64.rpm
    rpm -ivh RPMS/perl-Convert-TNEF-0.17-3.2.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-Convert-UUlib-1.051-1.2.el4.rf.x86_64.rpm
    rpm -ivh RPMS/perl-Compress-Zlib-1.42-1.el4.rf.x86_64.rpm
    rpm -ivh RPMS/perl-Archive-Zip-1.16-1.2.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-IO-Zlib-1.04-1.2.el4.rf.noarch.rpm
    rpm -ivh RPMS/perl-Archive-Tar-1.30-1.el4.rf.noarch.rpm
    rpm -ivh RPMS/arc-5.21j-0.2.el4.rf.x86_64.rpm
    rpm -ivh RPMS/zoo-2.10-2.2.el4.rf.x86_64.rpm
    rpm -ivh RPMS/unarj-2.63-0.a.2.el4.rf.x86_64.rpm
    
    以下内容新增:
    安装支持扩展名为.lzo的解码模块:
    
    rpm -ivh lzo-1.08-4.2.el4.rf.x86_64.rpm
    rpm -ivh lzop-1.01-1.2.el4.rf.x86_64.rpm
    
    安装支持扩展名为rar的解码模块:
    
    rpm -ivh compat-libstdc++-33-3.2.3-47.3.x86_64.rpm
    rpm -ivh rar-3.5.1-1.2.el4.rf.x86_64.rpm
    
    export LANG=C
    rpm -ivh RPMS/amavisd-new-2.4.0-1hzq.x86_64.rpm
    chown amavis.amavis /var/spool/vscan/db/
    chkconfig --add amavisd
    

    修改amavisd.conf

    修改的主要参数如下,请逐一对照后修改:

    $max_servers = 10;
    $sa_spam_subject_tag = '[SPAM] ';
    $mydomain = 'mail.extmail.org';
    $myhostname = 'mail.extmail.org';
    @local_domains_maps = qw(.);
    $sa_tag2_level_deflt = 5.0;
    $sa_kill_level_deflt = 5.0;
    


    注意事项:

    上述$mydomain参数与$myhostname参数相同,主要是为了方便之后的病毒/垃圾汇报邮件发给系统管理员时,能投递到本地的别名里,再转交到虚拟域的特定用户。

    增加如下参数(默认amavisd.conf没有):

    $sa_spam_modifies_subj = 0; # don't modify subject
    $remove_existing_x_scanned_headers= 1; # remove existing headers
    $remove_existing_spam_headers = 1;
    
    附:x86_64系统:
    
    如果要允许扩展名为zip|rar|arc|arj|zoo通过,则需要修改/etc/amavisd.conf,把
    
    # [ qr'^\.(zip|rar|arc|arj|zoo)$'=> 0 ], # allow any within such archives
    
    前的#去掉就行了。如果需要其他扩展名,例如exe,则只要加入即可。
    


    配置SpamAssassin

    Amavisd-new 通过Mail::SpamAssassin 模块来调用SA的功能,因此这里配置SA和常规配置SA软件有些区别,主要集中在修改local.cf文件上。

    编辑/etc/mail/spamassassin/local.cf文件

    vi /etc/mail/spamassassin/local.cf
    

    将其内容修改为:

    report_safe             1
    use_bayes               0
    auto_learn              0
    bayes_auto_expire       1
    skip_rbl_checks         1
    use_razor2              0
    use_dcc                 0
    use_pyzor               0
    dns_available           no
    

    增加Chinese_rules.cf支持

    Chinese_rules.cf是教育科研网的反垃圾邮件小组对大量垃圾邮件和正常邮件进行分析后得出的一个关键字/分数规则集,用于处理中文(简体)垃圾邮件还是比较有效的。这里我们通过如下命令增加到系统:

    wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules.cf 
    

    由于该规则每周更新一次,为了达到最好效果,最好在crontab里增加自动更新的内容,输入:

    /usr/bin/crontab -e 
    

    然后输入如下的内容:

    0 0 1 * * wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules.cf; /etc/init.d/amavisd restart 
    

    存盘退出即可。最后运行以下调试命令以确认amavisd没有错误:

    /usr/sbin/amavisd debug 
    

    如果没有异常提示或报错退出则表示一切都正常,按ctrl+c终止,然后正常启动,若提示pid不存在等错误,不必理会,只要最后启动成功即可:

    /etc/init.d/amavisd start
    

    安装ClamAV

    一、x86_32系统

    执行如下命令:

    rpm -ivh RPMS/clamav-db-0.88.3-1hzq.i386.rpm
    rpm -ivh RPMS/clamav-0.88.3-1hzq.i386.rpm
    rpm -ivh RPMS/clamd-0.88.3-1hzq.i386.rpm
    

    二、x86_64系统

    安装新的clamAV,原来提供的版本较旧,无法更新病毒库

    rpm -ivh RPMS/clamav-db-0.88.7-1.el4.rf.x86_64.rpm
    rpm -ivh RPMS/clamav-0.88.7-1.el4.rf.x86_64.rpm
    rpm -ivh RPMS/clamd-0.88.7-1.el4.rf.x86_64.rpm
    


    编辑/etc/clamd.conf文件,去掉 'LocalSocket /var/run/clamav/clamd.sock'的注释,并注释掉 'TCPSocket 3310',我们将使用unix socket而不是TCP,两者不可并存。修改完毕后,保存,变动内容见下:

    # Path to a local socket file the daemon will listen on.
    # Default: disabled
    LocalSocket /var/run/clamav/clamd.sock
    
    #TCPSocket 3310
    

    将clamav加到amavis运行组里,并调整目录权限,否则clamav将无法扫描amavisd-new产生的临时文件

    gpasswd -a clamav amavis
    usermod -G amavis clamav
    chown amavis.amavis /var/spool/vscan
    chmod 750 /var/spool/vscan
    chown amavis.amavis /var/spool/vscan/tmp
    chmod 750 /var/spool/vscan/tmp
    

    默认的/var/spool/vscan 目录属性是:

    rwx------ amavis.root 
    

    对于clamav用户而言,则无任何权限访问该目录,因此maillog里amavisd-new会提示:

    May 19 08:38:53 as3 amavis[1752]: (01752-01) ask_av (ClamAV-clamd) FAILED - unexpected result: /var/spool/vscan/tmp/amavis-20050519T083853-01752/parts: Access denied. ERROR\n
    May 19 08:38:53 as3 amavis[1752]: (01752-01) WARN: all primary virus scanners failed, considering backups 
    


    启动ClamAV及freshclam

    /etc/rc.d/init.d/clamd start
    freshclam --daemon
    

    将freshclam增加到自启动

    输入如下命令,即可使freshclam一开机就实现自启动

    echo "/usr/bin/freshclam --daemon" >> /etc/rc.d/rc.local
    

    配置Amavisd与Clamav结合

    为了使Amavisd-new能与clamav结合,需要修改/etc/amavisd.conf文件,打开clamav的支持代码,编辑/etc/amavisd.conf文件,大概在300行左右,去掉clamav的支持代码注释,并将socket路径改为/var/run/clamav/clamd.sock,如下:

    ['ClamAV-clamd',
      \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
      qr/\bOK$/, qr/\bFOUND$/,
      qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
    

    在110行左右,修改投递/拦截的方法:

    $final_virus_destiny      = D_DISCARD;
    $final_banned_destiny     = D_BOUNCE;
    $final_spam_destiny       = D_PASS;
    $final_bad_header_destiny = D_PASS;
    

    注意上述4个设置中,对spam(垃圾邮件)默认会直接反弹(BOUNCE),现在修改为继续投递(PASS)但在信头中增加相关X-Spam-Status信息等。这样可以很方便的在extmail中设置将被标记为垃圾邮件的mail投递到“垃圾邮件箱”中,便于用户翻查。

    增加邮件别名

    编辑/etc/postfix/aliases,增加如下信息,注意:默认的aliases数据库里已有一条virusalert的别名,所以请删除,再输入下面的别名记录,并确保所有记录都是唯一的:

    virusalert:    root
    spam.police:   root
    postfix:       test@extmail.org
    


    保存并执行newaliases命令生成新的别名数据库,这样所有的重新启动amavisd:

    /etc/rc.d/init.d/amavisd restart
    

    配置Postfix 集成amavisd-new

    vi /etc/postfix/master.cf
    

    增加如下内容:

    127.0.0.1:10025 inet    n       -       n       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o receive_override_options=
    

    编辑/etc/postfix/main.cf

    # Content-Filter
    content_filter = smtp:[127.0.0.1]:10024
    receive_override_options = no_address_mappings
    

    注意:receive_override_options 这里必须增加,禁止地址展开/影射,否则如果遇到别名的时候会引起冗余邮件的产生。

    保存后/etc/init.d/postfix restart


    测试Clamav

    然后输入如下命令: 每输入一行后等待1秒左右:

    telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.localdomain (127.0.0.1).
    Escape character is '^]'.
    220 mail.extmail.org ESMTP Postfix - by extmail.org
    mail from:<test@extmail.org>
    250 2.1.0 Ok
    rcpt to:<test@extmail.org>
    250 2.1.5 Ok
    data
    354 End data with <CR><LF>.<CR><LF>
    X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
    .
    250 2.0.0 Ok: queued as BC24E85260
    quit
    221 2.0.0 Bye
    Connection closed by foreign host.
    

    在邮件日志里,应该有相应的信息出现:

    May 19 10:11:44 as3 amavis[2770]: (02770-01) Blocked INFECTED (Eicar-Test-Signature), -> , quarantine: virus-20050519-101144-02770-01, Message-ID: 
    <20050519141143.F224828AA8@mail.extmail.org>, Hits: - 
    

    如果看到类似这样的日志,表明Clamav+Amavisd-new工作正常。

    反垃圾邮件-Spam Locker的配置与安装

    安装需求与准备工作

    安装需求

    支持Linux / BSD或Solaris,HP-UX等操作系统
    Perl 5.6+,建议Perl 5.8.0以上
    Net::DNS
    POSIX
    Fcntl
    Digest::MD5
    Digest::SHA1
    Digest::HMAC
    Net::IP
    

    解包软件

    cp -r src/slockd-0.083 /usr/local/slockd 
    

    安装相关Perl模块

    由于slockd是以smtp特征检测为主的软件,因此很大程度依赖dns库,必须安装Net::DNS库才能正常工作。除此外还有诸如HMAC,MD5及SHA1, Net-IP等模块。

    执行以下命令安装需要的模块,注意:这些模块在上文安装Amavisd-new时已经安装过,这里重复是为了强调slockd依赖这些软件包

    rpm -ivh RPMS/perl-Digest-SHA1-2.07-5.i386.rpm
    rpm -ivh RPMS/perl-Digest-HMAC-1.01-1hzq.i386.rpm
    rpm -ivh RPMS/perl-Net-IP-1.24-1hzq.i386.rpm
    rpm -ivh --nodeps RPMS/perl-Net-DNS-0.57-1hzq.i386.rpm
    
    附x86_64系统:
    
    rpm -ivh RPMS/perl-Digest-SHA1-2.07-5.x86_64.rpm
    rpm -ivh RPMS/perl-Digest-HMAC-1.01-13.noarch.rpm
    rpm -ivh RPMS/perl-Net-IP-1.25-1.el4.rf.noarch.rpm
    rpm --nodeps -ivh RPMS/perl-Net-DNS-0.59-1.fc3.rf.x86_64.rpm
    


    配置resolv.conf

    请确认/etc/resolv.conf里的dns服务器是离你的邮件服务器最近,速度最快的dns server,slockd很依赖dns的好坏,因此给系统配置一个快速的dns能大幅度提高处理速度。以下给出一个配置仅供参考:

    nameserver 202.96.128.68
    
    

    上述dns服务器是广东电信的DNS服务器,对于非广东朋友,请改为离你最近的dns 服务器ip

    如果可能的话,请配置一个简单的bind9,成为本地的dns cache server,可以获得最高性能。这里略过这一步骤,但您必须确保dns的配置是正确并且可靠的,否则slockd将不能工作!

    启动/测试

    执行:

    /usr/local/slockd/slockd-init start
    

    此时slockd将启动,并进入非daemon方式的监听模式,接受来自10030端口的请求,命令行下将显示如下调试信息:

    Starting spam locker daemon: slockd
    starting child 2908
    starting child 2909
    08-01 12:34:40 [2908]: Loading APF::Plugin::localctrl
    08-01 12:34:40 [2909]: Loading APF::Plugin::localctrl
    08-01 12:34:40 [2908]: Loading APF::Plugin::anvil
    08-01 12:34:40 [2908]: Loading APF::Plugin::fqdn
    08-01 12:34:40 [2909]: Loading APF::Plugin::anvil
    08-01 12:34:40 [2908]: Loading APF::Plugin::dnsbl
    08-01 12:34:40 [2909]: Loading APF::Plugin::fqdn
    08-01 12:34:40 [2909]: Loading APF::Plugin::dnsbl
    08-01 12:34:40 [2908]: Loading APF::Plugin::hostname
    08-01 12:34:40 [2909]: Loading APF::Plugin::hostname
    

    打开另一个ssh/终端窗口,进入/usr/local/slockd/tools 目录,输入:

    perl policy_sig -h localhost -p 10030 --helo FOOBAR \
    --ip 192.168.0.1 --from test@foo.com --to test@bar.com
    

    此时,程序应该返回如下错误信息:

    action=504 <FOOBAR>: rejected, see http://bl.extmail.org/cgi/why?fqdn 
    

    这表示slockd初步的正常工作了。

    后台方式运行slockd

    调试正确后,必须将slockd配置成后台服务进程(Daemon Process)。vi /usr/local/slockd/config/main.cf 将如下两个配置的注释去掉:

    # uncomment the following line if you need to daemonize
    setsid          1
    
    ## logging
    log_file        /var/log/slockd.log
    

    然后在运行slockd的命令行窗口按ctrl+c,关闭刚才运行的slockd。或者在另一个命令行窗口输入如下命令以杀死slockd进程:

    killall slockd 
    

    然后执行:

    /usr/local/slockd/slockd-init start
    

    自启动

    输入如下的命令,将slockd启动加入到系统里,这样下一次服务器重新启动,就可以自动执行slockd了。

    echo "/usr/local/slockd/slockd-init start" >> /etc/rc.d/rc.local
    

    与Postfix结合

    slockd调试正常后,必须配置postfix以使其打开对slockd的支持,编辑/etc/postfix/main.cf,将 check_policy_service inet:127.0.0.1:10030 这一行记录增加到smtpd_recipient_restrictions 里,例如:

    smtpd_recipient_restrictions =
      permit_mynetworks,
      permit_sasl_authenticated,
      reject_non_fqdn_hostname,
      reject_non_fqdn_sender,
      reject_non_fqdn_recipient,
      reject_unauth_destination,
      reject_unauth_pipelining,
      reject_invalid_hostname,
      check_policy_service inet:127.0.0.1:10030
    

    最后,重新启动postfix以使配置生效

    /etc/init.d/postfix restart 
    

    注意事项:

    上述配置是将slockd的查询放到最后,这也是进一步提高资源利用律的办法,因为有部分功能postfix已实现了,所以就先由postfix检测,如果检测不到再由slockd完成。

    最终测试

    现在通过简单的email收发来确认系统是否正常。

    发送测试邮件

    输入以下命令,通过telnet方式给test@extmail.org发送一封测试信件

    telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.localdomain (127.0.0.1).
    Escape character is '^]'.
    220 mail.extmail.org ESMTP Postfix - by extmail.org
    helo demo.extmail.org
    250 mail.extmail.org
    mail from:<test@extmail.org>
    250 2.1.0 Ok
    rcpt to:<test@extmail.org>
    250 2.1.5 Ok
    data
    354 End data with <CR><LF>.<CR><LF>
    Subject: Hello World 
    
    Hello World!
    .
    250 2.0.0 Ok: queued as 3E47685269
    quit
    221 2.0.0 Bye
    Connection closed by foreign host.
    

    此时通过另一个命令行窗口,观察maillog,命令为:

    tail -f /var/log/maillog
    

    将看到如下信息:

    Aug 1 12:51:06 centos postfix/qmgr[3017]: 041718526B: from=, size=833, nrcpt=1 (queue active)

    Aug 1 12:51:06 centos postfix/smtpd[3032]: disconnect from centos[127.0.0.1]

    Aug 1 12:51:06 centos amavis[2890]: (02890-01) Passed CLEAN, [127.0.0.1] -> , Message-ID: <20060801165039.3E47685269@mail.extmail.org>, mail_id: N8nxpoRn4Hlq, Hits: 0.107, 11561 ms

    Aug 1 12:51:06 centos postfix/smtp[3043]: 3E47685269: to=, relay=127.0.0.1[127.0.0.1],delay=27, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=02890-01, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 041718526B)

    Aug 1 12:51:06 centos postfix/qmgr[3017]: 3E47685269: removed

    Aug 1 12:51:06 centos postfix/pipe[3035]: 041718526B: to=, relay=maildrop, delay=0, dsn=2.0.0, status=sent (delivered via maildrop service)

    Aug 1 12:51:06 centos postfix/qmgr[3017]: 041718526B: removed

    上述日志表示邮件经过了amavisd-new的扫描,并且已经通过maildrop投递到用户的maildir了。至此,整个ExtMail Solution 的安装配置已经基本告一段落。对于需要进行高级调整的朋友,请留意本文附录的备注。备注的内容将不断更新,敬请留意。

    补充配置

    以下是补充的ExtMail Solution有关文档,主要是为希望进一步了解mail系统运行,并提高extmail效能的朋友准备,对于初学者而言,建议要先打好基础再进行测试。

    增加FCGI支持

    为extmail增加FCGI的支持,主要是为了获得优异的web效能,克服CGI不能应付大量访问及低效率的缺陷。根据我们的测试,CGI模式下的页面效率只有FCGI下的1/10~1/100,因此建议有条件的用户还是使用FCGI。日后ExtMail Solution的web CGI程序将全部都支持FCGI。

    安装mod_fastcgi

    mod_fastcgi 是针对Apache Web服务器的FCGI支持模块,下载地址: http://www.fastcgi.com/dist/mod_fastcgi-2.4.2.tar.gz

    注意:安装前,需要确保已经安装了httpd-devel软件包。
    

    编译指令:

    wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.2.tar.gz
    tar xfz mod_fastcgi-2.4.2.tar.gz
    cd mod_fastcgi-2.4.2
    cp Makefile.AP2 Makefile
    make top_dir=/etc/httpd install
    

    安装perl-FCGI

    除了Apache需要FCGI的支持外,extmail也需要相应的perl-FCGI模块。用以下命令安装:

    rpm -ivh RPMS/perl-FCGI-0.67-2hzq.i386.rpm 
    

    接下来将配置Apache,将如下的信息增加到/etc/httpd/conf/vhost_extmail.conf的虚拟主机配置之后:

    LoadModule fastcgi_module modules/mod_fastcgi.so
    
    <Ifmodule mod_fastcgi.c>
    FastCgiExternalServer /usr/bin/dispatch.fcgi -host 127.0.0.1:8888
    </Ifmodule>
    

    同时,去掉如下行:

    ScriptAlias /extmail/cgi/ /var/www/extsuite/extmail/cgi/ 
    

    改为:

    Alias /extmail/cgi/ /usr/bin/dispatch.fcgi/
    <Location "/extmail/cgi">
    SetHandler fastcgi-script
    </Location>
    

    然后编辑/var/www/extsuite/extmail/dispatch-init文件,修改如下:

    BASE=/var/www/extsuite/extmail 
    

    最后启动fastcgi server:

    /var/www/extsuite/extmail/dispatch-init start 
    

    如果没有意外将启动10个dispatch.fcgi守护进程,可以通过以下命令将启动命令加到rc.local中,实现自启动:

    echo "/var/www/extsuite/extmail/dispatch-init start" >> /etc/rc.d/rc.local
    

    编译Courier-IMAP

    需要自己重新编译Courier-IMAP的朋友,可以通过如下方式完成。

    下载软件包

    wget http://jaist.dl.sourceforge.net/sourceforge/courier/courier-imap-4.1.0.tar.bz2
    

    制作RPM包

    由于courier-imap需要非root帐户进行编译,因此必须su到sysadmin这个非root用户,然后输入如下指令:

    mkdir $HOME/rpm
    mkdir $HOME/rpm/SOURCES
    mkdir $HOME/rpm/SPECS
    mkdir $HOME/rpm/BUILD
    mkdir $HOME/rpm/SRPMS
    mkdir $HOME/rpm/RPMS
    mkdir $HOME/rpm/RPMS/i386
    echo "%_topdir $HOME/rpm" >> $HOME/.rpmmacros
    

    解开courier-imap-4.1.0.tar.bz2,取出courier-imap.spec文件,复制到$HOME/rpm/SPECS里,然后再复制courier-imap-4.1.0.tar.bz2到$HOME/rpm/SOURCE里

    注意事项:

    此版本的courier-imap需要openldap等相关包,所以编译前务必安装好openldap-devel等包

    rpmbuild --ba $HOME/rpm/SPECS/courier-imap.spec 
    

    编译完毕,在$HOME/rpm/RPMS/i386/下就有所有编译成功的rpm包了!

    结束语

    通过此文档,读者应该能够较容易地架设一个功能较齐全的电子邮件系统。当使用一段时间后,用户将发现这个系统还有很多比较粗糙的地方,不尽人意。日后,本文档将继续保持更新,逐步将一些高级的设置方法公布出来,争取ExtMail Solution更加完整,力求完美。

    已知Bugs

    整个ExtMail Solution尽力将Opensource软件的优点发挥到极至,但免不了还是有bug。以下是几个已知的问题:

    WebMail

  • 删除/新增邮件时左帧数字不会变更
  • 不能处理少量违反RFC的邮件
  • 在某些版本Apache下偶尔出现会话失效问题
  • 还不支持IMAP创建的中文子目录
  • Amavisd-new

  • 退信模板还是英文的
  • 产生的汇报信息不够友好
  • Postfix

  • 本版本还不支持退信模板定制
  • 版本不是最新版
  • Spam Locker

  • 错误识别一些配置异常的mail服务器
  • 与内容过滤器结合不够紧密
  • hostname模块易造成较多误伤
  • TODO列表

  • 支持SMTP 及 POP3/IMAP的TLS/SSL加密
  • HTTP及SMTP/POP3等CA证书的配置
  • 更精细的Anti-Spam策略及关键字过滤
  • 系统安全配置(基于iptables)
  • BSD平台的ExtMail Solution文档
  • 文章声明

    作者信息:hzqbbc <hzqbbc (at) hzqbbc (dot) com> 
    
    文章原始出处:http://www.extmail.org/docs/extmail_solution_linux/ 
    
    项目首页:http://www.extmail.org
    
    Personal tools