基于postfix邮件解决方案Postfix

项目

我们接下来架设一个完整的邮件系统,要求支持mysql认证,支持pop3,imap,支持sasl,拥有web界面的操作,拥有垃圾邮件过滤功能。确认了需要后我们开始选择不同的程序来完成
我们的需求,本案例使用的是在RHEL6U2 64位环境下的postfix+courier-imap+maildrop+courierauthlib+extmail+extman+ spamassassin的组合,我们先来了解一下每个部件的作用。Postfix
是一种电子邮件服务器,它是由任职于IBM华生研究中心(T.J. WatsonResearch Center)的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的。最早在1990年代晚期出现
,是一个开放源代码的软件。courier-authlib 其他数据认证库authlib是maildrop, courier-imap等服务的关键部件courier-imapPOP3 服务器 支持pop3/pop3s/imap/imaps,功能强大,可以方便
与courier-authlib联合使用,配置简单,稳定性好。maildrop 邮件投递代理(MDA)支持过滤和强大功能extmail extmail是一个webmail程序,webmail是一种收发邮件的方式,也就是通过网站
来进行收发邮件,通过该webmail程序,我们可以通过网站来收发邮件 ,像平时我们登录mail.163.com 来收发网易的邮件一样extman是一个管理邮件用户数据的软件 ,管理以下数据:某个
域的邮箱个数与该域的总容量大小域管理员还可以通过extman群发邮件给该域下的所有用户邮箱用户的帐号密码,容量大小,建立日期,到期时间,是否激活,邮件的邮件存储位置(目录)
,用户别名 等等spamassassin是一个非常优秀的垃圾邮件过滤软件。在配置此安全之前,你应该已经有一套完整的DNS系统,保证所有需要的资源记录都配置正确。


Apache通过perl脚本运行Extman与Extmail,当用户登录时通过Authlib从mysql进行认证,当认证通过后则从用户MailDir中取出邮件。POP与IMAP则由courier-imap负责,同样通过authlib
从mysql进行认证。Postfix的发信认证同样是通过mysql,MDA则使用MailDrop,他可以方便的帮我们调用spamassassin。虽然Postfix也可以自己调用spamassassin,但是使用MailDrop的优点在
于速度快。

 

需建DNS.然后发送邮件测试是否成功。再结合下面装的环境,在网页中测试收发邮件。

打开 浏 览 器,输 入 http://your_domain_name/extman

用户 为 :[email protected] 密码 为 :extmail*123*     //打开网页报权限问题, setenforce=0

建个域 发个信 测试

打开 浏 览 器,输 入 http://your_ip_address/extmail

 

 

流程

      1.装包 
    光盘自带,光盘以外。

2.Mysql

     建库、建表、授权。通过sql脚本完成

3.安装一个认证用的中间件,courierauthlib,统一由此中间键来访问mysql。

       rpm  -ivh courier-authlib-mysql      courier-authlib

1)authdaemonrc:指定使用mysql验证

2)authmysqlrc:详细的mysql连接参数。(host/user/password/db/table/select) 以下sql语句为一行。

SELECT username,password,"",uidnumber,gidnumber,CONCAT('/home/data/domains/',homedir),CONCAT('/home/data/domains/',maildir),quota,name FROM mailbox WHERE username = '$(local_part)@$(domain)'

4.rpm -ivh courier-imap-4.12.20130220-1.x86_64.rpm

       service courier-imap start

chkconfig courier-imap on

5.sasl认证 安装src.rpm

       rpm -ivh cyrus-sasl-2.1.23-13.el6.src.rpm

1)  修改cyrus-sasl.spec文件

2) 构建rpm包
rpmbuild -ba cyrus-sasl.spec //rpm-build需安装此包

3) 卸载原有的cyrus-sasl,安装新cyrus-sasl //一定要构建成功再操作此步骤

for i in $(rpm -qa | grep sasl | awk -F"-2.1.23" '{ print $1 }') ; do rpm -e $i --nodeps >/dev/null ; done       //可以手工操作

4)创建配置文件

    6.   配置postfix

a) 装包

