一、ExtMail Solution 结构

ExtMail Solution 是一个基于优秀开源软件的电子邮件系统解决方案,核心部件包括了Postfix、Amavisd-new、ClamAV、ExtMail、ExtMan、Courier系列软件。是一个功能相对比较齐全的免费电子邮件系统。以下是其主要的特性列表:
主要特性
支持SMTP/POP3/HTTP协议
支持SMTP认证及ESMTP
可支持大容量邮箱(大于1GB)
高速Web界面访问邮箱
完整的Web管理后台
在线服务端病毒过滤
内建内容过滤
SMTP行为识别垃圾邮件
支持大量反垃圾邮件技术
图形化邮件日志分析
支持别名/多域/域管理员等
支持网络磁盘/POP3邮件
支持读/写HTML格式邮件
支持定制模板及多语言
二、邮件解决方案的软件组成:
功能模块 功能模块2 功能模块2
操作系统(OS) CentOS 5.8 CentOS和RHEL是一样的,而且升级免费
Web 服务器 Apache 2.2.x CentOS 自带
数据库/目录服务 MySQL 5.0.X CentOS 自带
邮件传输代理(MTA) postfix-2.6.2 使用最新版本2.6.2
邮件投递代理(MDA) maildrop 2.0.x 支持过滤和强大功能
Web帐户管理后台 ExtMan 1.0 支持无限域名、无限用户
WebMail 系统 ExtMail1.1.0 支持多语言、全部模板化,功能基本齐全
     
日志分析及显示 mailgraph_ext 在ExtMan中已经包含了
其他数据认证库 Courier Authlb 0.62 负责courier-imap,maildrop的认证
SMTP认证库 Cyrus SASL 2.1.x 标准的SASL实现库,可以支持Courier authlib
内容过滤器 Amavisd-new 2.6.4 Content-Filter软件,支持与Camav/SA的挂接
内容级别的反垃圾邮件工具 SpamAssassin-3.2.5 著名的SA,可以支持大量规则
防病毒软件(Anti-Virus) ClamAV 0.95.2 最热门的开源杀毒软件
SMTP阶段反垃圾邮件工具 Spam Locker 0.99 基于SMTP行为识别的Antispam软件,大量可选插件
高效的反垃圾邮件工具 Dspam-3.8 高精确度的、智能的过滤功能
Centos 5.8已经安装。
三、安装配置
1.制作yum仓库
下载软件包
整个系统的安装全过程都要求以root身份执行,如果机器没有访问外部网络的能力,则事先下载好EMOS光盘映像,并上传到服务器。 
备注:如果要在CentOS 5.x-x86_64上面进行配置,请下载EMOS_1.5_x86_64.iso,配置的文件的路径有少许改变; 
# su - root 
# mkdir /root/rpm 
# cd /root/rpm 
# wget http://www3.extmail.org/EMOS_1.5_i386.is 
制作本地 yum 仓库 
使用EMOS-1.5.ISO光盘制作本地 yum 仓库; 
此外,我们假设本次安装默认域是extmail.org,主机名为:mail.extmail.org 
安装CentOS-5.3光盘中createrepo工具 
# rpm -ivh createrepo-0.4.11-3.el5.noarch.rpm 
加载EMOS-1.5的光盘,请把emos的光盘放到光驱中
# mkdir /mnt/EMOS 
# mount /dev/cdrom /mnt/EMOS 
# cd /mnt 
# createrepo . 
备注:加载ISO的方法
# mkdir /mnt/EMOS 
# mount -o loop /path/emos_1.4_i386.iso /mnt/EMOS 
# cd /mnt 
# createrepo . 
创建客户端 yum 的定义文件: 
# cd /etc/yum.repos.d 
# mkdir backup 
# mv *.repo ./backup 
# vi EMOS.repo
加入以下内容: 
[EMOS] 
name=EMOS 
baseurl=file:///mnt/ 
enabled=1
gpgcheck=0 
重新获取最新的仓库信息: 
# yum clean all 
# yum list
我使用的是如下的方法
CentOS base和update repository的Postfix版本不包括对MySQL的支持,我们需要从Emos源安装Postfix,在使用YUM安装之前,先修改文件。 
使用centos默认yum源安装postfix后,在log中会提示:
fatal: unsupported dictionary type: mysql
#vi /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
exclude=postfix*
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
exclude=postfix*
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
 
