设为首页 收藏本站
查看: 1296|回复: 0

[经验分享] 利用Postfix搭建邮件系统

[复制链接]

尚未签到

发表于 2015-11-24 12:10:28 | 显示全部楼层 |阅读模式
  利用Postfix搭建邮件系统
  目录
  一、预备知识
  二、安装前准备工作
  1、试验环境
  2、下载软件
  3、创建相关用户
  4、卸载系统中相关软件
  5、系统环境
  6、创建相应目录
  7、安装必备组件
  三、安装及初始配置
  1、源码包路径
  2、安装/配置Apache
  3、安装MySQL
  4、安装/配置courier-authlib
  5、安装/配置Cyrus-SASL2
  6、Postfix安装/配置
  7、安装/配置 courier-imap
  8、安装 pcre
  9、安装maildrop
  10、安装extmail与extman
  四、cyrus-sasl +courier-authlib+ postfix+ courier-imap+ maildrop联合配置与调试
  1、完善配置postfix
  2、验证courier-authlib认证
  3、测试SMTP认证
  4、测试POP3
  5、通过MUA测试收发邮件
  五、邮件发垃圾和反病毒
  1、杀毒软件
  2、邮件病毒扫描与垃圾邮件过滤
  六、最终测试
  七、整理启动服务及进程
  八、利用Postal进行压力测试
  附录
  一、预备知识
  MUA (Mail User Agent) :
  顾名思义 MUA 就是『邮件使用者代理人』的意思,因为除非你可以直接利用类似 telnet 之类的软件登入邮件主机来主动发出信件,否则您就得要透过 MUA 来帮你送信到邮件主机上头去。 最常见的 MUA 像是 Mozilla 推出的Thunderbird ( 雷鸟 ) 自由软件, 或者是 Linux 桌面 KDE 常见的 Kmail ,及 Windows 内件的 Outlook Express (OE) 等 。MUA 主要的功能就是收受邮件主机的电子邮件,以及提供用户浏览与编写邮件的功能!
  MTA (Mail Transfer Agent) :
  MUA 帮用户传送邮件到邮件主机上,那这部邮件主机如果能够帮用户将这封信寄出去, 那他就是一部邮件传送主机 (MTA) 啦!这个 MTA 就是『邮件传送代理人』的意思。也来顾名思义一下,既然是『传送 代理人』, 那么使用者寄出的信,与使用者要收信时,就是找他 (MTA) 就对啦!基本上, MTA 的功能有这些:
  1. 收受信件:使用简单邮件传送协议 (SMTP)
  MTA 主机最主要的功能就是:将来自客户端或者是其他 MTA 的来信收下来,这个时候 MTA 使用的是 Simple Mail Transfer Protocol (SMTP) ,他使用的是 port 25 啦!
  2. 转递信件:
  如果该封信件的目的地并不是本身的用户,且该封信的相关数据符合使用 MTA 的权力, 那么咱们的 MTA 就会将该封信再传送到下一部主机上。这即是所谓的转递 (Relay) 的功能。
  3. 响应使用者的收信要求:
  POP 或 IMAP 协定用户可以透过 MTA 主机提供的邮政服务协议 (Post Office Protocol, POP) 来收下自己的信件, 也可以透过IMAP (Internet Message Access Protocol) 协议将自己的信件保留在邮件主机上面, 并进一步建立邮件数据匣等进阶工作。
  总之,我们一般提到的 Mail Server 就是 MTA 啦!而严格来说, MTA 其实仅是指 SMTP 这个协议而已。 而达成 MTA的 SMTP 功能的主要套件包括老牌的 sendmail ,后起之秀的 postfix ,还有 qmail 等等。
  MDA (Mail Delivery Agent) :
  字面上的意思是『邮件递送代理人』的意思。事实上,这个 MDA 是挂在 MTA 底下的一个小程序, 最主要的功能就是: 分析由 MTA 所收到的信件表头或内容等数据, 来决定这封邮件的去向。 所以说,上面提到的 MTA 的信件转递功能,其实是由 MDA 达成的。 举例来说,如果 MTA 所收到的这封信目标是自己,那么MDA 会将这封信给他转到使用者的信箱 (Mailbox) 去, 如果不是呢?那就准备要转递出去了。此外, MDA 还有分析与过滤邮件等功能喔!如:过滤垃圾邮件,自动回复,自动转发等……。
  各主要的 MTA 程序 (sendmail,postfix...) 都有自己的 MDA 功能,不过有些外挂的程序功能更强大, 举例来说 procmail就是一个过滤的好帮手,另外 Mailscanner + Spamassassion 也是可以使用的一些 MDA 喔。
  Mailbox :
  就是电子邮件信箱!简单的说,就是某个账号专用的信件收受档案。我们的 Linux 系统默认的信箱都是放在 /var/spool/mail/ 使用者账号 中! 若 MTA 所收到的信件是本机的使用者, MDA 就会将信件送到该 mailbox 当中去!
  POP3:
  (Post Office Protocol 3)即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
  详情参见:http://baike.baidu.com/view/5404.htm
  IMAP
  Interactive Mail Access Protocol(交互式邮件存取协议)是由美国华盛顿大学所研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。
  无论是POP3还是IMAP都是描述如何从邮箱取出邮件。
  请注意:POP3/IMAP和SMTP可以组建在不同的服务器上,经常使用MUA的用户肯定记得软件的设置中经常将POP3/IMAP和SMTP进行分开设置。
  详情参见:http://baike.baidu.com/view/17877.htm
  Maildirs
  Maildirs是使用非常广泛的e-mail邮件存储格式。也可以说是一种基于目录的邮件存储格式。它在添加,移动或删除时并不依赖于应用程序级的文件锁定来维护消息的完成性。每一个消息(每一封邮件)被保存在一个独立的且名称唯一的文件中。所有的更改均使用基于文件系统的原子操作(atomic filesystem operations )因此文件系统来控制文件锁定从而避免一致性问题。通常Maildir为一个目录(名称为Maildir)其下包含三个子目录,分别为tmp,new和cur。
  详情参考:http://en.wikipedia.org/wiki/Maildir
  http://www.courier-mta.org/maildir.html
  Courier IMAP
  Courier IMAP server 是使用Maildir存储格式的高速,可扩展,企业级 IMAP 服务器。许多E-mail提供商使用Courier IMAP server来处理几十万的邮件用户,使用它建立IMAP和POP3集合代理,可以说Courier IMAP server 简直具有无限的水平扩展能力。在代理配置环境中,一些Courier 服务器提供IMAP和POP3服务,他们等待客户端登陆请求,查找并操作邮件用户的mailbox,与服务器建立代理连接,所有的这些操作都在一个单独的,无缝连接的进程中。
  Courier-IMAP主要特点
  * 小巧而高效;
  * 提供多种用户认证模块和方式;
  * 支持虚拟邮箱;
  * 可限制IMAP同时登录的总数目及同一个IP地址同时登录的数目,能有效保护系统在受到拒绝服务(Denial-of-service)攻击时不致因超载而瘫痪;
  详情参考:http://www.courier-mta.org/imap/
  maildrop
  具有过滤功能的邮件投递代理(MDA)
  详情参考:http://www.courier-mta.org/maildrop/
  Courier-Authlib
  Courier authentication library 为其他 Courier 应用程序提供验证服务。
  详情参考:http://www.courier-mta.org/authlib/
  SASL:
  SASL的英文全称是Simple Authentication and Security Layer,简单验证和安全层。SMTP 协议并没有提供用户验证功能,很容易匿名中转邮件。即使限制了可以转发的网段,也不安全。他的定义是: a method for adding authentication support to connection-based protocols,为基于连接的协议提供认证功能。SASL是一个胶合(glue)库,通过这个库把应用层 与 形式多样的认证系统整合在一起。这有点类似于 PAM,但是后者是认证方式,决定什么人可以访问什么服务,而SASL是认证过程,侧重于信任建立过程,这个过程可以调用PAM来建立信任关系。
  更详细的文档参见:
  http://www.ietf.org/rfc/rfc2222.txt rfc2222 说明文档
  http://blog.iyunv.com/u/4929/showart_110441.html Cyrus SASL Libary学习
  http://www.sendmail.org/~ca/email/cyrus/sysadmin.html 上一篇文章原文
  何谓Open-Relay?
  Open-Relay(开放转发或匿名转发)是指由于邮件服务器不理会邮件发送者或邮件接受者的是否为系统所设定的用户,而对所有的入站邮件一律进行转发(RELAY)的功能。通常,若邮件服务器的此功能开放,则我们一般称此邮件服务器是Open-Relay的。
  由于Internet E-mail 采用开放式标准,所以MTA、MDA、MUA等不同角色,可分别由许多不同的软件包来扮演。实现相同协议的不同包,可以彼此互相交流,而不管它们是在什么系统上运行。如果将一个完整的E-mail邮件系统集中在一起,你可能会发现,处SMTP的是一套软件,处理POP/IMAP的是另一套软件。但邮件系统中的每一种角色,都有许多不同的软件可以选择。
  二、安装前准备工作
  1、试验环境
  测试机环境
  操作系统: CentOS 5.3 32bit