b)修改配置文件-----/虚拟域的定义/sasl认证的启用/maildrop指定

    7.安装maildrop(MDA)

a) rpm -ivh maildrop*.rpm

b)指定邮件投递用户
groupadd -g 1000 vgroup
useradd -g 1000 -u 1000 -s /sbin/nologin -d /dev/null vuser

c) 配置 /etc/postfix/master.cf 文件 ,让postfix可以调用maildrop

    8.启动postfix/couurier-authlib/mysql,测试authlib,maildrop  

    9.Webmail安装

a)修改/etc/httpd/conf/httpd.conf

b)apache配置完后安装extmail和extman

c)启动日志分析工具

d)重启一下服务,测试一下

    10.垃圾邮件过滤

a)yum install spamassassin

cat > /etc/maildroprc << ENDF

to "$HOME/$DEFAULT/.Spam/" 文件或地址需修改

 

项目(6-postfix1, 6-postfix2)  

192.168.0.60 desktop60.example.com

192.168.0.61 desktop61.example.com

60域:postfix.com

61域:post.com

1.装包

装光盘自带的包

yum install gd pam-devel httpd-devel mysql-devel mysql-server php-xml php-pdo openldap-servers pcre-devel apr-devel apr-util-devel perl-DBD-MySQL libtool-ltdl expect php-gd postgresql postgresql-devel libdbi ruby ruby-libs ruby-devel php-common php php-cli xorg-x11-fonts-Type1 febootstrap febootstrap-supermin-helper perl-CGI–y

装光盘以外的包用rpm方式一个个装

gdbm-devel

libmcrypt

libmcrypt-devel

perl-GD        

perl-rrdtool    ////单独装会报错,需要2个包一起装rpm -ivh perl-rrdtool-1.4.7-1.el6.rfx.x86_64.rpm rrdtool-1.4.7-1.el6.rfx.x86_64.rpm    

rrdtool

perl-Unix-Syslog

php-mcrypt

ruby-rrdtool

libtool-ltdl-devel

 

共享目录下有安装包,直接装包(跳过以下src rpm方式)

rpm -ivh perl-File-Tail-0.99.3-1.2.el6.noarch.rpm libmhash-0.9.1-1.dag.x86_64.rpm

 

还有几个包没有现在的rpm包,所以使用src rpm的方式来安装。

rpm -ivh libmhash-0.9.1-1.dag.src.rpm perl-File-Tail-0.99.3-1.2.src.rpm

cd ~/rpmbuild/SPECS/

rpmbuild -ba libmhash-0.9.1-dag.spec       // yum install rpm-build -y

rpmbuild -ba perl-File-Tail.spec

cd ../RPMS/

rpm -ivh noarch/perl-File-Tail-0.99.3-1.2.el6.noarch.rpm x86_64/libmhash-*

 

安装完后我们将http服务和mysql服务启动看看是否安装正确

service mysqld start

service httpd start

 

     2.认证数据库mysql

环境准备好了,接下来我们可以开始安装我们的postfix了,以安装之前,我们先生成

认证需要使用的mysql库。同时不要忘了给你的mysql加个密码。extmail.sql脚本会生成

一个mysql库,而init.sql脚本会初始化此库。

cp extman-1.1.tar.gz /tmp/rpms

tar zxf extman-1.1.tar.gz

cd extman-1.1/docs

mysqladmin -uroot password "uplooking"

mysql -puplooking < extmail.sql

mysql -puplooking < init.sql

 

      3. 安装一个认证用的中间件,courierauthlib,统一由此中间键来访问mysql

要让MTA,MAA来访问mysql,我们可以安装一个认证用的中间件,courierauthlib,

统一由此中间键来访问mysql。

rpm -ivh courier-authlib-mysql-0.65.0.20130314-1.el6.x86_64.rpm courier-authlib-0.65.0.20130314-1.el6.x86_64.rpm

 

安装完后创建并修改其配置文件 ,配置文件中我们需要告诉他认证使用mysql,并且

将连接mysql所需要的一些参数写入配置文件。

cd /etc/authlib/

vi authdaemonrc

修改如下两个选项

