1.    版本历史

Revision    Author(s)    Date    Summary of activity
1.0    罗辉    2007-07-26    创建
1.1    罗辉    2007-8-27    增加9.15(收信超时问题)
1.2    罗辉    2007-9-4    增加二级域名访问WEBMAIL

2.    参考文档

[1] QmailToaster Home
    http://www.qmailtoaster.com
   
3.    前言

本文主要记录了公司E-Mail服务器的安装和配置。公司E-Mail建立在CentOS linux 5平台上,使用Qmail + vpopmail + qmailadmin + squirrelmail + mysql + ezmlm +clamav+ spamassassin建立一个完整的企业邮局平台。已有的功能包括虚拟域,虚拟用户,WEBMAIL,WEB邮局管理,邮件列表,在线时实扫毒,反垃圾邮件等。
Qmail安装有很多种方法,大部份方法都是下载各种源代码,进行编译安装,再进行各个配置。我们采用做好的RPM源码包,编译成RPM安装包进行安装。这种方法的好处再于安装简单,维护方便,功能也齐全。

4.    硬件系统环境
邮件服务器为Dell PowerEdge 2950,CPU为Intel xeon 5150 X2,内存为8G,146G 15000转的SAS硬盘。

5.    软件系统环境
服务器所装操作系统都为Centos linux 5,可在http://www.centos.org 下载。
所用apache及Mysql为操作系统自带版本,也可以在http://www.apache.org 及http://www.mysql.com下载源代码编译安装。
邮件系统用到的所有软件包都可从http://www.qmailtoaster.com下载。

6.    软件包下载
Qmailtoaster可以通过一个脚本下载邮件系统所需的所有安装包,我们先下载这个脚本,再通过执行脚本下载所需的软件包:
#wget http://www.qmailtoaster.com/info/current-download-script.sh
#chmod 755 current-download-script.sh
#./current-download-script.sh
除了上述软件包之外,还需下载一些脚本,用于安装邮件系统:
#wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-deps.sh
#wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-djbdns-localcache-install.sh
#wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-install-script.sh
#wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-perl.sh
#wget http://www.qmailtoaster.com/centos/cnt5064/cnt5064-svcs.sh
#wget http://www.qmailtoaster.com/centos/cnt5064/mysql-setup.sh
#wget http://www.qmailtoaster.com/centos/cnt5064/very-quick-install.txt

7.    邮件系统安装

以下主备两台服务器都需要安装。
very-quick-install.txt文件说明了安装qmailtoaster的大致步骤,我们在安装时可根据自己的需求,做一些调整。下面介绍安装步骤:

7.1.    安装前期准备工作

# ./cnt5064-deps.sh
运行cnt5064-deps.sh,通过yum安装一些邮件系统所需要的软件包。
# ./cnt5064-perl.sh
运行cnt5064-perl.sh,安装一些perl的库。
# vi mysql-setup.sh
将:
MYSQLPW=YOUR_MYSQL_ROOT_PASSWORD
改成:
MYSQLPW=123456
123456为mysql的root用户密码。
再运行脚本,配置mysql服务:
# ./mysql-setup.sh
配置iptables,开放qmail系统需用到的端口:
# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp –icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp –dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp –dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp –dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
#Accept ssh port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
#Accept smtp port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT
#Accept http port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
#Accept pop3 port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 110 -j ACCEPT
#Accept imap port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 143 -j ACCEPT
#Accept smtps port
#-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 456 -j ACCEPT
#Accept msp port
#-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 587 -j ACCEPT
#Accept SpamAssassin port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 783 -j ACCEPT
#Accept imaps port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 993 -j ACCEPT
#Accept pop3s port
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 995 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
COMMIT
重启服务:
# service iptables restart
建立一个头文件的链接,没有这个等下编译的时候会通不过:
# ln -s /usr/include/et/com_err.h /usr/include/com_err.h

7.2.    安装邮件系统

# ./ cnt5064-install-script.sh
cnt5064-install-script.sh是安装邮件系统的脚本,这个脚本让帮助我们自动编译和安装相关软件包。在每安装一个包时,它都会询问用户Shall we continue? (yes, skip, quit) [y]/s/q:按y安装,s跳过,q退出。
下列软件包选y,这些包我们不需要手动去改什么配置:
daemontools-toaster
ucspi-tcp-toaster
安装了上两个包后,选q退出。对于下面的vpopmail-toaster,我们需要改一些编译的参数:
先安装原码包:
# rpm -ivh vpopmail-toaster-5.4.17-1.3.4.src.rpm
更改编译配置:
# vi /usr/src/redhat/SPECS/vpopmail-toaster.spec
找到:
       –enable-auth-module=mysql
       –enable-log-name=vpopmail
       –disable-mysql-limits
       –enable-valias
       –disable-many-domains
mv %{buildroot}%{vdir}/etc/vpopmail.mysql %{buildroot}%{vdir}/etc/vpopmail.mysql.dist
echo "localhost|0|vpopmail|SsEeCcRrEeTt|vpopmail" > %{buildroot}%{vdir}/etc/vpopmail.mysql
%attr(0644,vpopmail,vchkpw) %config(noreplace) %{vdir}/etc/vpopmail.mysql
%attr(0644,vpopmail,vchkpw) %{vdir}/etc/vpopmail.mysql.dist
更改为:
        –enable-auth-module=cdb
        –enable-log-name=vpopmail
#       –disable-mysql-limits
#       –enable-valias
#       –disable-many-domains
#mv %{buildroot}%{vdir}/etc/vpopmail.mysql %{buildroot}%{vdir}/etc/vpopmail.mysql.dist
#echo "localhost|0|vpopmail|SsEeCcRrEeTt|vpopmail" > %{buildroot}%{vdir}/etc/vpopmail.mysql
#%attr(0644,vpopmail,vchkpw) %config(noreplace) %{vdir}/etc/vpopmail.mysql
#%attr(0644,vpopmail,vchkpw) %{vdir}/etc/vpopmail.mysql.dist
按新配置编译:
# rpmbuild -bb –with cnt5064 /usr/src/redhat/SPECS/vpopmail-toaster.spec
安装编译好的包:
# rpm -ivh /usr/src/redhat/RPMS/x86_64/vpopmail-toaster-5.4.17-1.3.4.x86_64.rpm
/home/vpopmail在/分区,以后所有的邮件都会放在这个目录,/分区空间有限,我们将其移到/web下:
# cp -rfp /home/vpopmail /web
# rm –rf /home/vpopmail
# ln -s /web/vpopmail /home/vpopmail
继续安装其它包:
# ./ cnt5064-install-script.sh
下列软件包选y,这些包我们不需要手动去改什么配置,其它包选s跳过:
libdomainkeys-toaster
libsrs2-toaster
qmail-toaster
courier-authlib-toaster
courier-imap-toaster
autorespond-toaster
control-panel-toaster
ezmlm-toaster
qmailadmin-toaster
qmailmrtg-toaster
maildrop-toaster
isoqlog-toaster
squirrelmail-toaster
spamassassin-toaster
clamav-toaster
ripmime-toaster
simscan-toaster
如果中间没有什么错误的话,到此安装就完成了。