IP地址 : 192.168.108.113
主机名 : mail.example.com
  系统环境
  名称
  版本
  说明
  Postfix
  2.2.6(src)
  MTA
  MySQL
  5.1.35(src)
  存储postfix虚拟用户信息
  courier-authlib
  0.62.4(src)
  搭配SASL做验证
  cyrus-sasl
  2.1.23(src)
  把应用(E-Mail)与验证(courier-authlib)结合在一起
  courier-imap
  4.5.1(src)
  结合postfix提供imap/imaps与pop3/pop3s服务
  perl
  5.8.8(rpm)
  解释器
  pcre
  7.9(src)
  安装Imap需要-- Perl兼容正则表达式
  httpd
  2.2.3(rpm)
  web 服务器
  Extmail
  1.1.0(web src)
  webmail
  Extman
  0.2.5(web src)
  结合extmail管理邮件用户
  Clamav
  
  杀毒软件
  amavisd-new
  
  扫描邮件病毒
  Spamassassin
  
  防垃圾邮件
  2、下载软件
  
  
  
  
  
  
  
  
  Clamav
  http://www.clamav.net/download/sources
使用版本09.5.2
  amavisd-new
  http://www.ijs.si/software/amavisd/
使用版本2.6.4
  
  
  3、创建相关用户
  用户
  组
  简介
  备注
  mysql
  mysql
  mysql用户和组
  安装mysql时创建
  vmail
  vmail
  Postfix虚拟账户所使用的用户和组
  无home目录不可能登陆系统。
uid: 1001
gid: 1001
  
  postdrop
  Postfix专用组
  该组不能包含任何成员,包括前面的postfix虚拟帐号也不例外。gid:1002
  postfix
  postfix
  Postfix主程序使用的用户和组
  uid:1000
gid:1000
  clamav
  clamav
  clamav 杀毒软件用户
  
  amavis
  amavis
  邮件扫描用户
  
  # groupadd -g 1001 vmail
# useradd -g 1001 -u 1001 -s /sbin/nologin -M vmail
# groupadd -g 1002 postdrop
# groupadd -g 1000 postfix
# useradd -g 1000 -u 1000 -s /sbin/nologin -M postfix
# useradd clamav
# useradd amavis
  4、卸载系统中相关软件
  卸载sendmail
  无论你愿不愿意,装好CentOS之后系统就为你装好了Sendmail服务,其目的是为root用户发送一些有用的信息。一山不容二虎,我们在安装Postfix之前一定要先卸载Sendmail。
# rpm -qa | grep sendmail
sendmail-8.13.8-2.el5
# service sendmail stop
# rpm -e --nodeps sendmail
  卸载sasl
  # rpm -qa |grep sasl
cyrus-sasl-lib-2.1.22-4
cyrus-sasl-devel-2.1.22-4
cyrus-sasl-2.1.22-4
cyrus-sasl-plain-2.1.22-4
# rpm -e --nodeps cyrus-sasl-lib cyrus-sasl-devel cyrus-sasl cyrus-sasl-plain
  5、系统环境
  # echo "/usr/local/lib" >> /etc/ld.so.conf
  6、创建相应目录
  虚拟用户的邮件存放路径
  # mkdir -p /var/mailbox
# chown vmail.vmail /var/mailbox
# chmod 700 /var/mailbox
  apache的base目录
  # mkdir -p /data/web
# chown vmail.vmail /data/web
  extman的临时目录
  # mkdir -p /tmp/extman
# chown vmail.vmail /tmp/extman
  clamav临时目录
  # mkdir -p /dev/shm/clamav/tmp
# chown -R amavis.amavis /dev/shm/clamav/
# echo " mkdir -p /dev/shm/clamav/tmp" >>/etc/rc.local
# echo " chown -R amavis.amavis /dev/shm/clamav/" >>/etc/rc.local
  7、安装必备组件
  # yum install perl-Unix-Syslog perl-DBI perl-Class-DBI-mysql perl-DBD-MySQL rrdtool perl-rrdtool perl-File-Tail perl-IO-stringy perl-MIME-* perl-Net-Server perl-BerkeleyDB perl-Crypt-* perl-Mail-DKIM perl-Convert-TNEF perl-Convert-UUlib perl-Archive-Zip
  三、安装及初始配置
  1、源码包路径
  /data/soft/tar 源码压缩包目录
/data/soft/src 源码解压后目录
  2、安装/配置Apache
  由于本文档主要介绍postfix及其组件的安装,这里apache的安装与配置省略。有一点要说明,由于apache是为webmail,也就是后续我们要装的extmail/extman服务的,因此这里apache的执行用户和组要修改为vmail,另外更多的针对extmail/extman的apache配置,会在安装配置extmail和extman时有所说明。
# vi /etc/httpd/conf/httpd.conf
  User vmail
Group vmail
  3、安装MySQL
  MySQL编译安装过程参见《MySQL编译安装笔记》
  4、安装/配置courier-authlib
  安装:
  # tar -xvjf courier-authlib-0.62.4.tar.bz2 -C ../src/
# cd ../src/courier-authlib-0.62.4/
# ./configure --prefix=/usr/local/courier-authlib --with-mailuser=vmail --with-mailgroup=vmail --with-mysql-libs=/usr/local/mysql/lib/mysql --with-mysql-includes=/usr/local/mysql/include/mysql --without-stdheaderdir
# make && make install
# make install-configure
# ln -s /usr/local/courier-authlib/bin/courierauthconfig /usr/bin/
  说明:在指定编译选项时需要指定mysql的include位置和lib位置,由于我mysql是源码安装的,所以这里一定要使用--with-mysql-includes和--with-mysql-includes参数指定。--without-stdheaderdir 参数是说将头文件安装到我自己制定的目录中,而非编译器找到的默认目录中。
  配置:
  安装完成后需要修改/usr/local/courier-authlib/etc/authlib/目录下的authdaemonrc 和 authmysqlrc 文件。详细修改信息如下:
# vi /usr/local/courier-authlib/etc/authlib/authdaemonrc
这个文件时告诉courier-authlib要使用什么验证方法
  # 验证模块只保留mysql
#authmodulelist="authuserdb authpam authmysql authcustom authpipe"
authmodulelist="authmysql"
#authmodulelistorig="authuserdb authpam authmysql authcustom authpipe"
authmodulelistorig="authmysql"
# 打开debug日志和包括记录验证密码,有助于以后的排错
#DEBUG_LOGIN=0
DEBUG_LOGIN=2
  # vi /usr/local/courier-authlib/etc/authlib/authmysqlrc
  这个文件是courier-authlib程序通过mysql验证时需要访问数据库的信息。还包含一些mysql语句的定义等等。
  # mysql数据库地址
MYSQL_SERVER localhost
  # 访问数据库的用户名
  MYSQL_USERNAME extmail
  # 访问数据库的密码
  MYSQL_PASSWORD extmai
  # mysql 的socket路径
  MYSQL_SOCKET /data/mysql_db/mysql.sock
  # mysql开放的端口
  MYSQL_PORT 3306
  # 进行验证的数据库是哪个。这个在后面安装extmail会有介绍
  MYSQL_DATABASE extmail
  # 进行验证时要访问那个表
  MYSQL_USER_TABLE mailbox
  # 取出密码的字段是哪个
  MYSQL_CRYPT_PWFIELD password
  # 默认域名
  DEFAULT_DOMAIN example.com
  # 这里设定mail虚拟帐号的uid
  MYSQL_UID_FIELD '1001'
  # 虚拟帐号的gid
  MYSQL_GID_FIELD '1001'
  # 登录名从哪个字段中取得
  MYSQL_LOGIN_FIELD username
  # 邮件存放路径在哪里,这里是根目录。
  MYSQL_HOME_FIELD '/var/mailbox/'
  # 邮件账户的描述信息字段
  MYSQL_NAME_FIELD name
  # 邮件账户的详细邮件目录,从maildir字段中取得。
  MYSQL_MAILDIR_FIELD maildir
  # MYSQL_USER_TABLE 表中的quota字段,这里concat函数取出S之前的字符
  MYSQL_QUOTA_FIELD concat(quota,'S')
  # 这里定义SQL语句中where的条件
  MYSQL_WHERE_CLAUSE active='1'
  注意:
  1. 默认域名可有可无,如果设置了默认域名,则在courier-authlib连接mysql验证时如果用户只指定了username为test的话,则程序会自动加上这里设置的默认域名,否则必须指定用户名为test@example.com。这里看来还是设置默认域名比较方便。在设置多个虚拟域名的时候,主域名的用户可以不用输入完整的用户邮箱,其他虚拟域则必须设置完整的邮件地址。
  加入启动项
  切换到源码目录下
  # cp courier-authlib.sysvinit /etc/init.d/courier-authlib
# chmod 755 /etc/init.d/courier-authlib
# chkconfig --add courier-authlib
# chkconfig courier-authlib on
# service courier-authlib start
  Starting Courier authentication services: authdaemond
  修改authdaemon 的socket目录权限
  如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证:
# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
# ll -d /usr/local/courier-authlib/var/spool/authdaemon
drwxr-xr-x
2 vmail vmail 4096 Jul 27 10:26 /usr/local/courier-authlib/var/spool/authdaemon
  系统集成
  # ln -s /usr/local/courier-authlib/lib/courier-authlib/* /usr/lib
# ldconfig -v
  5、安装/配置Cyrus-SASL2
  编译安装
  # tar -xvzf cyrus-sasl-2.1.23.tar.gz -C ../src/
# cd ../src/cyrus-sasl-2.1.23/
  # ./configure --disable-anon --disable-gssapi --disable-sample --disable-digest --enable-plain --enable-login --enable-sql --with-mysql=/usr/local/mysql --with-authdaemond=/usr/local/courier-authlib/var/spool/authdaemon/socket
# make && make install
  注意:红色标出的部分为先前安装的courier-authlib启动之后的socket文件位置。一定要指定,否则sasl无法和authdaemon连接
  系统集成
  # ln -s /usr/local/lib/sasl2/ /usr/lib/
  # ldconfig -v | grep sasl
  libcourierauthsasl.so -> libcourierauthsasl.so.0
  libcourierauthsaslclient.so -> libcourierauthsaslclient.so.0
  配置
  Postfix的SMTP认证需要透过Cyrus-SASL,连接到authdaemon获取认证信息,这里我们需要配置smtp的验证,后续的还需要修改postfix的main.cf文件这里先不错说明,等到了配置postfix的时候再介绍如何配置postfix的smtp认证的配置。
  在/usr/local/lib/sasl2/目录下创建smtpd.conf文件并添加如下内容:
  # vi /usr/local/lib/sasl2/smtpd.conf
  pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
log_level: 3
  authdaemond_path: /usr/local/courier-authlib/var/spool/authdaemon/socket
  6、Postfix安装/配置
  编译安装
  # tar -xvzf postfix-2.6.2.tar.gz -C ../src/
# cd ../src/postfix-2.6.2/
# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/local/lib -lsasl2'
# make install
  编译完成后程序会自动进入交互状态,等待用户的输入,一般情况下,一路回车即可完成所有的安装。
  注意: make的参数可以参考postfix源码目录下README_FILES文件夹中的INSTALL、MYSQL_README、SASL_README 文件。
  生成别名二进制文件
  # /usr/bin/newaliases
  这条命令的作用就是将/etc/alias 文件利用工具转为postfix可以读取的二进制文件,存为/etc/postfix/ aliases
  验证安装的Postfix是否支持SASL、MySQL
  # postconf -a
  cyrus
dovecot
  # postconf -m
btree
cidr
environ
hash
mysql
nis
proxy
regexp
static
unix
  注意
  (1)如果没有显示出cyrus项说明你的postfix不支持SASL,需要检查但前系统是否将libsasl库加入到系统中,利用ldconfig -v | grep 查看。如果没有libsasl2.so.2 -> libsasl2.so.2.0.23 需要将/usr/local/lib目录添加到/etc/ld.so.conf文件中然后再执行ldconfig命令使其生效。这在前面的 安装前准备工作 中已经有介绍。
(2)如果没有mysql项说明postfix不支持mysql协议的查询,肯定是编译时mysql的目录指定错误,重新查看mysql的lib目录和include目录的确切位置后重新编译安装postfix
  Postfix配置
  Postfix的配置我们放到最后等courier-imap、maildrop、extmail安装完成之后做统一的配置。
  创建虚拟用户验证配置文件的目录
  由于我们的虚拟用户是结合mysql进行验证的,postfix的配置文件中可以针对虚拟用户进行配置的定义,该目录就是存储mysql验证的配置文件。后文extman配置时会介绍。这里先创建相应目录。
  # mkdir -p /etc/postfix/mysql
  创建postfix启动daemon控制脚本
  # vi /etc/init.d/postfix
  #!/bin/sh