authmodulelist="authmysql"

authmodulelistorig="authmysql"

修改authmysqlrc 的配置文件

vi authmysqlrc

MYSQL_SERVER localhost

MYSQL_USERNAME extmail

MYSQL_PASSWORD extmail

MYSQL_SOCKET /var/lib/mysql/mysql.sock

MYSQL_DATABASE extmail

MYSQL_SELECT_CLAUSE SELECT username,password,"",uidnumber,gidnumber,CONCAT('/home/data/domains/',homedir),CONCAT('/home/data/domains/',maildir),quota,name FROM mailbox WHERE username = '$(local_part)@$(domain)'  

[root@desktop60 authlib]# service courier-authlib start

Starting Courier authentication services: authdaemond         //启动成功

chkconfig courier-authlib on

chmod 755 /var/spool/authdaemon

 

     4.接着我们来安装courier-imap 以提供pop3的支持和imap 支持。

rpm -ivh courier-imap-4.12.20130220-1.x86_64.rpm

service courier-imap start

chkconfig courier-imap on

 

     5.sasl认证 安装 src.rpm  

当需要发信认证时,我们会用到sasl包,可惜的是自带的rpm包不支持mysql或者是

authlib,那么我们就卸载原来所有sasl有关的包,自己重新编译安装一个新的。

rpm -ivh cyrus-sasl-2.1.23-13.el6.src.rpm

cd ~/rpmbuild/SPECS/

修改cyrus-sasl.spec文件

vi cyrus-sasl.spec

在234行的地方加入如下语句

--with-authdaemond=/var/spool/authdaemon/socket \

修改完成后执行后续操作

rpmbuild -ba cyrus-sasl.spec              //rpmbulid命令yum install rpm-bulid -y

for i in $(rpm -qa | grep sasl | awk -F"-2.1.23" '{ print $1 }') ; do rpm -e $i --nodeps > /dev/null ; done

生成sasl 的相关配置文件 ,Postfix会调用smtp.conf配置文件,所以你应该手工将此

文件生成,并且在此文件中声名使用authlib来认证。

cat > /usr/lib64/sasl2/smtpd.conf<< ENDF

pwcheck_method:authdaemond

log_level:3

mech_list:PLAIN LOGIN

authdaemond_path:/var/spool/authdaemon/socket

ENDF

 

6. 配置postfix

为了让postfix支持虚拟域,我们在配置文件后面加入虚拟域支持。

message_size_limit = 14680064

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

virtual_mailbox_base = /home/data/domains

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

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

virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf

virtual_transport = maildrop

maildrop_destination_recipient_limit = 1

smtpd_sasl_auth_enable = yes

smtpd_sasl2_auth_enable = yes

smtpd_sasl_security_options = noanonymous

broken_sasl_auth_clients = yes

smtpd_sasl_path = smtpd

smtpd_recipient_restrictions =

permit_mynetworks,

permit_sasl_authenticated,

reject_unauth_destination,

reject_unauth_pipelining,

reject_invalid_hostname

(格式缩进)

为了让postfix可以和extman 联用 所以将extman目录下mysql_virtual开头的配置

文件拷到postfix 目录下

cp /tmp/rpms/extman-1.1/docs/mysql_virtual_* /etc/postfix

 

7.安装maildrop(MDA)

安装maildrop 以扩展邮件投递功能 ,maildrop是一个优秀的MDA,我们让postfix

在投递邮件时使用maildrop。

rpm -ivh maildrop*.rpm

我们并不希望maildrop在投递邮件是以root身份投递,所以建个普通用户。

groupadd -g 1000 vgroup

useradd -g 1000 -u 1000 -s /sbin/nologin -d /dev/null vuser

配置 /etc/postfix/master.cf 文件 ,让postfix可以调用maildrop。

vi /etc/postfix/master.cf

在最后面加入下面内容:

maildrop unix - n n - - pipe

flags=DRhu user=vuser argv=/usr/bin/maildrop -d ${user}@${nexthop} ${recipient} ${user} ${extension} ${nexthop}     

(注意缩进)不然web收发邮件将找不到vuser用户,缩进表示是一行参数?