8.    配置邮件系统

8.1.    增加虚拟邮件域

# /home/vpopmail/bin/vadddomain testqmail.com 123456

用上面的命令就可增加一个虚拟邮件域,域名为testqmail.com,密码为123456。这个命令会产生一个 postmaster@testqmail.com的邮件用户,postmaster用户是testqmail.com的管理用户。通过其可以在 qmailadmin内增加或删除邮件帐号。

8.2.    更改default域名

当初安装操作系统时,这台服务器为tomcat服务器,域名设为tomcat1.testqmail.com。邮件系统的默认域名也就相应成了 tomcat1.testqmail.com,我们需要将其改为testqmail.com,这才是邮件系统的真正域名。
# cd /var/qmail/supervise
# vi imap4/run
# vi imap4-ssl/run
# vi pop3/run
# vi pop3-ssl/run
将上面这些文件内的:
HOSTNAME=`hostname –fqdn`
改成:
HOSTNAME=`cat /var/qmail/control/defaultdomain`
# vi smtp/run
# vi submission/run
将上面这些文件内的:
HOSTNAME=`hostname`
改成:
HOSTNAME=`cat /var/qmail/control/defaultdomain`

8.3.    配置squirrelmail

Squirrelmail是一个WEBMAIL软件,安装后需要配置一下才能正常使用:
配置squirrelmail:
# cd /usr/share/squirrelmail/config/
# ./conf.pl
#选择 “2. Server Settings”=>“A. Update IMAP Settings”=>“8. Server software”改成“courier”;回到主菜单,选择“10. Languages”,将“ Default Language”改成“zh_CN”,“Default Charset”改成“GB2312”。保存退出。

安装多语言:
# wget http://superb-west.dl.sourceforge.net/sourceforge/squirrelmail/all_locales-1.4.9-20070106.tar.gz
# cd /usr/share/squirrelmail
# tar -xvzf all_locales-1.4.9-20070106.tar.gz

8.4.    配置开机启动

qmail需要apache和mysql服务,我们需要同时配置这三个服务开机启动,qmail运行才正常:
# chkconfig –level 2345 httpd on
# chkconfig –level 2345 qmail on(做集群时不用设,heartbeat会启动它)
重启服务器后,qmail就可以正常运行了。

9.    增加二级域名访问WebMail

安装完后,用http://ip/qmailadmin和http://ip/webmail可访问管理页面和webmail,但是不方便,为此,建立两个二级域名:qmailadmin.testqmail.com和webmail.testqmail.com,方便用户记忆。为此,需做以下更改:
#vi /etc/httpd/conf/httpd.conf
将:
#Include /etc/httpd/conf/toaster.conf
#Include /etc/httpd/conf/squirrelmail.conf
更改为:
#Include /etc/httpd/conf/toaster.conf
#Include /etc/httpd/conf/squirrelmail.conf
NameVirtualHost *:80

<VirtualHost *:80>
        DocumentRoot /usr/share/squirrelmail
        ServerName webmail.testqmail.com
        <Directory /usr/share/squirrelmail>
           Options None
           Order allow,deny
           allow from all
        </Directory>
        ErrorLog logs/webmail.testqmail.com.error_log
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot /usr/share/qmailadmin/
        ServerName qmailadmin.testqmail.com
        ScriptAlias /mail/ /usr/share/toaster/cgi-bin/
        Alias /admin-toaster /usr/share/toaster/htdocs/admin/
        Alias /stats-toaster/ /usr/share/toaster/htdocs/mrtg/
        Alias /qlogs-toaster/ /usr/share/toaster/htdocs/isoqlog/
        Alias /images-toaster/ /usr/share/toaster/htdocs/images/
        Alias /scripts/ /usr/share/toaster/htdocs/scripts/
        Alias /qmailadmin /usr/share/qmailadmin/
        <Directory /usr/share/qmailadmin>
            AddHandler cgi-script .cgi
            AddHandler cgi-script qmailadmin
            DirectoryIndex index.cgi qmailadmin index.html
            Options +Indexes FollowSymLinks +ExecCGI
            Order allow,deny
            Allow from all
        </Directory>
        <Directory /usr/share/toaster/htdocs>
            Options -Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            Allow from all
        </Directory>
        <Directory /usr/share/toaster/htdocs/admin>
            AuthType Basic
            AuthName "Qmail Toaster v. 1.3 Admin"
            AuthUserFile /usr/share/toaster/include/admin.htpasswd
            require valid-user
        </Directory>
        <Directory /usr/share/toaster/htdocs/mrtg>
            AllowOverride All
            Order allow,deny
            Allow from all
            AuthType Basic
            AuthName "Qmail Toaster v. 1.3 Admin"
            AuthUserFile /usr/share/toaster/include/admin.htpasswd
            require valid-user
        </Directory>
        <Directory /usr/share/toaster/htdocs/isoqlog>
            AllowOverride All
            Order allow,deny
            Allow from all
            AuthType Basic
            AuthName "Qmail Toaster v. 1.3 Admin"
            AuthUserFile /usr/share/toaster/include/admin.htpasswd
            require valid-user
        </Directory>
        <Directory /usr/share/toaster/cgi-bin/vqadmin>
            AllowOverride All
            Options ExecCGI
            Order allow,deny
            Allow from all
            AuthType Basic
            AuthName "Qmail Toaster v. 1.3 Admin"
            AuthUserFile /usr/share/toaster/include/admin.htpasswd
            require valid-user
        </Directory>
        <Directory /usr/share/toaster/cgi-bin>
            AllowOverride All
            Options ExecCGI
            Order allow,deny
            Allow from all
        </Directory>
        ErrorLog logs/qmailadmin.testqmail.com.error_log
</VirtualHost>

在重启apache服务:
# service httpd restart
便可用http://webmail.testqmail.com和http://qmailadmin.testqmail.com访问了。

10.    NFS配置

10.1.    配置Nfs服务

NFS服务器IP:192.168.1.204
#vi /etc/exports
/home/vpopmail 192.168.1.*(rw,async,anonuid=89,anongid=89)
#vi /etc/passwd
vpopmail:x:89:89:Vpopmail User:/home/vpopmail:/sbin/nologin
#vi /etc/group
vchkpw:x:89:
#service portmap start
#service nfs start

10.2.    挂载nfs

#cp –rfp /home/vpopmail /home/vpopmailbak
#rm –rf /home/vpopmail/*
#mount –t nfs 192.168.1.204:/home/vpopmail /home/vpopmail
#cp –rfp /home/vpopmailbak/* /homev/vpopmail/

在qmail服务器上挂载

11.    heartbeat安装及配置

11.1.    heartbeat安装