#
# 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
#
# $Revision: 2.4 $
#
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/sbin/postfix ] || exit 0
[ -d /etc/postfix ] || exit 0
[ -d /var/spool/postfix ] || exit 0
RETVAL=0
start() {
# Start daemons.
echo -n "Starting postfix: "
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure
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
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
RETVAL=$?
echo
return $RETVAL
}
restart() {
stop
start
}
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure
return $?
}
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure
return $?
}
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure
return $?
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
abort)
abort
;;
flush)
flush
;;
check)
check
;;
status)
status master
;;
condrestart)
# don't use /var/lock/subsys/postfix, check for postfix running directly
daemon_directory=$(postconf -h daemon_directory)
$daemon_directory/master -t 2>/dev/null && : || restart
;;
*)
echo "Usage: postfix {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
exit $?
  添加服务,指定自动启动
  # chmod +x /etc/init.d/postfix
# chkconfig --add postfix
# chkconfig postfix on
  7、安装/配置 courier-imap
  编译安装
  # tar -xvjf courier-imap-4.5.1.tar.bz2 -C ../src/
# cd ../src/courier-imap-4.5.1/
# ./configure --prefix=/usr/local/courier-imap --with-redhat --disable-root-check --enable-unicode=utf-8,iso-8859-1,gb2312,gbk,gb18030 --with-trashquota --with-dirsync --with-mysql-libs=/usr/local/mysql/lib/mysql --with-mysql-includes=/usr/local/mysql/include/mysql --with-authmysql --with-authmysql=yes CPPFLAGS='-I/usr/local/courier-authlib/include' LDFLAGS='-L/usr/local/courier-authlib/lib/courier-authlib' COURIERAUTHCONFIG='/usr/local/courier-authlib/bin/courierauthconfig'
# make && make install && make install-configure
# cp courier-imap.sysvinit /etc/rc.d/init.d/imapd
# chmod 755 /etc/rc.d/init.d/imapd
# chkconfig --add imapd
# chkconfig imapd on
  配置
  # vi /usr/local/courier-imap/etc/imapd
跳到文件最后,找到 IMAPDSTART=NO 替换为 IMAPDSTART=YES
# vi /usr/local/courier-imap/etc/pop3d
与imapd文件类似,在文件最后找到POP3DSTART=NO 修改为 POP3DSTART=YES
  启动服务
  # service imapd start
Starting Courier-IMAP server: imap pop3
  # netstat -tulnp | egrep "110|143"
tcp 0 0 :::110 :::* LISTEN 23349/couriertcpd
tcp 0 0 :::143 :::* LISTEN 23343/couriertcpd
  8、安装 pcre
  编译安装
  # tar -xvzf pcre-7.9.tar.gz -C ../src/
# cd ../src/pcre-7.9/
# ./configure
# make && make install
  9、安装maildrop
  编译安装
  # tar -xvjf maildrop-2.2.0.tar.bz2 -C ../src/
# cd ../src/maildrop-2.2.0/
#./configure --enable-sendmail=/usr/sbin/sendmail --enable-trusted-users='root vmail' --enable-syslog=1 --enable-maildirquota --enable-maildrop-uid=1001 --enable-maildrop-gid=1001 --with-trashquota --with-dirsync
# make && make install
  注意:./configure --help 查看的编译选项不全,查看目录下的INSTALL文件获得更多的编译选项。
  验证安装
  # 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.
  如果没有显示Courier Authentication Library extension enabled.说明你的maidrop还不支持courier auth,请仔细检查,重新编译maildrop建议不要自定义目录安装,可以减少不必要的麻烦,删除很方便:直接在已经编译的源代码目录 make uninstall
  知道maildrop把邮件移动到哪个用户目录还是非常有必要的,这个操作就是maildrop的日志记录。这里我们创建一个新文件/etc/maildroprc,这个文件就2行内容:如果加入反SPAM,需要更改以下内容
  # vi /etc/maildroprc
  logfile "/var/log/maildrop.log"
to "$HOME/$DEFAULT"
  注意:/etc/maildroprc 文件为maildrop工作在投递模式下的全局过滤说明文档。详细的配置说明可以参考 man maildropfilter 文档。
  # touch /var/log/maildrop.log;chown vmail.vmail /var/log/maildrop.log
  10、安装extmail与extman
  安装extmail
  # tar -xvzf extmail-1.1.0.tar.gz -C /data/web/
# cd /data/web
# mv extmail-1.1.0/ extmail
# chown vmail.vmail extmail/ -R
# cd extmail
# cp -p webmail.cf.default webmail.cf
  配置extmail
  SYS_CONFIG = /data/web/extmail/
SYS_LANGDIR = /data/web/extmail/lang
  SYS_TEMPLDIR = /data/web/extmail/html
  # web页面登陆语言设置
  SYS_USER_LANG = zh_CN
  #虚拟用户mail存放的根目录
  SYS_MAILDIR_BASE = /var/mailbox
  # 关于数据库的设置,根据实际情况设置
  SYS_MYSQL_USER = extmail
  SYS_MYSQL_PASS = extmail
  SYS_MYSQL_DB = extmail
  SYS_MYSQL_HOST = localhost
  SYS_MYSQL_SOCKET = /data/mysql_db/mysql.sock
  # courier-authlib验证程序socket位置
  SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
  # 全局联系人配置文件位置
  SYS_G_ABOOK_FILE_PATH = /data/web/extmail/globabook.cf
  注意:可以使用vi的命令批量替换相应的目录命令为 【1,$s/\/var\/www\/extsuite\//\/data\/web\//g
  安装extman
  # tar -xvzf extman-0.2.5.tar.gz -C /data/web/
# cd /data/web/
# mv extman-0.2.5/ extman; chown vmail.vmail extman -R
  配置extman
  # vi /data/web/extman/docs/init.sql
  将所有extmail.org替换为example.com 根据自己的域名替换。vi替换命令【1,$s/extmail.org/example.com/g
# vi /data/web/extman/webman.cf
  SYS_CONFIG = /data/web/extman/
  SYS_LANGDIR = /data/web/extman/lang
  SYS_TEMPLDIR = /data/web/extman/html
  SYS_MAILDIR_BASE = /var/mailbox
  # sys_sess_dir, the session dir
  SYS_SESS_DIR = /tmp/extman/
  SYS_CAPTCHA_ON = 0
  SYS_GROUPMAIL_SENDER = postmaster@example.com
  # sys_default_uid, if not set, webman will ignore it
  SYS_DEFAULT_UID = 1001
  # sys_default_gid, if not set, webman will ignore it
  SYS_DEFAULT_GID = 1001
  # 数据库相关设置
  SYS_MYSQL_USER = extman
  SYS_MYSQL_PASS = extman
  SYS_MYSQL_DB = extmail
  SYS_MYSQL_HOST = localhost
  SYS_MYSQL_SOCKET = /data/mysql_db/mysql.sock
  修改extmail创建表的mysql语句
  # vi /data/web/extman/docs/extmail.sql
vi 替换命令:【1,$s/TYPE=MyISAM/TYPE=MyISAM DEFAULT CHARSET=utf8/g
  初始化数据库
  # mysql -u root -pjobkoo </data/web/extman/docs/extmail.sql
# mysql -u root -pjobkoo </data/web/extman/docs/init.sql
  注意:通过仔细的查看extmail.sql 文件,发现其sql语句中已经有添加用户的操作。因此,下面的通过grant命令来创建用户并指定权限的操作可以省略。另外可以根据需要修改extmail.sql中用户的配置。但修改之后一定要将extmail/extman的配置也同步修改。
  将虚拟用户验证配置文件复制到/etc/postfix/mysql目录中
  # cp /data/web/extman/docs/mysql_virtual_* /etc/postfix/mysql/
  注意:这些文件是postfix的配置相关文件,其所有者必须为root。
  针对extmail/extman 对mysql的配置
  mysql> grant all on extmail.* to extmail@localhost identified by 'extmail';
  mysql> grant all on extmail.* to extman@localhost identified by 'extman';
  针对extmail/extman 对apache所做的配置
  # vi /etc/httpd/conf/httpd.conf
  # 修改Dierctoryindex 选项天际index.cgi
  DirectoryIndex