备注:创建客户端 yum 文件的另一种方式: 
当你没有EMOS的光盘,但是服务器可以联网时,你可以直接采用Extmail官网的yum源 
# vi /etc/yum.repos.d/EMOS-Base.repo 
加入以下内容:
# EMOS-Base.repo
#
# Created by ExtMail Dev Team: http://www.extmail.org/
#
# $Id$
[EMOS-base]
name=EMOS-Base
baseurl=http://mirror.extmail.org/yum/emos/1.5/os/$basearch/
gpgcheck=0
priority=0
protect=0
[EMOS-update]
name=EMOS-Updates
baseurl=http://mirror.extmail.org/yum/emos/1.5/updates/$basearch/
gpgcheck=0
priority=0
protect=0
保存后,然后尝试执行一下yum list 等操作,看看是否已经成功。
安装postfix
# yum install postfix
# rpm -e sendmail
2、配置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
增加如下内容:
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
html_directory = no
inet_interfaces = all 
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mynetworks = 127.0.0.1 
myhostname = mail.test.homeweb.cn  
mydomain = test.homeweb.cn  
myorigin = $myhostname
mydestination = $myhostname 
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
sample_directory = /usr/share/doc/postfix-2.3.3/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
unknown_local_recipient_reject_code = 550
# banner
mail_name = Postfix - by extmail.org
smtpd_banner = $myhostname ESMTP $mail_name
# response immediately
smtpd_error_sleep_time = 0s
# Message and return code control
message_size_limit = 5242880
mailbox_size_limit = 5242880
show_user_unknown_table_name = no#virtual_uid_maps = static:1000virtual_gid_maps = static:1000
# Queue lifetime control
bounce_queue_lifetime = 1d
maximal_queue_lifetime = 1d
#
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000
设置postfix开机自启
# chkconfig postfix on 
安装Courier-Authlib
# yum install courier-authlib
# yum install courier-authlib-mysql 
编辑/etc/authlib/authmysqlrc文件:
# vi /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)' 
修改authdaemonrc文件
# vi /etc/authlib/authdaemonrc
修改如下内容:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
启动courier-authlib:
# service courier-authlib start 
修改authdaemon socket目录权限
如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证:
#chmod 755 /var/spool/authdaemon/
安装maildrop
# yum install maildrop
配置master.cf 为了使Postfix支持Maildrop,必须修改/etc/postfix/master.cf文件,注释掉原来的maildrop的配置内容,并改为: 
maildrop   unix        -       n        n        -        -        pipe
flags=DRhu user=vuser argv=maildrop -w 90 -d ${user}@${nexthop} ${recipient} ${user} ${extension} {nexthop}
注意:flags前面有“两个空格”,如果收信失败,可以改为argv=/usr/bin/maildrop(maildrop的绝对路径) 。
配置main.cf 由于maildrop不支持一次接收多个收件人,因此必须在main.cf里增加如下参数: 
maildrop_destination_recipient_limit = 1 
测试maildrop对authlib支持
# maildrop -v
看是否出现以下内容:
maildrop 2.1.0 Copyright 1998-2005 Double Precision, Inc.
GDBM/DB extensions enabled.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
注意事项: 
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错误。
虚拟主机设置 
# vi /etc/httpd/conf/httpd.conf 
增加: 
NameVirtualHost *:80
Include conf/vhost_*.conf
编辑 vhost_extmail.conf 
# vi /etc/httpd/conf/vhost_extmail.conf 
里面定义虚拟主机的相关内容: 
# VirtualHost for ExtMail Solution
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
设置apache开机启动
# chkconfig httpd on 
安装ExtMail
# yum install extsuite-webmail
编辑webmail.cf
# cd /var/www/extsuite/extmail
# cp webmail.cf.default webmail.cf
# vi webmail.cf 
主要变动的内容见下:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
新cgi目录权限 由于SuEXEC的需要,必须将extmail的cgi目录修改成vuser:vgroup权限:
# chown -R vuser:vgroup /var/www/extsuite/extmail/cgi/ 
yum安装ExtMan
#yum install extsuite-webman
更新cgi目录权限 由于SuEXEC的需要,必须将extman的cgi目录修改成vuser:vgroup权限: 
# chown -R vuser:vgroup /var/www/extsuite/extman/cgi/ 
链接基本库到Extmail 
# mkdir /tmp/extman
# chown -R vuser:vgroup /tmp/extman 
注意事项: 
由于RedHat发行版中包含了一个叫tmpwatch的工具,该工具会定期扫描/tmp/下的文件,
如果这些文件很久都没被使用,将被删除,因此如果后台长期不使用,/tmp/extman目录有可能被tmpwatch
删除,所以要么定期登陆后台,要么修改 webman.cf将临时目录修改到另一个地方。
此处暂以/tmp/extman默认值为例。 
数据库初始化 
启动mysql
# service mysqld start
# chkconfig mysqld on 
导入mysql数据库结构及初始化数据,root密码默认为空.
# mysql -u root -p < /var/www/extsuite/extman/docs/extmail.sql
# mysql -u root -p < /var/www/extsuite/extman/docs/init.sql 
注意事项: 
上述导入初始化SQL时,默认的uidnumber/gidnumber都是1000,这和vuser:vgroup 的uid/gid一致,
是因为maildrop投递时会从数据库里取uidnumber/gidnumber,
而在master.cf里已经定义好了投递时的运行身份(vuser:vgroup),
所以这两个字段的内容必须为1000,否则将出现投递错误,例如报0×06等错误。 
设置虚拟域和虚拟用户的配置文件
# cd /var/www/extsuite/extman/docs
# cp mysql_virtual_alias_maps.cf /etc/postfix/
# cp mysql_virtual_domains_maps.cf /etc/postfix/
# cp mysql_virtual_mailbox_maps.cf /etc/postfix/
# cp mysql_virtual_sender_maps.cf /etc/postfix/ 
配置main.cf: 
# vi /etc/postfix/main.cf 
增加以下内容:
# extmail config here
virtual_mailbox_base = /home/domains(虚拟邮箱的保存路径)
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
重启postfix : 
# service postfix restart 
测试authlib
建立刚才导入mysql的[email protected]帐户的Maildir,请输入如下命令: 
cd /var/www/extsuite/extman/tools 
# ./maildirmake.pl /home/domains/extmail.org/postmaster/Maildir 
# chown -R vuser:vgroup /home/domains/extmail.org
# /usr/sbin/authtest -s login [email protected] extmail 
结果如下:
Authentication succeeded. 
      Authenticated: [email protected]  (uid 1000, gid 1000) 
    Home Directory: /home/domains/extmail.org/postmaster
    Maildir: /home/domains/extmail.org/postmaster/Maildir/
    Quota: 104857600S
Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0
Cleartext Password: extmail
           Options: (none)