#yum install heartbeat*

11.2.    heartbeat配置

#cp /usr/share/doc/heartbeat-2.1.*/ha.cf /etc/ha.d/
#cp /usr/share/doc/heartbeat-2.1.*/authkeys /etc/ha.d/
#cp /usr/share/doc/heartbeat-2.1.*/haresources /etc/ha.d/
#vi /etc/hosts
192.168.1.6      qmail6
192.168.1.5      qmail5
#vi /etc/sysconfig/network
HOSTNAME=qmail5
#vi /etc/ha.d/authkeys
auth 1
1 crc
#chmod 600 /etc/ha.d/authkeys
#vi /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
keepalive 2
说明:心跳频率,自己设定。1:表示1秒;200ms:表示200毫秒
deadtime 30
说明:节点死亡时间阀值,就是从节点在过了30后还没有收到心跳就认为主节点死亡,自己设定
udpport 694
说明:心跳信息传递的udp端口,自己设定
#bcast eth0
#说明:采用eth0的udp广播用来发送心跳信息,建议在副节点不只一台时使用
ucast eth0 192.168.0.6
#说明:采用网卡eth0的udp单播来通知心跳,ip应为对方IP(未验证)
#mcast eth0 225.0.0.1 694 1 0
#说明:采用udp多播播来通知心跳,建议在副节点不只一台时使用
#注:广播,单播,多播,以上三种任选其一即可
auto_failback on
说明:主节点重启成功后,资源是自动拿回到主节点还是等到副节点down调后拿回资源
node qmail6
node qmail5
说明:节点名称,与uname –n保持一致。

ping 192.168.1.6

respawn 指令在运行时指定某个程序的运行和监控。如果此程序退出时的退出码不是 100,程序将自动重启。
respawn root /usr/lib/heartbeat/ipfail
apiauth ipfail gid=root uid=root

apiauth         mgmtd   uid=root
respawn         root    /usr/lib/heartbeat/mgmtd –v
上面两行是配置图型界面的管理服务hb_gui,可要可不要。

crm 指令指定了 Heartbeat 应运行 1.x-style 集群管理器或 2.x-style 集群管理器,后者支持 2 个以上的节点。
crm on

#vi /etc/ha.d/haresources
qmail5 IPaddr::192.168.1.7 Filesystem::192.168.1.205:/home/vpopmail::/home/vpopmail::nfs::rw qmail

生成/var/lib/heartbeat/crm/cib.xml
#/usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources
设置图型界面hb_gui的管理密码
#passwd hacluster
#vi /etc/ha.d/haresources
qmail5 IPaddr::192.168.1.7 Filesystem::192.168.1.205:/home/vpopmail::/home/vpopmail::nfs::rw qmail

qmail5为主服务器,主备服务器在此设置。两台机器haresources都设成上面这样。

11.3.    开机启动

#chkconfig –level 2345 heartbeat on

12.    Q&A

12.1.    如何增加及删除用户

用户管理有两种方式,一是用WEB管理:http://qmailadmin.testqmail.com。二是用vadduser和vdeluser添加新用户和删除用户

12.2.    如何使用webmail

用浏览器打开:http://webmail.testqmail.com。输入带域名和用户名(如:cary.luo@testqmail.com)和密码登陆便可。

12.3.    使用客户端收发邮件的相关参数是什么

POP3 Server:pop.testqmail.com
SMTP Server:smtp.testqmail.com
IMAP Server:imap.testqmail.com
邮件系统同时支持pop3,pop3s,imap,imaps协议。可选其中任何一种协议收邮件,建议使用pop3s和imaps,它们的安全性更高。
发送邮件服务器需要用户认证。
设置用户名时请用全名,如:cary.luo@testqmail.com

12.4.    邮箱警告邮件能设为中文吗

可以。
设置邮箱容量达到90%的警告信息
# vi /home/vpopmail/domains/.quotawarn.msg

From: 邮箱管理员
Reply-To: postmaster@testqmail.com
To: 邮箱用户
Subject: 邮箱空间警告
Mime-Version: 1.0
Content-Type: text/html; charset=gb2312
Content-Transfer-Encoding: base64

您的邮箱空间已经达到90%.如果想继续使用,请删除一些信件.

如果需要帮助,请联系邮箱管理员:

Email : postmaster@testqmail.com

设置邮箱已满的警告信息

# echo "邮件被拒绝,用户的邮箱空间已满." > /home/vpopmail/domains/.over-quota.msg

12.5.    如何清除邮件队列

12.5.1.    处理队列中的邮件:

如想在队列中的邮件马上传递,可以
# kill -HUP qmail-send

要删除队列中的邮件
# service qmail stop
# mv /var/qmail/queue/lock /var/qmail/
# find /var/qmail/queue/ -type f -exec rm {} ;
# mv /var/qmail/lock /var/qmail/queue/
# service qmail start
队列中的邮件包含在以下目录中 /var/qmail/queue/{info,mess,remote,local}/hash/#number

12.5.2.    在邮件队列中快速删除从一个地方发过来但又不存在的邮件

假设bad.jite.com是这个域。可以键入以下命令
# echo # > ~alias/.qmail-baddomain-default
# echo bad.jite.com:alias-baddomain>> /var/qmail/control/virtualdomains
# echo bad.jite.com:127.0.0.1 >> /var/qmail/control/smtproutes
然后运行/var/qmail/bin/qmail-tcpok,给qmail-send 一个HUP信号

12.5.3.    删除队列中的大量广告信息

# service qmail stop
# cd /var/qmail/queue/mess
# find /var/qmail/queue/mess -type f -exec grep "^Subject:dss" {} ; -print -exec rm {} ;
运行queue-fix清除相关文件
# service qmail start

12.6.    我怎么更新邮件系统内的杀毒软件

邮件系统的杀毒模块用的是clamav,本身会有一个进程freshclam自动升级病毒码。有时系统会有如下错误在/var/log/clamav /freshclam.log内:
freshclam daemon 0.90.1 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
ClamAV update process started at Mon Jul 16 10:06:06 2007
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.90.1 Recommended version: 0.91
DON’T PANIC! Read http://www.clamav.net/support/faq
这是因为目前系统上的版本低于最新的版本造成的,可通过升级clamav解决:
# wget http://nchc.dl.sourceforge.net/sourceforge/clamav/clamav-0.91.1.tar.gz
# tar –xvzf clamav-0.91.1.tar.gz
# cd clamav-0.91.1
按自己的架构生成Makefile,服务器上是x86_64:
#i386
# ./configure –build=i686-redhat-linux-gnu –host=i686-redhat-linux-gnu –target=i386-redhat-linux-gnu –program-prefix= –prefix=/usr –exec-prefix=/usr –bindir=/usr/bin –sbindir=/usr/sbin –sysconfdir=/etc –datadir=/usr/share –includedir=/usr/include –libdir=/usr/lib –libexecdir=/usr/libexec –localstatedir=/var –sharedstatedir=/usr/com –mandir=/usr/share/man –infodir=/usr/share/info –enable-experimental /usr/bin/make
#x86_64
# ./configure –build=x86_64-redhat-linux-gnu –host=x86_64-redhat-linux-gnu –target=x86_64-redhat-linux-gnu –program-prefix= –prefix=/usr –exec-prefix=/usr –bindir=/usr/bin –sbindir=/usr/sbin –sysconfdir=/etc –datadir=/usr/share –includedir=/usr/include –libdir=/usr/lib64 –libexecdir=/usr/libexec –localstatedir=/var –sharedstatedir=/usr/com –mandir=/usr/share/man –infodir=/usr/share/info –enable-experimental /usr/bin/make
# make
# make install