index.html index.cgi index.htm index.php index.html.var
  # 在文件最后添加下面配置
  NameVirtualHost
*:80
  <VirtualHost
*:80>
  ServerName
mail.example.com
  DocumentRoot
/data/web/extmail/html/
  ScriptAlias
/extmail/cgi /data/web/extmail/cgi
  ScriptAlias
/extman/cgi /data/web/extman/cgi
  Alias
/extmail /data/web/extmail/html
  Alias
/extman /data/web/extman/html
  </VirtualHost>
  # service httpd restart
  测试extmail/extman
  修改测试机host文件添加 192.168.108.113 mail.example.com 在浏览器访问 http://mail.example.com 显示如下页面:
  
  extmail 登陆界面
  注意:登陆管理系统后创建两个用户用于下面的联合测试使用。用户分别为:test和 zyq
。用户创建完成后查看/var/mailbox/目录下是否自动创建了example.com/text 和 zyq 目录。如果没有生成这两个文件,说明创建用户的时候没有自动生成目录,这种情况大多是因为权限不对。通过查看apache的日志排错。同时将/var/mailbox的权限设置为700 所有者设置为 vmail。
  启动图形日志服务测试
  # cp -rp /data/web/extman/addon/mailgraph_ext/ /usr/local/
  # /usr/local/mailgraph_ext/mailgraph-init start
  Starting mail statistics grapher: mailgraph_ext
  # /usr/local/mailgraph_ext/qmonitor-init start
  Starting queue statistics grapher: qmonitor
  加入到开机启动:
  # echo &quot;/usr/local/mailgraph_ext/mailgraph-init start&quot;>>/etc/rc.local
  # echo &quot;/usr/local/mailgraph_ext/qmonitor-init start&quot;>>/etc/rc.local
  登陆查看是否出图
  
  extmail图形日志
  四、cyrus-sasl &#43;courier-authlib&#43; postfix&#43; courier-imap&#43; maildrop联合配置与调试
  1、完善配置postfix
  # vi /etc/postfix/master.cf
  maildrop unix - n n - - pipe
  flags=DRhu user=vmail:vmail argv=/usr/local/bin/maildrop -d ${recipient}
  注意:该文件中需要修改的只有一处,将前面的注释去掉即可
  # vi /etc/postfix/main.cf
  myhostname = mail.example.com
  mydomain = example.com
  myorigin = $mydomain
  inet_interfaces = all
  mynetworks = 192.168.0.0/16, 127.0.0.0/8
  relay_domains = $mydestination
  alias_maps = $alias_database
  alias_database = hash:/etc/aliases
  mail_spool_directory = /var/spool/mail
  default_recipient_refill_delay = 1s
  #====================SASL ESMTP Authenticat=================
  smtpd_sasl_auth_enable = yes
  #smtpd_helo_required = yes
  smtpd_sasl_local_domain = $mydomain
  smtpd_sasl_security_options = noanonymous
  broken_sasl_auth_clients = yes
  smtpd_recipient_restrictions = permit_mynetworks,
  permit_sasl_authenticated,
  reject_invalid_hostname,
  reject_non_fqdn_hostname,
  reject_unknown_sender_domain,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unauth_pipelining,
  reject_unauth_destination
  smtpd_sasl_application_name = smtpd
  #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
  smtpd_banner = $myhostname ESMTP Jobkoo mail system (version:1.0)
  #=====================Vritual Mailbox settings=========================
  virtual_mailbox_base = /var/mailbox/
  virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf
  virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf
  virtual_alias_domains =
  virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf
  virtual_uid_maps = static:1001
  virtual_gid_maps = static:1001
  virtual_transport = maildrop
  maildrop_destination_recipient_limit = 1
  maildrop_destination_concurrency_limit = 1
  #====================QUOTA============================================
  message_size_limit = 20000000
  mailbox_size_limit = 409600000
  virtual_mailbox_limit = 20000000
  virtual_create_maildirsize = yes
  virtual_mailbox_extended = yes
  virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf
  virtual_mailbox_limit_override = yes
  virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
  virtual_overquota_bounce = yes
  启动postfix
  # postfix start
  postfix/postfix-script: starting the Postfix mail system
  查看maillog日志
  # tail -f /var/log/maillog
  Jul 28 10:35:37 example postfix/postfix-script[3275]: starting the Postfix mail system
  Jul 28 10:35:37 example postfix/master[3276]: daemon started -- version 2.6.2, configuration /etc/postfix
  2、验证courier-authlib认证
  确认courier-authlib已经运行
  # service courier-authlib restart
  # /usr/local/courier-authlib/sbin/authtest -s login test@example.com test
  Authentication succeeded.
  Authenticated: test@example.com (uid 1001, gid 1001)
  Home Directory: /var/mailbox/
  Maildir: example.com/test/Maildir/
  Quota: 5242880SS
  Encrypted Password: $1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0
  Cleartext Password: test
  Options: (none)
  说明:这样表明ExtMan的正确安装,数据库也正确导入,courier-authlib能正确连接到mysql数据库。
  下面查看maillog日志看看courier-authlib都做了什么。
  # tail -f /var/log/maillog
  ↓courier-authlib接到验证请求类型为login
  Jul 28 11:09:01 example authdaemond: received auth request, service=login, authtype=login
  ↓使用authmysql验证模块
  Jul 28 11:09:01
example authdaemond: authmysql: trying this module
  ↓由于与mysql不是长连接,这里与mysql连接时失败。
  Jul 28 11:09:01 example authdaemond: authmysqllib: mysql_ping failed, connection lost
  ↓这里重新连接mysql数据库并成功
  Jul 28 11:09:01
example authdaemond: authmysqllib: connected. Versions: header 50135, client 50135, server 50135
  ↓根据用户提交的用户名从数据库中查询信息
  Jul 28 11:09:01 example authdaemond: SQL query: SELECT username, password, &quot;&quot;, '1001', '1001', '/var/mailbox/', maildir, &quot;&quot;, name, &quot;&quot; FROM mailbox WHERE username = 'test@example.com' AND (active='1')
  ↓验证密码成功
  Jul 28 11:09:01
example authdaemond: password matches successfully
  ↓authmysql 模块获得查询结果
  Jul 28 11:09:01
example authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, address=test@example.com, fullname=test, maildir=example.com/test/Maildir/, quota=<null>, options=<null>
  ↓authmysql 分析clearpasswd字段和passwd字段&#20540;
  Jul 28 11:09:01
example authdaemond: authmysql: clearpasswd=<null>, passwd=$1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0
  ↓通过验证显示用户信息
  Jul 28 11:09:01
example authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, address=test@example.com, fullname=test, maildir=example.com/test/Maildir/, quota=<null>, options=<null>
  ↓验证成功显示用户密码信息
  Jul 28 11:09:01
example authdaemond: Authenticated: clearpasswd=test, passwd=$1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0
  注意:由于我的courier-authlib验证服务将调试信息打开了,因此可以在maillog文件中查看这么详细的日志信息。配置文件中(/usr/local/courier-authlib/etc/authlib/authdaemonrc)关于调试信息的设置分为三个级别,分别为:
0 → 关闭调试信息
  1 → 打开调试信息
  2 → 打开调试信息并显示密码
  3、测试SMTP认证
  通过以下命令获得test@example.com的用户名及密码的BASE64编码:
  # perl -e 'use MIME::Base64; print encode_base64(&quot;test\@example.com&quot;)'
  dGVzdEBleGFtcGxlLmNvbQ==
  # perl -e 'use MIME::Base64; print encode_base64(&quot;test&quot;)'
  dGVzdA==
  然后本机测试,其过程如下(粉色的文字是我们输入/发送到Postfix的)
  # telnet localhost 25
  Trying 127.0.0.1...
  Connected to localhost.localdomain (127.0.0.1).
  Escape character is '^]'.
  220 mail.example.com ESMTP Postfix - by Nathan.Zhou
  ehlo mail.example.com
  250-mail.example.com
  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
  dGVzdEBleGFtcGxlLmNvbQ==
  334 UGFzc3dvcmQ6
  dGVzdA==
  235 2.0.0
Authentication successful
  quit
  221 2.0.0 Bye
  最后出现235 2.0.0 Authentication successful表明认证成功了。
  4、测试POP3
  请按如下步骤输入pop3命令测试其是否正常工作,注意粉色的信息是我们输入到POP3服务器的(请首先登录extman自行建立test@example.com用户,密码:test)
  # telnet localhost 110
  Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
  Escape character is '^]'.
  &#43;OK Hello there.
  user test@example.com
  &#43;OK Password required.
  pass test
  &#43;OK logged in.
  list
  &#43;OK POP3 clients that break here, they violate STD53.
  .
  quit
  &#43;OK Bye-bye.
  Connection closed by foreign host.
  查看maillog日志
  # tail -f /var/log/maillog
  ↓连接pop3 端口
Jul 28 13:16:57
example pop3d: Connection, ip=[::ffff:127.0.0.1]
  ↓需要验证,服务类型为pop3
  Jul 28 13:17:08 example authdaemond: received auth request, service=pop3, authtype=login
  ↓使用authmysql模块认证
  Jul 28 13:17:08 example authdaemond: authmysql: trying this module
  ↓======= 与mysql连接获得认证信息========
  Jul 28 13:17:08 example authdaemond: authmysqllib: mysql_ping failed, connection lost
  Jul 28 13:17:08 example authdaemond: authmysqllib: connected. Versions: header 50135, client 50135, server 50135
  Jul 28 13:17:08 example authdaemond: SQL query: SELECT username, password, &quot;&quot;, '1001', '1001', '/var/mailbox/', maildir, concat(quota,'S'), name, &quot;&quot; FROM mailbox WHERE username = 'test@example.com' AND (active='1')
  Jul 28 13:17:08 example authdaemond: password matches successfully
  Jul 28 13:17:08 example authdaemond: authmysql: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, address=test@example.com, fullname=test, maildir=example.com/test/Maildir/, quota=5242880SS, options=<null>
  Jul 28 13:17:08 example authdaemond: authmysql: clearpasswd=<null>, passwd=$1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0
  Jul 28 13:17:08 example authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, address=test@example.com, fullname=test, maildir=example.com/test/Maildir/, quota=5242880SS, options=<null>
  Jul 28 13:17:08 example authdaemond: Authenticated: clearpasswd=test, passwd=$1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0
  ↑=============== 通过认证 ================
  ↓通过pop3登陆
  Jul 28 13:17:08 example pop3d: LOGIN, user=test@example.com, ip=[::ffff:127.0.0.1], port=[57719]
  ↓退出pop3
  Jul 28 13:17:12 example pop3d: LOGOUT, user=test@example.com, ip=[::ffff:127.0.0.1], port=[57719], top=0, retr=0, rcvd=12, sent=88, time=4
  root用户手动给test发2封邮件
  # mail -s 'hello' -v test@example.com <~/.bashrc
  # mail -s 'hello' -v test@example.com </etc/bashrc
  再次登录pop3查看是否有新邮件
  # telnet localhost 110
  Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
  Escape character is '^]'.
  &#43;OK Hello there.
  user test@example.com
  &#43;OK Password required.
  pass test
  &#43;OK logged in.
  list
  &#43;OK POP3 clients that break here, they violate STD53.
  1 653 # 已经发现有一封邮件了。1代表第一封邮件,653为邮件大小
  2 1849
  .
  quit
  &#43;OK Bye-bye.
  Connection closed by foreign host.
  test用户登录extmail可以收到两封邮件
  
  5、通过MUA测试收发邮件
  本次MUA软件使用Foxmail进行测试,先在Foxmail创建4个用户。3个为example.com域中的账户,另外一个为外网163的免费邮箱。各帐号如下:
  postmaster@example.com
  test@example.com
  zyq@example.com
  zyqduron@163.com
  下图为创建root@example.com帐号的过程,其余的3个账户过程相同。
  
  新建root@example.com账户
  
  填写pop3和smtp服务器地址
  通过postmaster@example.com给zyq和test发邮件
  
  编写邮件
  如果三个用户都能收到邮件说明内网同一个域中的用户互相均可以发送邮件了。
  五、邮件发垃圾和反病毒
  1、杀毒软件
  杀毒软件选用clamav
  安装
  # tar -xvzf clamav-0.95.2.tar.gz -C ../src/
# cd ../src/clamav-0.95.2/
# ./configure --prefix=/usr/local/clamav --with-dbdir=/usr/local/share/clamav
# make && make install
  说明:--with-dbdir 参数指定病毒库位置,这个路径在clamav的配置文件中也有出现。当指定了这个参数之后,编译安装后悔自动创建这个目录。
  配置
  Clamav有2个配置文件,一个主配置文件/usr/local/clamav/etc/clamd.conf,一个病毒更新配置文件 /usr/local/clamav/etc/ freshclam.conf 下面分别进行配置
  # vi /usr/local/clamav/etc/clamd.conf
  # 将example注掉
# example
  LogFile /var/log/clamd.log
  LogSyslog yes
  LogVerbose yes
  PidFile /var/run/clamav/clamd.pid
  TemporaryDirectory /dev/shm/clamav/tmp
  DatabaseDirectory /usr/local/share/clamav
  LocalSocket /tmp/clamd.socket
  StreamMaxLength 20M #附件大小,超过20M不扫描
  User amavis
  ScanMail yes
  ScanArchive yes
  # vi /usr/local/clamav/etc/freshclam.conf
  # 将example注掉
# example
  DatabaseDirectory /usr/local/share/clamav
  UpdateLogFile /var/log/freshclam.log
  PidFile /var/run/clamav/freshclam.pid
  DatabaseOwner amavis
  DatabaseMirror db.CN.clamav.net
  DatabaseMirror database.clamav.net
  说明:在两个配置文件中,都有用户的设置,我这里都设置成了 amavis 。为什么不用默认的用户clamav而使用amavis呢?这样做的目的是为了与amavis-new结合在一起。
  其中黄色背景的部分是杀毒程序的socket文件位置,后面与amavis-new结合使用的时候配置amavis-new需要指定这个文件。
  修改相应目录权限
  # chown -R amavis.amavis /usr/local/share/clamav
# chown -R amavis.amavis /dev/shm/clamav/
# touch /var/log/freshclam.log
# chown amavis.amavis /var/log/freshclam.log
# touch /var/log/clamd.log
# chown amavis.amavis /var/log/clamd.log
# mkdir -p /var/run/clamav/
# chown amavis.amavis /var/run/clamav/ -R
  手动更新病毒库并运行杀毒程序
  # /usr/local/clamav/bin/freshclam --daemon