创建邮件存储目录 并建个测试域

mkdir -p /home/data/domains/extmail.org/postmaster

maildirmake /home/data/domains/extmail.org/postmaster/Maildir

chown -R vuser:vgroup /home/data/domains/

service postfix restart

测试 maildrop

root@localhost ~]# echo "test" | maildrop -V 10 -d [email protected]

maildrop: authlib: groupid=1000

maildrop: authlib: userid=1000

maildrop: authlib: [email protected],

home=/home/data/domains/extmail.org/postmaster,

mail=/home/data/domains/extmail.org/postmaster/Maildir/

maildrop: Changing to /home/data/domains/extmail.org/postmaster

Message start at 0 bytes, envelope [email protected]

maildrop: Attempting .mailfilter

maildrop: Delivery complete.

出现上以信息说明 authlib,maildrop 工作正常(如果报错,查main.cf select语句是否正确 | 查日志)

 

     8.Webmail安装

项目中我们还需要通过web方式进行收发邮件,所以需要修改apache 配置

修改/etc/httpd/conf/httpd.conf,因为投递邮件时maildrop 是以 vuser:group用户身

份投递,所以 修改apache所有者,生成extman和extmail所需要的配置信息。

vi /etc/httpd/conf/httpd.conf

User vuser

Group vgroup

 

[root@localhost ~]# cd /etc/httpd/conf.d/

[root@localhost conf.d]# vim extmail.conf

Alias /extman/cgi/ /var/www/extsuite/extman/cgi/

Alias /extman /var/www/extsuite/extman/html/

SetHandler cgi-script

Options +ExecCGI

# config for ExtMail

Alias /extmail/cgi/ /var/www/extsuite/extmail/cgi/

Alias /extmail /var/www/extsuite/extmail/html/

SetHandler cgi-script

Options +ExecCGI

 

apache配置完后安装extmail和extman

mkdir /var/www/extsuite

解压extman和extmail 并cp到apache 目录下

cp -r extmail-1.2 /var/www/extsuite/extmail

cp -r extman-1.1 /var/www/extsuite/extman

 

切换到/var/www/extsuite/extmail 目录下 ,配置extman和extmail。首先生成主配

置文件,并在主配置文件中修改相应选项。

cp webmail.cf.default webmail.cf

 

修改 webmail.cf 下面的选项

SYS_SESS_DIR = /tmp/extmail

SYS_MAILDIR_BASE = /home/data/domains

SYS_MYSQL_USER = extmail

SYS_MYSQL_PASS = extmail

 

切换到/var/www/extsuite/extman 目录下

cp webman.cf.default webman.cf

修改 webman.cf 下面的选项为邮件目录:

SYS_MAILDIR_BASE = /home/data/domains

修改完成之后创建相应session目录

mkdir /tmp/{extman,extmail}

chown vuser:vgroup /tmp/ext*

 

另外extman为我们提供了一个友好的图形化日志工具,可以配置并启用这个后台日志

分析工具。

cd /var/www/extsuite/extman/addon/

cp -r mailgraph_ext /usr/local/

启动日志分析工具

/usr/local/mailgraph_ext/mailgraph-init start

echo '/usr/local/mailgraph_ext/mailgraph-init start' >> /etc/rc.local

重启一下服务,测试一下

service httpd restart

service postfix restart

chown -R vuser:vgroup /var/lib/php/session/

打开 浏 览 器,输 入 http://your_domain_name/extman

用户 为 :[email protected] 密码 为 :extmail*123*     //打开网页报权限问题, setenforce=0

建个域 建个用户。

登录http://192.168.0.60/extmail

用该用户登录, 发个信 测试(postfix.com DNS需建立),2台机器互发信件,还需反向解析。

打开 浏 览 器,输 入 http://your_ip_address/extmail

 

 

9. 垃圾邮件过滤  

最后我们加入垃圾邮件的过滤,安装spamassassin,并生成/etc/maildroprc文件,以

便让maildrop在投递过程中调用spamassassin。

yum install spamassassin

vim /etc/maildroprc

