利用Postfix搭建邮件系统

利用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.chinaunix.net/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的话,则程序会自动加上这里设置的默认域名,否则必须指定用户名为[email protected]。这里看来还是设置默认域名比较方便。在设置多个虚拟域名的时候,主域名的用户可以不用输入完整的用户邮箱,其他虚拟域则必须设置完整的邮件地址。

加入启动项

切换到源码目录下

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 = [email protected]

# 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 
# mysql -u root -pjobkoo 

注意:通过仔细的查看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 "/usr/local/mailgraph_ext/mailgraph-init start">>/etc/rc.local

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

登陆查看是否出图

extmail图形日志

四、cyrus-sasl +courier-authlib+ postfix+ courier-imap+ 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 [email protected] test

Authentication succeeded.

Authenticated: [email protected] (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, "", '1001', '1001', '/var/mailbox/', maildir, "", name, "" FROM mailbox WHERE username = '[email protected]' AND (active='1')

↓验证密码成功

Jul 28 11:09:01
example authdaemond: password matches successfully

↓authmysql 模块获得查询结果

Jul 28 11:09:01
example authdaemond: authmysql: sysusername=, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, [email protected], fullname=test, maildir=example.com/test/Maildir/, quota=, options=

↓authmysql 分析clearpasswd字段和passwd字段值

Jul 28 11:09:01
example authdaemond: authmysql: clearpasswd=, passwd=$1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0

↓通过验证显示用户信息

Jul 28 11:09:01
example authdaemond: Authenticated: sysusername=, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, [email protected], fullname=test, maildir=example.com/test/Maildir/, quota=, options=

↓验证成功显示用户密码信息

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认证

通过以下命令获得[email protected]的用户名及密码的BASE64编码:

perl -e 'use MIME::Base64; print encode_base64("test\@example.com")'

dGVzdEBleGFtcGxlLmNvbQ==

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.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自行建立[email protected]用户,密码:test)

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 test

+OK logged in.

list

+OK POP3 clients that break here, they violate STD53.

.

quit

+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, "", '1001', '1001', '/var/mailbox/', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = '[email protected]' AND (active='1')

Jul 28 13:17:08 example authdaemond: password matches successfully

Jul 28 13:17:08 example authdaemond: authmysql: sysusername=, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, [email protected], fullname=test, maildir=example.com/test/Maildir/, quota=5242880SS, options=

Jul 28 13:17:08 example authdaemond: authmysql: clearpasswd=, passwd=$1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0

Jul 28 13:17:08 example authdaemond: Authenticated: sysusername=, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, [email protected], fullname=test, maildir=example.com/test/Maildir/, quota=5242880SS, options=

Jul 28 13:17:08 example authdaemond: Authenticated: clearpasswd=test, passwd=$1$c9tbTCdr$4NOnlVJlaMOoPYUSFSyCU0

↑=============== 通过认证 ================

↓通过pop3登陆

Jul 28 13:17:08 example pop3d: LOGIN, [email protected], ip=[::ffff:127.0.0.1], port=[57719]

↓退出pop3

Jul 28 13:17:12 example pop3d: LOGOUT, [email protected], 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 [email protected] <~/.bashrc

mail -s 'hello' -v [email protected] 

再次登录pop3查看是否有新邮件

# 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 test

+OK logged in.

list

+OK POP3 clients that break here, they violate STD53.

1 653 # 已经发现有一封邮件了。1代表第一封邮件,653为邮件大小

2 1849

.

quit

+OK Bye-bye.

Connection closed by foreign host.

test用户登录extmail可以收到两封邮件

5、通过MUA测试收发邮件

本次MUA软件使用Foxmail进行测试,先在Foxmail创建4个用户。3个为example.com域中的账户,另外一个为外网163的免费邮箱。各帐号如下:

[email protected]

[email protected]

[email protected]

[email protected]

下图为创建[email protected]帐号的过程,其余的3个账户过程相同。

新建[email protected]账户

填写pop3和smtp服务器地址

通过[email protected]给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 "/usr/local/clamav/bin/freshclam --daemon" >> /etc/rc.local
# echo "/usr/local/clamav/sbin/clamd" >> /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 = "$MYHOME/db";

$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 = "virusalert@$mydomain";