12.7.    spamd日志内出错

smamd有下面的错误:
@40000000469ad2e71c1bcef4 [18428] error: Can’t locate Crypt/OpenSSL/Bignum.pm in @INC (@INC contains: ../lib /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.7/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.6/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.7/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.6/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8) at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Crypt/OpenSSL/RSA.pm line 17.

原因是少了一个prel库,通过下面的安装解决:
# perl -MCPAN -e shell
cpan> install Crypt::OpenSSL::Bignum
cpan> quit

12.8.    收发邮件时出错

收发邮件时出错如下错误:
登录邮件服务器时出错。“密码”被拒绝。 帐户: ‘192.168.1.223’, 服务器: ‘192.168.1.223’, 协议: POP3, 服务器响应: ‘/home/vpopmail/bin/vchkpw: error while loading shared libraries: libgssapi_krb5.so.2: failed to map segment from shared object: Cannot allocate memory’, 端口: 110, 安全(SSL): 否, 服务器错误: 0x800CCC90, 错误号: 0x800CCC92

原因为相关进程给的内存太少,需要增加相应的内存:
vi /var/qmail/supervise/pop3/run
vi /var/qmail/supervise/pop3-ssl/run
vi /var/qmail/supervise/imap4/run
vi /var/qmail/supervise/imap4-ssl/run
将softlimit -m 24000000改为softlimit -m 40000000 (24M内存改为40M)

12.9.    怎么按时间看qmail日志

qmail日志中的时间转换(如:@400000003f1f409e2256080c 转换成2003-07-24 10:12:36.576063500 ):
# tai64nlocal < /var/log/qmail/smtp/current
可将日志中的时间戳转化为标准格式,而其他信息不变

12.10.    怎么限制邮件的大小

在/var/qmail/control/databytes 文件中设置附件的大小,可以实现对qmail邮件大小的限制,一般安装完成后,这个文件是没有的,可以自己创建,smtp方式是以qmail的 databytes作限制的,如要创建databytes并设置邮件最大为4m:
# echo 4000000 >/var/qmail/control/databyte

12.11.    如何禁止垃圾帐号发信过来

# vi /var/qmail/control/badmailfrom
这个控制文件实现拒收邮件功能的,每一个地址要单独一行。而且,不用重起qmail就能生效。例如:
peng@96633.net —-限制一个特定的用户
@sina.com —-限制整个域中的邮件

12.12.    如何限制单域和用户的默认邮箱数量及容量

# vi /home/vpopmail/etc/vlimits.default
#限制单域的容量和总邮件数
#这里设的是单域最大容量90G,最大邮件数5000000封
quota                   90000
maxmsgcount             5000000

# 限制新用户默认的容量和邮件数
# 这里设的是200M和10000封
default_quota           209715200
default_maxmsgcount     10000

如果想修改个别的用户容量可通过http://ip/qmailadmin管理.

12.13.    怎么配置SMTP发送的最大重试时间

# vi /var/qmail/control/queuelifetime

新增上面这个文件,这个文件用来指定一个邮件在队列中的最大存活时间,默认是604800秒,当一个邮件达到这个时间线后,qmail将最后一次尝试发送这封邮件,如果依然失败,会将其从队列中删除。我们可将其改成3600。

12.14.    如何查询qmail的送队列

# /var/qmail/bin/qmail-qstat
messages in queue: 63         //队列内有63份邮件
messages in queue but not yet preprocessed: 0
# /var/qmail/bin/qmail-qread //查看队列内的外发邮件

12.15.    用outlook收信老超时连不上

这个问题和域名反解有关,每当去服务器收信时,服务器都要对客户IP进行解析,当DNS不好或网络慢时,就会发生超时现象了。
# vi /var/qmail/supervise/pop3/run
#!/bin/sh

PASSPROG="/home/vpopmail/bin/vchkpw"
#HOSTNAME=`hostname –fqdn`
HOSTNAME=`cat /var/qmail/control/defaultdomain`

exec /usr/bin/softlimit -m 40000000
/usr/bin/tcpserver -v -R -c 200 0 110
/var/qmail/bin/qmail-popup $HOSTNAME
$PASSPROG /var/qmail/bin/qmail-pop3d Maildir 2>&1
改成:
#!/bin/sh

PASSPROG="/home/vpopmail/bin/vchkpw"
#HOSTNAME=`hostname –fqdn`
HOSTNAME=`cat /var/qmail/control/defaultdomain`

exec /usr/bin/softlimit -m 40000000
/usr/bin/tcpserver -v -R -H -c 200 -l 0 0 110
/var/qmail/bin/qmail-popup $HOSTNAME
$PASSPROG /var/qmail/bin/qmail-pop3d Maildir 2>&1
再重启Qmail。-H为不对远程机器做反解,-l 0 为不对本机做反解

13.    结论

邮件服务器还有些小问题需要以后解决:
邮件杀毒模块不能对RAR的压缩文件进行解压杀毒。目前也没有找到免费的杀毒模块有此功能。
目前的邮件系统使用的反垃圾软件为spamassassin,效果并不是很理想。

#!/bin/bash
#本脚本用于升级qmail时导入旧的qmail系统的用户及邮件
#auther:阿辉
#date:2009.06.12

adduser="/home/vpopmail/bin/vadduser"
vuserinfo="/home/vpopmail/bin/vuserinfo"
quota="100MB"
#vpopmail.csv为旧的vpopmail数据库表的导出文件
vpopmail="/root/vpopmail.csv"