if ( $SIZE < 26144 )

{

  exception {

    xfilter "/usr/bin/spamassassin --prefspath=$HOME/$DEFAULT/.spamassassin/user_prefs"

  }

}

 

if (/^X-Spam-Flag: *YES/)

{

  exception {

    to "$HOME/$DEFAULT/.Spam/"

  }

}

else

{

  exception {

   to "$HOME/$DEFAULT"

  }

}

spamassassin的过滤模板在/etc/mail/spamassassin/local.cf,修改为:

required_score 5.0

rewrite_header Subject ********SPAM********

report_safe 1

use_bayes 1

skip_rbl_checks 0

ok_languages zh en

ok_locales en ko

score HEAD_ILLEGAL_CHARS 0

score SUBJ_ILLEGAL_CHARS 0

score DATE_IN_PAST_03_06 0

score UPPERCASE_25_50 0

score UPPERCASE_50_75 0

score UPPERCASE_75_100 0

score X_MSMAIL_PRIORITY_HIGH 0

score X_PRIORITY_HIGH 0

score TO_TXT100

score RATWARE_HASH_2 100

score RATWARE_HASH_2_V2 100

score BAYES_99 0.1

score BAYES_80 0.1

score BAYES_60 0.1

score FROM_ILLEGAL_CHARS 0.1

score MIME_BASE64_TEXT 0.1

score NO_RDNS_DOTCOM_HELO 0.1

scoreCHINA_HEADER 0.1

score NO_REAL_NAME 0.2

score HTML_MESSAGE 0.2

score MIME_HTML_ONLY 0.2

score MIME_HTML_ONLY_MULTI 0.2

score FORGED_MUA_OUTLOOK 0.2

score FORGED_HOTMAIL_RCVD 0.2

score FORGED_OUTLOOK_TAGS0.2

score MAILTO_TO_SPAM_ADDR 0.2

## 黑白名单

whitelist_from *@test.com

blacklist_from

## 使用中国反垃圾邮件联盟的CBL/CDL

## URL: http://www.anti-spam.org.cn/

header RCVD_IN_CBLeval:check_rbl('cbl', 'cbl.anti-spam.org.cn.')

# describe RCVD_IN_CBLReceived via a relay in cbl.anti-spam.org.cn

tflags RCVD_IN_CBLnet

header RCVD_IN_CDL eval:check_rbl('cdl-notfirsthop', 'cdl.anti-spam.org.cn.')

 

describe RCVD_IN_CDL CDL: dialup sender did non-local SMTP

tflags RCVD_IN_CDL net

score RCVD_IN_CBL4.0

score RCVD_IN_CDL 3.0

将spamassassin设定的为开机运行

chkconfig spamassassin on

# 使用CCERT 中文垃圾邮件过滤规则集Chinese_rules.cf //以下实验未操作

wget -N -P /usr/share/spamassassin http://www.ccert.edu.cn/spam/sa/Chinese_rules.cf     //需网上下载

service spamassassin start

定期自动更新中文反垃圾邮件规则

crontab –e

# 加入

0 0 1 * * wget -N -P /usr/share/spamassassin http://www.ccert.edu.cn/spam/sa/Chinese_rules.cf ; /etc/init.d/spamassassin restart    //需要联外网,没验证过格式是否正确

 

建立SpamAssassin的学习系统

sa-learn --sync -D -p user_prefs

查看自学习的数据信息

sa-learn --dump all

# 查看调试信息

spamassassin --lint –D

再次打开浏览器测试。

分离mysql服务器

如果你的mysql不在本地,在一台单独的服务器之上,那你需要修改如下几个配置文件中的mysql主机地址

/etc/authlib/authmysqlrc

/etc/postfix/mysql_virtual_domains_maps.cf

/etc/postfix/mysql_virtual_domains_maps.cf

/etc/postfix/mysql_virtual_mailbox_maps.cf

/etc/postfix/mysql_virtual_limit_maps.cf

/var/www/extsuite/extmail/webmail.cf

/var/www/extsuite/extman/webman.cf

不要忘了mysql的授权,有关extmail用户的权限。