这样表明ExtMan的正确安装,数据库也正确导入,courier-authlib能正确连接到mysql数据库 
最后访问http://mail.extmail.org/extmail/,如无意外,将看到webmail的登陆页,
不过此时还没有加正式的用户,所以不能登陆,包括[email protected]也不行。
必须要登陆到http://mail.extmail.org/extman/ 里增加一个新帐户才能登陆。 
ExtMan的默认超级管理员帐户:[email protected],初始密码:extmail*123*,登陆成功后,
建议将密码修改,以确保安全。
配置图形化日志 
启动mailgraph_ext
shell
# /usr/local/mailgraph_ext/mailgraph-init start 
启动cmdserver(在后台显示系统信息) 
# /var/www/extsuite/extman/daemon/cmdserver –daemon
加入开机自启动: 
# echo “/usr/local/mailgraph_ext/mailgraph-init start” >> /etc/rc.d/rc.local
# echo “/var/www/extsuite/extman/daemon/cmdserver -v -d” >> /etc/rc.d/rc.local 
使用方法: 等待大约15分钟左右,如果邮件系统有一定的流量,即可登陆到extman里,
点“图形日志”即可看到图形化的日志。具体每天,周,月,年的则点击相应的图片进入即可。 
添加定时任务:
# crontab -e 
0 4 * * * /var/www/extsuite/extman/tools/expireusers.pl -all [email protected]
30 4 * * * /var/www/extsuite/extman/tools/reportusage.pl -all /home/domains 
RHEL-5/CentOS-5的cyrus-sasl默认没有打开authdaemon的支持,为了使用集中认证的authlib,
必须打开这个支持。为此我们必须删除系统的cyrus-sasl软件包,
替换成打开了authdaemon支持的sasl软件包。 
安装cyrus-sasl
删除系统的cyrus-sasl: 
# rpm -e cyrus-sasl –nodeps
安装新的支持authdaemon的软件包 
# yum install cyrus-sasl
配置main.cf文件
Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息。 
编辑main.cf 
# vi /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 sender login matching config 
smtpd_sender_restrictions =
       permit_mynetworks,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain,
smtpd_sender_login_maps =
        mysql:/etc/postfix/mysql_virtual_sender_maps.cf,
        mysql:/etc/postfix/mysql_virtual_alias_maps.cf,  