sed ‘/^s*$/d’ $vpopmail | sed ‘/^s*#.*/d’ | while read list
do
    echo
    echo
    username=`echo $list | cut -d ‘;’ -f 2 | tr -d ‘"’`
    domain=`echo $list | cut -d ‘;’ -f 3 | tr -d ‘"’`
    encrypt=`echo $list | cut -d ‘;’ -f 4 `
    password=`echo $list | cut -d ‘;’ -f 10 | tr -d ‘"’`
    comment=`echo $list | cut -d ‘;’ -f 7 `
    dir="/opt"`echo $list | cut -d ‘;’ -f 8 | tr -d ‘"’`
    email=$username"@"$domain

    #建用户
    echo $adduser -q $quota -c $comment $email $password
    $adduser -q $quota $email $password
   
    #更新用户信息及加密密码
    echo "update vpopmail.fortelchina_com set pw_passwd = $encrypt,pw_gecos = $comment where pw_name = ‘$username’"
    echo "update vpopmail.fortelchina_com set pw_passwd = $encrypt,pw_gecos = $comment where pw_name = ‘$username’" | mysql -uroot -p123456

    #导入用户邮件
    pw_dir=`echo "select pw_dir from vpopmail.fortelchina_com where pw_name = ‘$username’" | mysql -uroot -p123456 | sed ‘1d’`
    echo /bin/cp -rf $dir/Maildir $pw_dir
    /bin/cp -rf $dir/Maildir $pw_dir
   
    #修改邮件的权限
    echo chown -R vpopmail.vchkpw $pw_dir
    chown -R vpopmail.vchkpw $pw_dir

    #重新生成maildirsize文件
    echo rm -rf $pw_dir/Maildir/maildirsize
    rm -rf $pw_dir/Maildir/maildirsize
    echo $vuserinfo $email
    $vuserinfo $email
   
done

simscan是配合qmail进行扫毒和垃圾邮件处理的接口程序,在扫毒和垃圾邮件处理之前,需要对经过编码的邮件解码,分离出附件等再进行扫描,这个事情就是由ripmime解决的。

而在simscan 1.4.0调用ripmime时,有个小问题.

先看代码,代码在simscan.c内的do_ripmime():

int run_ripmime()
{
int pid;
int rmstat;

/* fork ripmime */
switch(pid = vfork()) {
    case -1:
      return(-1);
    case 0:
     close(1);
     close(2);
     execl(RIPMIME, "ripmime", "–disable-qmail-bounce",
           "-i", message_name, "-d", NULL );
     _exit(-1);
}

   /* wait for ripmime to finish */
if (waitpid(pid,&rmstat, 0) == -1) {
     return(-1);
}

/* check if the child died on a signal */
if ( WIFSIGNALED(rmstat) ) {
     return(-1);
}

/* if it exited okay, return the status */
if ( WIFEXITED(rmstat) ) {
    return(WEXITSTATUS(rmstat));
}

/* should not reach here */
return(-1);
}

上面代码内的execl(RIPMIME, "ripmime", "–disable-qmail-bounce", "-i", message_name, "-d", NULL );就是调用ripmime的地方,这名相当于:
/usr/bin/ripmime –disable-qmail-bounce -i message_name -d

真正跑的时候会发现其实是错的,-d后面还需要加一个目录。
[root@fortelchina ~]# /usr/bin/ripmime –disable-qmail-bounce -i mail.eml -d            
ERROR: insufficient parameters after ‘-d’

调用代码改成:execl(RIPMIME, "ripmime", "–disable-qmail-bounce", "-i", message_name, "-d", workdir, NULL );

就好了。

完整函数如下,我加了些debug信息,以方便邮件出问题时追踪:

int run_ripmime()
{
int pid;
int rmstat;

if ( DebugFlag > 0 ) {
    fprintf(stderr, "simscan: calling ripmime.n");
}

/* fork ripmime */
switch(pid = vfork()) {
    case -1:
      if ( DebugFlag > 0 ) {
        fprintf(stderr, "simscan:vfork ripmime error.n");
      }
      return(-1);
    case 0:
     close(1);
     close(2);
     execl(RIPMIME, "ripmime", "–disable-qmail-bounce",
           "-i", message_name, "-d", workdir, NULL );
     _exit(-1);
}

   /* wait for ripmime to finish */
if (waitpid(pid,&rmstat, 0) == -1) {
     if ( DebugFlag > 0 ) {
       fprintf(stderr, "simscan: wait for ripmime to finish –error!n");
     }
     return(-1);
}

/* check if the child died on a signal */
if ( WIFSIGNALED(rmstat) ) {
     if ( DebugFlag > 0 ) {
       fprintf(stderr, "simscan: check if the child died on a signal,rmstat:%d,–error!n", WIFSIGNALED(rmstat));
     }
     return(-1);
}

/* if it exited okay, return the status */
if ( WIFEXITED(rmstat) ) {
     if ( DebugFlag > 0 ) {
       fprintf(stderr, "simscan: ripmime is done,return to simscan.n");
     }
    return(WEXITSTATUS(rmstat));
}

if ( DebugFlag > 0 ) {
     fprintf(stderr, "simscan: ripmime return -1!n");
}

/* should not reach here */
return(-1);
}

toaster包的更新方法:

先安装源码包:
rpm -ivh simscan-toaster-1.4.0-1.3.0.src.rpm

cd /usr/src/redhat/SOURCES/

tar -xvzf simscan-1.4.0.tar.gz

cd simscan-1.4.0

按上面的方法更改simscan.c文件。保存。

cd ..

rm simscan-1.4.0.tar.gz

tar -czf simscan-1.4.0.tar.gz simscan

编译:

rpmbuild -ba ../SPECS/simscan-toaster.spec

安装编译好的程序:

rpm -ivh /usr/src/redhat/RPMS/i386/simscan-toaster-1.4.0-1.3.0.i386.rpm

SPF – Sender Policy Framework

SPF是一个基于DNS的 MX反向解析系统,采用在NDS内加入 SPF Record 的方式,用来指明只有域用户才被允许发送邮件。其目的是为了防止域用户的邮件地址被spammers伪造。

在Qmail中,SPF有4个配置文件(/var/qmail/control),一般系统漠然安装的话,会仅产生一个配置文件。

1. spfbehavior

spfbehavior是指明qmail系统是否启用反向解析。以前的qmail默认值是0(不启用),qmail-toaster 1.0.5以后,默认值就改为3. spfbehavior的取值意义为:
0: 不做SPF检查
1: 仅仅生成 Received-SPF 头,但是不阻止邮件投递
2: 如果DNS检查出现问题,则产生一个 temporary 错误
3: SPF解析错误是拒绝邮件,通常是指 deny
4: SPF解析出现 softfail 时,拒绝邮件
5: SPF解析出现 neutral 时,拒绝邮件
6: SPF解析过程出现任何错误,拒绝邮件

环境变量 SPFBEHAVIOR 会覆盖 spfbehavior 的配置文件。当客户的请求环境中被设置了 RELAYCLIENT 时,Qmail不会启用 SPF 检查.

2. spfrules

spfrules 配置文件指明,如果根据 spfbehavior 的设定,一封邮件在检查SPF失败后(包括 fail, softfail, neutral),再执行 spfrules 的设定;spfrules 每行都表明了一条规则,如:
include: spf.abc.com
include: jxx.ori.com

3. spfguess

spfguess 配置文件指明,如果邮件发送者的服务器没有提供SPF配置(如目前花生壳上所作的域名就不能设置SPF Record),Qmail将进行 spfguess 指明的检查。如:
a mx