# /usr/local/clamav/sbin/clamd
  将病毒库升级和杀毒程序设置为随系统启动
  # echo &quot;/usr/local/clamav/bin/freshclam --daemon&quot; >> /etc/rc.local
# echo &quot;/usr/local/clamav/sbin/clamd&quot; >> /etc/rc.local
  2、邮件病毒扫描与垃圾邮件过滤
  amavisd-new程序是提供postfix邮件扫描杀毒的,因此需要连接clamav杀毒软件和postfix程序。
  安装
# tar -xvzf amavisd-new-2.6.4.tar.gz -C ../src/
# cd ../src/ amavisd-new-2.6.4/
# mkdir -p /var/amavis/{tmp,var,db}
# chown -R amavis.amavis /var/amavis
# chmod -R 750 /var/amavis
# cp amavisd /usr/local/sbin/
# chown root /usr/local/sbin/amavisd
# chmod 755 /usr/local/sbin/amavisd
# cp amavisd.conf /etc/
# chown root /etc/amavisd.conf
# chmod 644 /etc/amavisd.conf
# mkdir /var/virusmails
# chown amavis.amavis /var/virusmails
# chmod 750 /var/virusmails
  配置Amavisd与Clamav结合
  # vi /etc/amavisd.conf
  $max_servers=8;
$daemon_user = 'amavis';
  $daemon_group = 'amavis';
  $mydomain = 'mail.example.com';
  $db_home = &quot;$MYHOME/db&quot;;
  $inet_socket_port = 10024;
  $sa_tag_level_deflt = 5.0;
  $sa_tag2_level_deflt = 6.2;
  $sa_kill_level_deflt = $sa_tag2_level_deflt;
  $virus_admin = &quot;virusalert@$mydomain&quot;;
  $sa_spam_subject_tag = '***SPAM*** ';
  $forward_method = 'smtp:127.0.0.1:10025';
  $notify_method = $forward_method;
  $final_virus_destiny = D_DISCARD;
  $final_banned_destiny = D_DISCARD;
  $final_spam_destiny = D_PASS;
  ['ClamAV-clamd',
  &ask_daemon, [&quot;CONTSCAN {}n&quot;, &quot;/tmp/clamd.socket&quot;],
  qr/bOK$/, qr/bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
  # 在154行左右,修改投递/拦截的方法:
  $final_virus_destiny = D_DISCARD;
  $final_banned_destiny = D_BOUNCE;
  $final_spam_destiny = D_PASS;
  $final_bad_header_destiny = D_PASS;
  注意:
  (1)配置文件编写完成后使用执行/usr/local/sbin/amavisd debug 进行调试。如果发现缺少perl组件就利用yum search 查找相关组件,最后用yum 安装,这样来的方便些!
(2)黄色背景部分是clamav 杀毒软件的socket文件,这个文件的位置是在配置clamav的时候指定的,在这里配置amavis时一定要指定正确!
(3)绿色字体部分是amavisd运行时打开的端口号
(4)粉色字体部分是与postfix连接时需要连接的地址和端口号。这个地址是在postfix的master.cf文件中指定的。后文会介绍。
(5)最后4个设置中,对spam(垃圾邮件)默认会直接反弹(BOUNCE),现在修改为继续投递(PASS)但在信头中增加相关X-Spam- Status信息等。这样可以很方便的在extmail中设置将被标记为垃圾邮件的mail投递到&quot;垃圾邮件箱&quot;中,便于用户翻查。
  mail:: spamassassin配置
  # vi /etc/mail/spamassassin/local.cf
  #required_hits 5
#report_safe 0
#rewrite_header Subject [SPAM]
required_hits 5
use_bayes 1
bayes_auto_learn 1
skip_rbl_checks 0
use_razor2 1
use_pyzor 0
  启动spamassassin 并加入到系统启动
  # /usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid
# echo &quot;/usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid&quot; >>/etc/rc.local
  启动amavisd并加入到系统启动
  # /usr/local/sbin/amavisd start
# echo &quot;/usr/local/sbin/amavisd start &quot; >>/etc/rc.local
  配置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
  # vi /etc/postfix/main.cf
  在最后添加
  # Content-Filter
content_filter = smtp:[127.0.0.1]:10024
  receive_override_options = no_address_mappings
  注意:
  (1)这里content_filter 选项指定的smtp:[127.0.0.1]:10024 端口正是配置amavisd-new时所指定的。
  (2)receive_override_options 这里必须增加,禁止地址展开/影射,否则如果遇到别名的时候会引起冗余邮件的产生。
  保存后重启postfix
  # postfix stop
  # postfix start
  测试Clamav
  先利用examail建立一个postmaster@example.com帐户别名 virusalert@example.com 因为遇到邮件中有病毒或垃圾邮件的话postfix会给virusalert@example.com 发一封邮件。
  利用telnet测试25端口,粉色字体为用户输入内容。过程如下:
  # telnet localhost 25
  Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.example.com ESMTP Jobkoo mail system (version:1.0)
mail from:<zyq@example.com>
250 2.1.0 Ok
rcpt to:<test@example.com>
250 2.1.5 Ok
data
354 End data with .
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H&#43;H*
.
250 2.0.0 Ok: queued as BC24E85260
quit
221 2.0.0 Bye
Connection closed by foreign host.
  查看邮件日志
  # tail -f /var/log/maillog
  Jul 29 16:20:28 example postfix/smtpd[25980]: connect from localhost.localdomain[127.0.0.1]
  Jul 29 16:20:36 example postfix/smtpd[25980]: 64B3E2C011E: client=localhost.localdomain[127.0.0.1]
  Jul 29 16:20:44 example postfix/cleanup[25983]: 64B3E2C011E: message-id=<20090729082036.64B3E2C011E@mail.example.com>
  Jul 29 16:20:44 example postfix/qmgr[25857]: 64B3E2C011E: from=<zyq@example.com>, size=424, nrcpt=1 (queue active)
  Jul 29 16:20:44 example postfix/smtpd[25986]: connect from localhost.localdomain[127.0.0.1]
  Jul 29 16:20:44 example postfix/smtpd[25986]: B08882C0120: client=localhost.localdomain[127.0.0.1]
  Jul 29 16:20:44 example postfix/cleanup[25983]: B08882C0120: message-id=<VATMwuDh4Ms020@example.jobkoo.com>
  Jul 29 16:20:45 example postfix/qmgr[25857]: B08882C0120: from=<virusalert@example.com>, size=2250, nrcpt=1 (queue active)
  Jul 29 16:20:45 example postfix/smtpd[25986]: disconnect from localhost.localdomain[127.0.0.1]
  Jul 29 16:20:45 example amavis[25726]: (25726-02) Blocked INFECTED (Eicar-Test-Signature), [127.0.0.1] [127.0.0.1] <zyq@example.com> -> <test@example.com>, quarantine: virus-TMwuDh4Ms020, Message-ID: <20090729082036.64B3E2C011E@mail.example.com>, mail_id: TMwuDh4Ms020, Hits: -, size: 424, 673 ms
  Jul 29 16:20:45 example postfix/smtp[25984]: 64B3E2C011E: to=<test@example.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=12, delays=12/0.01/0.01/0.67, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=25726-02 - INFECTED: Eicar-Test-Signature)
  Jul 29 16:20:45 example postfix/qmgr[25857]: 64B3E2C011E: removed
  Jul 29 16:20:45 example authdaemond: received userid lookup request: virusalert@example.com
  Jul 29 16:20:45