# SMTP AUTH config here
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
编辑smtpd.conf文件
# vi /usr/lib/sasl2/smtpd.conf 
确保其内容为:
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/spool/authdaemon/socket
重新启动postfix: 
# service postfix start
测试SMTP认证
通过以下命令获得[email protected]的用户名及密码的BASE64编码: 
# perl -e ‘use MIME::Base64; print encode_base64(“postmaster\@extmail.org”)’
内容如下: 
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
# perl -e ‘use MIME::Base64; print encode_base64(“extmail”)’ 
内容如下:
ZXh0bWFpbA==
然后本机测试: 
# 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
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==     << 输入内容
334 UGFzc3dvcmQ6
ZXh0bWFpbA==     << 输入内容
235 2.0.0 Authentication successful
quit     << 输入内容
221 2.0.0 Bye
最后出现235 Authentication Successful 表明认证成功了。
安装Courier-imap
默认的courier-authlib及courier-imap都会增加系统自启动设置,因此下一次服务器启动将自动启动相应的authlib及POP3服务
# yum install courier-imap
配置courier-imap 
由于Courier-imap的IMAP目录是按UTF-7编码的,ExtMail目前还没有正式支持IMAP目录,因此需要屏蔽IMAP,只提供pop3服务。而就目前的使用情况来看,IMAP使用的非常少,绝大部分OutLook/Foxmail用户都习惯使用POP3而非IMAP。 
# vi /usr/lib/courier-imap/etc/imapd
修改内容如下: 
IMAPDSTART=NO 
# vi /usr/lib/courier-imap/etc/imapd-ssl 
修改内容如下: 
IMAPDSSLSTART=NO 
然后重新启动courier-imap: 
# service courier-imap start
测试POP3 请按如下步骤输入pop3命令测试其是否正常工作,注意蓝色的信息是我们输入到POP3服务器的(请首先登录extman自行建立[email protected]用户,密码:extmail) 
# telnet localhost 110 
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Hello there.
user [email protected]     << 输入内容
+OK Password required.
pass extmail     << 输入内容
+OK logged in.
list     << 输入内容
+OK POP3 clients that break here, they violate STD53.
.
quit     << 输入内容
+OK Bye-bye.
Connection closed by foreign host.
安装amavisd-new
#yum install amavisd-new
设置相关目录权限:
# chown -R amavis.amavis /var/spool/vscan/
配置SpamAssassin 
Amavisd-new 通过Mail::SpamAssassin 模块来调用SA的功能,因此这里配置SA和常规配置SA软件有些区别,主要集中在修改local.cf文件上。 
增加中文规则: 用于处理中文(简体)垃圾邮件。
# wget -N -P /usr/share/spamassassin www.ccert.edu.cn/spam/sa/Chinese_rules.cf
设置规则自动更新: 
# /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 -c /etc/amavisd.conf debug
如果没有异常提示或报错退出则表示一切都正常,按ctrl+c终止,然后正常启动,若提示pid不存在等错误,不必理会。 
设置amavisd开机自启: 
# service amavisd start
# chkconfig amavisd on 
配置ClamAV 
安装ClamAV
# cd /root/rpm
# wget http://packages.sw.be/clamav/clamav-0.97-1.el5.rf.i386.rpm
# wget http://packages.sw.be/clamav/clamd-0.97-1.el5.rf.i386.rpm
# wget http://packages.sw.be/clamav/clamav-db-0.97-1.el5.rf.i386.rpm
# rpm -ivh clam*
备注: 这里的ClamAV采用packages.sw.be站点的RPM包,因为EMOS里面的版本太旧,导致测试时老出问题。
编辑clamd.conf文件
# vi /etc/clamd.conf
去掉 ‘LocalSocket /var/run/clamav/clamd.sock’的注释,并注释掉 ‘TCPSocket 3310’,我们将使用unix socket而不是TCP,两者不可并存。
变动内容见下:
# 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 目录属性是: 
drwxr-x---   5 amavis amavis 
对于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-20050519T 
083853-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及开机自启: 
# service clamd start
# freshclam –daemon 
配置amavisd.con文件 
修改amavisd.conf
# vi /etc/amavisd.conf 
$mydomain = 'extmail.org';
$db_home   = "$MYHOME/db";
$lock_file = "$MYHOME/amavisd.lock";  # -L 
$pid_file  = "$MYHOME/amavisd.pid";   # -P 
$myhostname = 'mail.extmail.org'; 
@local_domains_maps = qw(.);
@mynetworks = qw( 127.0.0.0/8 );
对本地发出的邮件不进行内容过滤
$policy_bank{'MYNETS'} = {   # mail originating from @mynetworks 
  originating => 1,  # is true in MYNETS by default, but let's make it explicit 
  os_fingerprint_method => undef,  # don't query p0f for internal clients 
  allow_disclaimers => 1,  # enables disclaimer insertion if available 
  bypass_spam_checks_maps => [1],
  bypass_banned_checks_maps => [1],
  bypass_header_checks_maps => [1],
};  
$sa_spam_modifies_subj = 0;            # 当邮件被认为是垃圾邮件时,是否修改邮件的主题 
$remove_existing_x_scanned_headers= 1; # 凡是经过 Amavisd 过滤的邮件,都会在邮件头中被加入一行邮件头信息 
$remove_existing_spam_headers = 1;
# 修改投递/拦截的方法: 
$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_DISCARD;
$final_spam_destiny       = D_PASS; 
$final_bad_header_destiny = D_PASS; 
# 配置Amavisd与Clamav结合 
@av_scanners = (
['ClamAV-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
@av_scanners_backup = (
  ['ClamAV-clamscan', 'clamscan',
    "--stdout --no-summary -r --tempdir=$TEMPBASE {}",
    [0], qr/:.*\sFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
amavisd.conf常用参数说明:
$max_servers = 10;                   设置最大可使用的进程数
$sa_spam_subject_tag = '[SPAM] ';    加 [SPAM] 标记
$mydomain = 'mail.extmail.org';      设置域名
$myhostname = 'mail.extmail.org';    设置主机名
@local_domains_maps = qw(.);         对所有的域检查
$sa_tag2_level_deflt = 5.0;          超过这个分数,允许在邮件标题加入[SPAM] 标记
$sa_kill_level_deflt = 5.0;          超过这个分数,直接將信件备份后删除
$final_virus_destiny:                检测到病毒时的动作 
$final_banned_destiny:               检测到受禁止的内容时的动作 
$final_spam_destiny:                 检测到垃圾邮件、广告邮件(spam)时的动作 
$final_bad_header_destiny:          检测到不良信件时的动作 
 默认有以下几种动作: 
 D_PASS:                              无论信件是否有问题,都会将信件发给收件人 
D_DISCARD:                           信件将被丢弃,并且不会告知收件人及发件人 
D_BOUNCE:                            信件不会发送给收件人,但会通知发件人邮件没有被投递 
D_REJECT:                            邮件不会被投递给收件人,但会通知发件人邮件被拒绝 
配置Postfix 集成amavisd-new 
增加邮件别名 
# vi /etc/postfix/aliases 
增加如下信息,注意:默认的aliases数据库里已有一条virusalert的别名,请删除,再输入下面的别名记录,并确保所有记录都是唯一的: 
virusalert:    root
spam.police:   root
postfix:       [email protected]
保存并执行newaliases命令生成新的别名数据库,重新启动amavisd:
# newaliases
# service amavisd restart 
编辑master.cf文件: 
# vi /etc/postfix/master.cf
增加如下内容:
smtp-amavis unix    -    -    n    -    3    smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=10
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=no_unknown_recipient_checks,no_header_body_checks 
编辑main.cf文件: 
# vi /etc/postfix/main.cf 
增加如下内容:
# Content-Filter
content_filter = smtp-amavis:127.0.0.1:10024
receive_override_options = no_address_mappings
注意:receive_override_options 这里必须增加,禁止地址展开/影射,否则如果遇到别名的时候会引起冗余邮件的产生。 
重启postfix : 
# service postfix restart 
重新启动amavisd: 
# service amavisd restart 
测试Clamav
# 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:     << 输入内容
250 2.1.0 Ok
rcpt to:     << 输入内容
250 2.1.5 Ok
data     << 输入内容
354 End data with .
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.
在邮件日志里,应该有相应的信息出现:
Mar 22 06:43:15 localhost amavis[15405]: (15405-01) Blocked INFECTED (Eicar-Test-Signature), [192.168.0.235] ->, quarantine: 
virus-mI6vbjkWZ2Tz, Message-ID: <003401c88c1a$74706360$eb00a8c0@nbk00045>, mail_id: mI6vbjkWZ2Tz, Hits: -, size: 1757, 474 ms
如果看到类似这样的日志,表明Clamav+Amavisd-new工作正常。 
附件是我的配置文件。