a 仅接收域名(如 domain.com)的IP地址为其A记录发送出来的邮件
mx 允许接收域名(如 domain.com)的MX服务器发送的邮件,如果日后域名增加了其他的mx记录,这些mx记录将被自动列入允许范围

4. spfexp

spfexp是自定义一个解释语句,当邮件发送者的发送请求被拒绝时,此语句显示给发送者。如

550 SPF not exist.

什么是SPF
就是Sender Policy Framework。SPF可以防止别人伪造你来发邮件,是一个反伪造性邮件的解决方案。当你定义了你的domain name的SPF记录之后,接收邮件方会根据你的SPF记录来确定连接过来的IP地址是否被包含在SPF记录里面,如果在,则认为是一封正确的邮件,否则 则认为是一封伪造的邮件。关于更详细的信息请参考RFC4408(http://www.ietf.org/rfc/rfc4408.txt

如何增加SPF记录
非常简单,在DNS里面添加TXT记录即可。登陆http://www.openspf.org/wizard.html 在里面输入你的域名,点击Begin,然后会自动得到你域名的一些相关信息。
a 你域名的A记录,一般选择yes,因为他有可能发出邮件。
mx 一般也是yes,MX服务器会有退信等。
ptr 选择no,官方建议的。

a: 有没有其他的二级域名?比如:bbs.extmail.org和www不在一台server上,则填入bbs.extmail.org。否则清空。
mx: 一般不会再有其他的mx记录了。
ip4: 你还有没有其他的ip发信?可能你的smtp服务器是独立出来的,那么就填入你的IP地址或者网段。
include: 如果有可能通过一个isp来发信,这个有自己的SPF记录,则填入这个isp的域名,比如:sina.com
~all: 意思是除了上面的,其他的都不认可。当然是yes了。

好了,点击Continue…..
自动生成了一条SPF记录,比如extmail.org的是
v=spf1 a mx ~all
并且在下面告诉你如何在你的bind里面添加一条
extmail.org. IN TXT “v=spf1 a mx ~all”

加入你的bind,然后ndc reload即可。
检查一下:
dig -t txt extmail.org

SPF 诞生于2003年,它的缔造者 Meng Weng Wong 结合了反向 MX 域名解析(Reverse MX) 和 DMP (Designated Mailer Protocol) 的优点而付予了 SPF 生命。

SPF 使用电子邮件头部信息中的 return-path (或 MAIL FROM) 字段,因为所有的 MTA 都可以处理包含这些字段的邮件。不过微软也提出了一种叫做 PRA (Purported Responsible Address)的方法。PRA 对应于 MUA (比如 thunderbird) 使用的终端用户的地址。

这样,当我们把 SPF 和 PRA 结合起来的时候,就可以得到所谓的“Sender ID”了。Sender ID 允许电子邮件的接收者通过检查 MAIL FROM 和 PRA 来验证邮件的合法性。有的说法认为,MAIL FROM 检查由 MTA 进行,而 PRA 检查由 MUA 来完成。

事实上,SPF 需要 DNS 以某种特定的方式来工作。也就是必须提供所谓的“反向 MX 解析”记录,这些记录用来解析来自给定域名的邮件对应的发送主机。这和目前使用的 MX 记录不通,后者是用来解析给定域名对应的接收邮件的主机的。 SPF 有哪些需求?

要想用 SPF 来保护你的系统,你必须:

  1. 配置 DNS,添加 TXT 记录,用于容纳 SPF 问询的信息。
  2. 配置你的电子邮件系统(qmail, sendmail)使用 SPF,也就是说对服务器上每封进入的邮件进行验证。

上述第一步要在邮件服务器所属的域名服务器上进行调整,下一节中,我们将讨论这个记录的细节内容。你首先需要确定的一点是你的域名服务器(bind,djbdns)所使用的语法。但别担心,SPF 的官方网站提供了一个很好用的向导来指导你如何添加记录。

SPF 的 TXT 记录

SPF 记录包含在一个 TXT 记录之中,格式如下:

v=spf1 [[pre] type [ext] ] … [mod]

每个参数的含义如下表所示:

参数 描述 v=spf1 SPF 的版本。如果使用 Sender ID 的话,这个字段就应该是 v=spf2 pre 定义匹配时的返回值。

可能的返回值包括: 返回值 描述 + 缺省值。在测试完成的时候表示通过。 表示测试失败。这个值通常是 -all,表示没有其他任何匹配发生。 ~ 表示软失败,通常表示测试没有完成。 ? 表示不置可否。这个值也通常在测试没有完成的时候使用。 type 定义使用的确认测试的类型。

可能的值包括: 候选值 描述 include 包含一个给定的域名的测试
以 include:domain 的形式书写。 all 终止测试序列。
比如,如果选项是 -all,那么到达这条记录也就意味着测试失败了。但是如果无法确定,可以使用"?all"来表示,这样,测试将被接受。 ip4 使用 IPv4 进行验证。
这个可以以 ip4:ipv4 或 ip4:ipv4/cidr 的形式使用。建议使用这个参数,以减少域名服务器的负荷。 ip6 使用 IPv6 进行验证。 a 使用一个域名进行验证。
这将引起对域名服务器进行一次 A RR 查询。
可以按照 a:domain, a:domain/cidr 或 a/cidr 的形式来使用。 mx 使用 DNS MX RR 进行验证。
MX RR 定义了收信的 MTA,这可能和发信的 MTA 是不同的,这种情况基于 mx 的测试将会失败。
可以用 mx:domain, mx:domain/cidr 或 mx/cidr 这些形式进行 mx 验证。 ptr 使用域名服务器的 PTR RR 进行验证。
这时,SPF 使用 PTR RR 和反向图进行查询。如果返回的主机名位于同一个域名之内,就验证通过了。
这个参数的写法是 ptr:domain exist 验证域名的存在性。
可以写成 exist:domain 的形式。 ext 定义对 type 的可选扩展。如果没有这个字段,那么仅使用单个记录进行问询。 mod 这是最后的类型指示,作为记录的一个修正值。

修正值 描述 redirect 重定向查询,使用给出的域名的 SPF 记录。
以 redirect=domain 的方式使用。 exp 这条记录必须是最后一条,允许给出一条定制的失败消息。

IN TXT "v=spf1 mx -all exp=getlost.example.com"

getlost IN TXT "You are not authorized to send mail for the domain"

嘿!我是 ISP

ISP 实施 SPF 可能对于他们处于漫游状态(roaming)的用户带来一些麻烦,当这些用户习惯使用 POP-before-Relay 这样的方式处理邮件,而不是 SASL SMTP 的时候问题就会出现。

嗯,如果你是一个被垃圾邮件、地址欺骗所困扰的 ISP 的话,你就必须考虑你的邮件策略、开始使用 SPF 了。

这里是你可以考虑的几个步骤。

  1. 首先设置你的 MTA 使用 SASL,比如,你可以在端口 25 和 587 使用它。
  2. 告诉你的用户你已经使用了这个策略(spf.pobox.com 给出了一个通知的例子,参见参考文献)。
  3. 给你的用户一个宽限期,也就是说,把你的 SPF 记录加入到域名服务器之中,但使用“软失败”(~all)而不是“失败”(-all)。

这样,你就保护了你的服务器、你的客户和整个世界免受垃圾邮件之类的困扰了。

SPF 的官方站点上有很多信息,还等什么呢?

有什么需要担心的?

SPF 是一个对于欺骗的完美保护。但它有一个局限:传统的邮件转发方式不再有效了。你不能仅仅从你的 MTA 接受邮件并简单地重新发送它了。你必须重写发送地址。常见的 MTA 的补丁可以在 SPF 的网站找到。换句话说,如果你把 SPF 记录加入到了域名服务器,你就必须更新你的 MTA 来进行发送地址改写,即使你还没有对 SPF 记录进行检查。

结论

你可能觉得 SPF 的实施有点难以理解。不过这确实不算复杂,而且还有一个不错的向导来帮你完成这个转换(参见参考文献)。

如果你被垃圾邮件所困扰的话,SPF 将可以帮助你,保护你的域名免受伪造邮件地址的影响,你所要做的仅仅是在域名服务器上添加一行文本并配置你的电子邮件服务器而已。

SPF 的优点有很多。不过,像我对一些人所说的,这不是一夜之间就可以达到的,SPF 的好处将通过日积月累来表现出来,当其他人都使用它的时候就能明显地看到了。

我也提到了 Sender ID,这和 SPF 有关,但我没有去解释它。可能你已经知道原因了,微软的策略一向如此—软件专利。在参考文献中,你可以看到 openspf.org 对于 Sender ID 的立场声明。

Domainkeys 是由雅虎公司推出的一项确保电子邮件来源的真实性和内容的完整性的技术,它能让电子邮件服务商确定某封信是否真实的来自某个域和帮助他们的用户免受“钓鱼 欺诈邮件“的损害,比如用户常收到伪造这些机构的诈骗邮件,然后索取用户的信用卡卡号和密码。 而对于金融机构等公司也有保护用户的交易信息,提高用户满意度,减少客服咨询处理量和品牌保护的作用。

Domainkey的工 作原理是:发信域的负责人首先生成一对公私钥用于对它发出的邮件进行签名,公钥需要部署到公共的DNS 服务器上供所有收信方查询。而私钥则用于加密自己发出的信。这样只有含有用这个私钥加密后的字符串的邮件才是该域发出的邮件。收信方在收到邮件时,可以通 过公用DNS查询它的公钥,然后用该域的公钥来解密验证收到的邮件。如果验证是正确的,这封信就被投递到用户的邮箱里;如果验证失败,邮件将会被丢弃或者 标志。这样用户在所收到的邮件就能确保邮件确实是该域发出。

Domainkey的验证过程:例如user@a.com发送给 user@b.com,a.com的mta会在每封发出的邮件里根据私钥生成一个签名.当b.com的mx服务器在接收邮件时会根据发送方邮件头里的签名 查出selector(即s字段,用于签名.例如dk),则b.com的mx会查找dk._domainkey.b.com的txt记录得到公钥.然后使 用公钥对签名进行核实。

注意:Domainkey是在接收方邮件运营商支持的情况下才有效。否则对接收双方是没有意义的。

1、生成私钥和公钥
a、生成rsa的1024位私钥:
#openssl genrsa -out rsa.private 1024
#cat rsa.public
—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4HNUwh80iMCNlAL3wk8IUvJ+G
VblmXpW0AAoEOrcLkBqgYIgFY8Zh1nXrDMqH06/q0vaPN/tlDtgWchaQkFKoJeE9
QvLvq9dRDKJmosW9FfOevtRY31Bti7smaBZsev9n3g305ON6fOR02al8Kr7mxV8d
U0fkJhe8oym/IWIBBwIDAQAB
—–END PUBLIC KEY—–
b、根据私钥生成公钥:
openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM

2、添加域名txt记录:
s1024._domainkey.yourdomain.com. TXT “k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4HNUwh80iMCNlAL3wk8IUvJ+GVblmXpW0AAoEOrcLkBqgYIgFY8Zh1nXrDMqH06/q0vaPN/tlDtgWchaQkFKoJeE9QvLvq9dRDKJmosW9FfOevtRY31Bti7smaBZsev9n3g305ON6fOR02al8Kr7mxV8dU0fkJhe8oym/IWIBBwIDAQAB; n=A 1024 bit key;”
注:yourdomain.com是指你的所在域,如果你的邮件地址为user@a.com;则为a.com.
rsa为你的加密类型;
p=”MIGf……”,是上述第1步生成的公钥.
3、在MTA上添加domainkey的支持
1、qmail:这个可以按照下面链接(http://jeremy.kister.net/howto/dk.html)来做即可。
2、sendmail:这个可以按照下面链接(http://bbs.chinaunix.net/viewthread.php?tid=797739)来做即可。
3、ironport:这个可以按照下面链接(https://support.ironport.com/DKConfig/AsyncOS_4.6_User_Guide-21-3.html)来做即可。
4、lyirs:这个可以按照下面链接(http://www.lyris.com/help/lm_help/10.0/Content/setting_up_and_using_domainkeys.html)来做即可。
5、postfix:这个可以按照下面链接(http://bbs.chinaunix.net/viewthread.php?tid=1115806)来做即可。

包括:qmail全部控制文件列表和各控制文件的作用两部分

[1.qmail全部控制文件列表(按照相关性排列) ]

qmail-inject
defaultdomain
defaulthost
idhost
plusdomain

qmail-qmqpc
qmqpservers

qmail-remote
helohost
smtproutes
timeoutconnect
timeoutremote

qmail-send
bouncefrom
bouncehost
concurrencylocal
concurrencyremote
doublebouncehost
doublebounceto
envnoathost
locals
me
percenthack
queuelifetime
virtualdomains

qmail-smtpd
badmailfrom
databytes
localiphost
rcpthosts
morercpthosts
timeoutsmtpd
smtpgreeting
_________________________________________________________________

[2.各控制文件的作用 ]

qmail-inject
qmail-inject接受本地邮件消息后检测邮件头是否符合RFC822标准,并传送给qmail-queue排进队列

defaultdomain
用来向那些没有使用正确的格式的邮件中增加邮件地址的,默认情况下,
如果主机地址中没有结束符".",qmail-inject将给主机名后添加defaultdomain的内容,如果该文
件不存在,将使用me文件中的值代替.
例如:defaultdomain值为linuxfane.com 本地产生了一封发送给的邮件,那么qmail-inject将用linuxfane.com来补全这个后缀,变成

defaulthost
用来定义主机名,用来向地址中不含主机名的邮件补足邮件地址的。类似于defaultdomain。
例如:defaulthost值为linuxfane.com 那么发送给 rainbow的消息,将被qmail-inject用defaulthost的值来补足为,
以便于qmail-send快速分辨是否属于本地地址。

idhost
用来指定邮件中Message-ID:头字段的主机名
例如:idhost值为linuxfane.com
那么邮件头中如下:
Message-ID:
如果idhost值为rainbow.linuxfane.com
那么邮件头中如下:
Message-ID:

plusdomain 用来将其值添加在任何一个以一个+号结尾的地址
_________________________________________________________________

qmail-qmqpc
qmail-qmqpc是快速邮件排队协议(QMQP)使用的程序,QMQP是一个QMAIL专用协议,用在工作站级QMAIL
服务器向中心服务器发送队列。

qmqpservers
用来指定qmail-qmqpc使用的上级服务器
通常该功能应用很少,我认为qmail-qmqpc用法就是代替qmail-queue来直接传给上级服务器。
_________________________________________________________________

qmail-remote
qmail-remote通过SMTP协议向远程主机传送邮件。

helohost 该文件用来指定qmail-remote程序与远程邮件主机SMTP会话中的主机名。

smtproutes
用来指定到固定目的的静态SMTP路线。
例子:smtproutes内容如下
rainbow.linuxfane.com:mail8.rainbow.jp
:fw.rainbow.linuxfane.com:8088
第一行的存在会将发给rainbow.linuxfane.com的邮件重定向到mail8.rainbow.jp主机
第二行的存在会将任何不符合之前行条件的邮件重定向到fw.rainbow.linuxfane.com的8088端口,让
邮件安全的穿越防火墙
qmmail-remote将按照smtproutes中的行序来进行处理

timeoutconnect
用来指定qmail-remote尝试同一个远程邮件主机建立一个SMTP会话的时间。默认值状态下如果超出60
秒没有得到远程邮件主机的回应,那么将断开连接。

timeoutremote
用来指定qmail-remote在一个SMTP连接已经建立后,远程邮件主机的每一个回应的时间数。默认值为
1200秒。
_________________________________________________________________

2.4 qmail-send
qmail-send用来检测队列中每一个邮件的状态,并调用相应的程序进行处理。例如一个目的为本地的
邮件将会被qmail-send调用qmail-lspawn处理。

bouncefrom | bouncehost
默认情况下,退回给原始发送方的邮件的发件人地址为,如果你想修改
MAILER-DAEMON这段,那么就修改bouncefrom文件吧。
如果想修改中HOSTNAME这段,那么就修改bouncehost文件。
例如:bouncefrom内容为SERVER-MANAGER | bouncehost文件内容为mail8.rainbow.jp
那么一封因为邮件地址不存在而被退回的通知邮件的发件人将是 [email]SERVER-MANAGER@mail8.rainbow.jp[/email]

concurrencylocal
用来决定qmail可以同时运行的本地投递进程的数目,默认值是10,标准安装的qmail最大可设值是120。
安装的时候可以通过修改conf-spawn来将其变为255以下任何数目。

concurrencyremote
用来决定qmail可以同时运行的远程投递进程的数目,默认值是20,就是说,qmail可以在同一时间内
同时发送20封邮件,标准安装的qmail最大可设值是120。安装的时候可以通过修改conf-spawn来将其
变为255以下任何数目。

doublebouncehost | doublebounceto 这两个控制文件类似于bouncefrom和bouncehost的关系,也是doublebouncehost指定主机名,
doublebounceto指定用户名。
他们的功能是为一个被退回两次的邮件制定一条出路。
例如:doublebouncehost内容为rainbow.linuxfane.com | doublebounceto内容为rainbow
那么一个被退回2次的邮件将被发送给
没有这两个文件的时候,那么发送给文件中的域名

envnoathost
qmail-send用来给没有主机名的邮件收件人制定一个主机名的,通常这个文件并没有必要,qmail-send
总是使用me文件中的域名。

locals
用来为qmail指明位于本地的邮件地址。qmail-send利用此文件来判断收件人地址是否是一个本地地址。
例如:locals文件中写有rainbow.linuxfane.com
那么qmail-send检测到队列中有发送给@rainbow.linuxfane.com的邮件的时候,就会调用qmail-lspawn
来进行本地投送。

me
如果没有me文件,那么你的qmail将拒绝执行。me文件用来指定本地邮件服务器的主机名。
以上列出的许多控制文件在没有被创建的时候,qmail都会用me中的值来代替。

percenthack
在UUCP协议中带有%并在该文件中列出的地址将会被转换为一个标准的DNS格式主机名。

queuelifetime
用来指定一个邮件在队列中的最大存活时间,默认是604800秒,当一个邮件达到这个时间线后,qmail将
最后一次尝试发送这封邮件,如果依然失败,会将其从队列中删除。

virtualdomains
让qmail接受本地邮件以外,还接受该文件中指定的域或者邮件地址,就是常说的虚拟域支持。

qmail-smtpd
qmail-smtpd接受远程主机的邮件并转交给队列处理程序qmail-queue来处理。

badmailfrom
用来指定不喜欢的发件人的邮件地址或者是域名
例如:badmailfrom中写有
[email]advt@msn.com[/email]
@hotmail.com
如果给该邮件主机送信时,将得到code 553,告知其是一个不受欢迎的发件人。
而所有来自hotmail.com的发件人也将得到同样的code 553。

databytes
用来指定该邮件服务器可以接受邮件的最大字节数。
例如:databytes指定为8000000
那么如果有人给该主机发送的邮件字节数超过了这个商业上默认的最大容忍限度,将得到code 552,告知
其邮件大小超出了该邮件主机所能容忍的限度。
恐怖的是,默认状态下,这个文件并没有,如果有人用你服务器上的两个不存在的地址作为FROM/TO发一
个100M的邮件

localiphost
用来为使用ip来标示目的主机的邮件消息指定本地主机名的
例如:rainbow.linuxfane.com的ip地址为198.17.1.2 | localiphost内容为rainbow.linuxfane.com
那么一封发送给]的邮件的地址会被转换为

rcpthosts | morercpthosts
这两个文件用来指定qmail可以接收的除本地主机名外的其他域名
他们的作用是相同的,不过因为rcpthosts中的域名不能超过50行,所以才出现了morercpthosts文件

timeoutsmtpd
用来指定qmail-smtpd等待远程SMTP主机发送数据的时间线。默认的情况下,如果连接建立后1200秒内没有
接受到远程SMTP主机的任何信息,那么将关闭这个连接。

smtpgreeting
用来指定SMTP连接的欢迎标志
例如:smtpgreeting值为 welcome connect to out open relay mail server – ad.rainbow.linuxfane.com
那么建立一个smtp连接的时候将会看到如下信息:
Trying 198.17.x.x…
Connected to ad.rainbow.linuxfane.com.
Escape characteris ^].
220 welcome connect to out open relay mail server – ad.rainbow.linuxfane.com ESMTP

原文地址:不详