example authdaemond: authmysqllib: connected. Versions: header 50135, client 50135, server 50135
  Jul 29 16:20:45
example authdaemond: SQL query: SELECT username, password, &quot;&quot;, '1001', '1001', '/var/mailbox/', maildir, concat(quota,'S'), name, &quot;&quot; FROM mailbox WHERE username = 'postmaster@example.com' AND (active='1')
  Jul 29 16:20:45 example authdaemond: Authenticated: sysusername=<null>, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, address= postmaster @example.com, fullname=
PostMaster, maildir=example.com/
postmaster /Maildir/, quota=
104857600SS, options=<null>
  Jul 29 16:20:45 example authdaemond: Authenticated: clearpasswd=<null>, passwd=$1$qTrAv06G$XYL3xP4Xo058oP7wZTEMH0
  Jul 29 16:20:45 example postfix/pipe[25987]: B08882C0120: to=< postmaster @example.com>, relay=maildrop, delay=0.58, delays=0.53/0.02/0/0.02, dsn=2.0.0, status=sent (delivered via maildrop service)
  Jul 29 16:20:45 example postfix/qmgr[25857]: B08882C0120: removed
  Jul 29 16:20:50 example postfix/smtpd[25980]: disconnect from localhost.localdomain[127.0.0.1]
  说明:
  从日志中可以清楚的看到,刚刚测试的邮件被amavis捕捉到了,红色的部分表示被amavis拦截了。这时邮件经过postfix打包,发给了virusalert@example.com这个账户,从蓝色的日志文件中可以很清楚的看到。通过extmail登陆virusalert@example.com后可以看到警报邮件的内容,如下图:
  
  
  六、最终测试
  现在通过简单的email收发来确认系统是否正常。
  发送测试邮件
  输入以下命令,通过telnet方式给test@example.com发送一封测试信件
  telnet localhost 25
  Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.example.com ESMTP Postfix - by Nathan
helo Nathanzhou.example.com
250 mail.example.com
mail from:<test@example.com>
250 2.1.0 Ok
rcpt to:<zyq@example.com>
250 2.1.5 Ok
data
354 End data with .
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
  将看到如下信息:
  Jul 29 17:15:08 example postfix/qmgr[25857]: 6C1C92C012A: from=<test@example.com>, size=832, nrcpt=1 (queue active)Jul 29 17:15:08 example amavis[25728]: (25728-01) Passed CLEAN, [127.0.0.1] [127.0.0.1] <test@example.com> -> <zyq@example.com>, Message-ID: <20090729091438.431572C00CD@mail.example.com>, mail_id: NR8p7K6scsUW, Hits: -1.44, size: 391, queued_as: 6C1C92C012A, 14851 ms
Jul 29 17:15:08 example postfix/smtp[26110]: 431572C00CD: to=<zyq@example.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=35, delays=20/0.02/0.02/15, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=25728-01, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 6C1C92C012A)
Jul 29 17:15:08 example postfix/qmgr[25857]: 431572C00CD: removed
  说明:
  上述日志表示邮件经过了amavisd-new的扫描,并且已经通过maildrop投递到用户的maildir了,黄色字体表面通过检查。
  七、整理启动服务及进程
  mysql
  # chkconfig mysqld on
# service mysqld start
  apache
  # chkconfig httpd on
# service httpd start
  courier-authlib
  # chkconfig courier-authlib on
# service courier-authlib start
  postfix
  # chkconfig --list postfix
# service postfix start
  imapd
  # chkconfig imapd on
# service imapd start
  extmail 图形监控
  加入启动项
  # echo &quot;/usr/local/mailgraph_ext/mailgraph-init start&quot;>>/etc/rc.local
# echo &quot;/usr/local/mailgraph_ext/qmonitor-init start&quot;>>/etc/rc.local
  启动
  /usr/local/mailgraph_ext/mailgraph-init start
/usr/local/mailgraph_ext/qmonitor-init start
  clamav
  加入启动项
  # echo &quot;/usr/local/clamav/bin/freshclam --daemon&quot; >> /etc/rc.local
# echo &quot;/usr/local/clamav/sbin/clamd&quot; >> /etc/rc.local
  启动
  # /usr/local/clamav/bin/freshclam --daemon
# /usr/local/clamav/sbin/clamd
  amavisd-new
  # /usr/local/sbin/amavisd start
# echo &quot;/usr/local/sbin/amavisd start &quot; >>/etc/rc.local
  启动spamassassin 并加入到系统启动
  # /usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid
# echo &quot;/usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid&quot; >>/etc/rc.local
  八、利用Postal进行压力测试
  ./postal -m 100 -p 25 192.168.108.113 maillist.txt
  错误处理
  1、/var/log/message发现如下错误提示:
  postfix/smtpd[4568]: sql_select option missing
  postfix/smtpd[4568]: auxpropfunc error no mechanism available
  解决:
  /usr/lib/sasl2/smtpd.conf 文件最后添加如下内容
  allow_plaintext: true
  auxprop_plugin: mysql
  sql_hostnames: localhost
  sql_user: extmail
  sql_passwd: extmail
  sql_database: extmail
  sql_select: select password from mailbox where username='%u'
  2、maillog日志显示:warning: do not list domain jobkoo.com in BOTH mydestination and virtual_mailbox_domains
  解决:
  在maillog日志中看到这样的错误提示说明 postfix 的配置文件main.cf中 mydestination选项和virtual_mailbox_domains 所对应的数据库中的域名不符所致!
  解决方法是将 mydestination 设置为 空 ,或者干脆注掉。
  使用命令直接修改选项&#20540;postconf -e mydestination=
  3、maillog日志报错显示:maildrop: Invalid home directory permissions - world writable.
  解决:
  这个错误发起时maildrop程序,报告的错误内容是说home目录权限无效,所有人都可写!这是不允许的。
  通过将 /var/mailbox目录修改为700 文件修改为600 问题解决
  附录:
  参考文章
  Postfix &#43; Maildrop Howto
  http://www.postfix.org/MAILDROP_README.html
  配置extmail过程详解
  http://llk726.blog.iyunv.com/622293/122054
  ExtMail Solution HOWTO for Linux
  http://www.extmail.org/docs/extmail_solution_linux/#maildrop
  Postfix 电子邮件系统精要
  http://sery.blog.iyunv.com/10037/45500
  Postfix Documents
  http://www.postfix.org/documentation.html
  postfix&#43;extmail的mail服务器架设维护笔记
  http://ivan8321.blog.iyunv.com/681139/166567
  amavisd-new黑白名单设置经验总结
  http://www.cnitblog.com/linus2k/archive/2008/10/16/50325.html
  Clamav &#43; Amavisd-new &#43; Spamassassin 系统设置说明
  http://blog.csdn.net/huangyaoshifog/archive/2008/10/11/3057974.aspx
  开源邮件技术社区
  http://www.thismail.org/bbs/index.php
  Extmail官方论坛
  http://www.extmail.org/forum/index.php
  
  
  
  
  转自:http://salogs.com/category/linux%e7%bd%91%e7%bb%9c%e6%9c%8d%e5%8a%a1/mail%e6%9c%8d%e5%8a%a1/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-143055-1-1.html 上篇帖子: Postfix安装与配置 下篇帖子: 邮件服务器DKIM添加 为Postfix增加DKIM功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表