$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, ["CONTSCAN {}n", "/tmp/clamd.socket"],

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投递到"垃圾邮件箱"中,便于用户翻查。

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 "/usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid" >>/etc/rc.local

启动amavisd并加入到系统启动

# /usr/local/sbin/amavisd start
# echo "/usr/local/sbin/amavisd start " >>/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建立一个[email protected]帐户别名 [email protected] 因为遇到邮件中有病毒或垃圾邮件的话postfix会给[email protected] 发一封邮件。

利用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:
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.

查看邮件日志

# 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=<[email protected]>

Jul 29 16:20:44 example postfix/qmgr[25857]: 64B3E2C011E: from=, 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=

Jul 29 16:20:45 example postfix/qmgr[25857]: B08882C0120: from=, 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]  -> , quarantine: virus-TMwuDh4Ms020, Message-ID: <[email protected]>, mail_id: TMwuDh4Ms020, Hits: -, size: 424, 673 ms

Jul 29 16:20:45 example postfix/smtp[25984]: 64B3E2C011E: to=, 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: [email protected]

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, "", '1001', '1001', '/var/mailbox/', maildir, concat(quota,'S'), name, "" FROM mailbox WHERE username = '[email protected]' AND (active='1')

Jul 29 16:20:45 example authdaemond: Authenticated: sysusername=, sysuserid=1001, sysgroupid=1001, homedir=/var/mailbox/, address= postmaster @example.com, fullname=
PostMaster, maildir=example.com/
postmaster /Maildir/, quota=
104857600SS, options=

Jul 29 16:20:45 example authdaemond: Authenticated: clearpasswd=, 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打包,发给了[email protected]这个账户,从蓝色的日志文件中可以很清楚的看到。通过extmail登陆[email protected]后可以看到警报邮件的内容,如下图:

六、最终测试

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

发送测试邮件

输入以下命令,通过telnet方式给[email protected]发送一封测试信件

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: 
250 2.1.0 Ok
rcpt to: 
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=, 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]  -> , Message-ID: <[email protected]>, mail_id: NR8p7K6scsUW, Hits: -1.44, size: 391, queued_as: 6C1C92C012A, 14851 ms
Jul 29 17:15:08 example postfix/smtp[26110]: 431572C00CD: to=, 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 "/usr/local/mailgraph_ext/mailgraph-init start">>/etc/rc.local
# echo "/usr/local/mailgraph_ext/qmonitor-init start">>/etc/rc.local

启动

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

clamav

加入启动项

# echo "/usr/local/clamav/bin/freshclam --daemon" >> /etc/rc.local
# echo "/usr/local/clamav/sbin/clamd" >> /etc/rc.local

启动

# /usr/local/clamav/bin/freshclam --daemon
# /usr/local/clamav/sbin/clamd

amavisd-new

# /usr/local/sbin/amavisd start
# echo "/usr/local/sbin/amavisd start " >>/etc/rc.local

启动spamassassin 并加入到系统启动

# /usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid
# echo "/usr/bin/spamd --daemonize --pidfile /var/run/spamd.pid" >>/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 设置为 空 ,或者干脆注掉。

使用命令直接修改选项值postconf -e mydestination=

3、maillog日志报错显示:maildrop: Invalid home directory permissions - world writable.

解决:

这个错误发起时maildrop程序,报告的错误内容是说home目录权限无效,所有人都可写!这是不允许的。

通过将 /var/mailbox目录修改为700 文件修改为600 问题解决

附录:

参考文章

Postfix + Maildrop Howto

http://www.postfix.org/MAILDROP_README.html

配置extmail过程详解

http://llk726.blog.51cto.com/622293/122054

ExtMail Solution HOWTO for Linux

http://www.extmail.org/docs/extmail_solution_linux/#maildrop

Postfix 电子邮件系统精要

http://sery.blog.51cto.com/10037/45500

Postfix Documents

http://www.postfix.org/documentation.html

postfix+extmail的mail服务器架设维护笔记

http://ivan8321.blog.51cto.com/681139/166567

amavisd-new黑白名单设置经验总结

http://www.cnitblog.com/linus2k/archive/2008/10/16/50325.html

Clamav + Amavisd-new + 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/

你可能感兴趣的:(个人网站,邮件系统,站长文章)