公司上线的邮件服务器也有段时间了,在这里记录下体验,不为别的,只为曾经有过

                                                                                                                  --------by Tony

下面介绍邮件上线前后的点点滴滴及问题汇总:
一、首先说说extman后台的界面,字段太少了,假如公司规模在500+以上,又有各地办事处的时候,会给后续的管理工作带来很大的不便,所以有必要在后台显示新增字段(如:中文名、部门、公司)《注:在网上看到邓卫的一篇帖子,很不错,推荐!》后面会上传附件!

二、再一个就是别名,企业经常会群发邮件,这时候就利用别名实现了一个邮件组的功能,可每次在新增用户的时候不能同时指定别名,这点也遗憾,所以看到论坛上的牛人写的教程很不错,记录下来,后面把附件奉上。

三.别名的功能是很不错,但用不好,会被领导批的,所以对有的特殊的邮件组要加以权限的控制,比如all@abc.com,指定只有公司特别的人才可能发送,不然要是有人发个垃圾邮件给所有人,后果不堪设想。

实现方法如下:
使用postfix的发信和收信人策略实现邮件列表的使用控制,分享之。

1、创建local_recipient和local_domains两个文件
[root@a postfix]# pwd
/etc/postfix
[root@a postfix]# cat local_recipient
allstaff@a.com local_only
[root@a postfix]# cat local_domains 
a.com OK
127.0.0.1 OK
youip OK

2、产生db文件,如果修改过/etc/postfix/local_recipient和/etc/postfix/local_domains文件内容,需要重新执行下面的命令才可生效。
postmap hash:/etc/postfix/local_recipient
postmap hash:/etc/postfix/local_domains

3、在main.cf里加入两行
smtpd_restriction_classes = local_only
local_only = check_sender_access hash:/etc/postfix/local_domains, reject

4、在main.cf里给smtpd_sender_restrictions加个规则check_recipient_access hash:/etc/postfix/local_recipient,结果如下:
smtpd_sender_restrictions =
  permit_mynetworks,
  reject_sender_login_mismatch,
  reject_authenticated_sender_login_mismatch,
  reject_unauthenticated_sender_login_mismatch,
  reject_unknown_sender_domain,
  check_recipient_access hash:/etc/postfix/local_recipient

5、重启postfix。
此时非a.com用户无法给allstaff发信。
弹回信息如下:
你发送到
allstaff@a.com的邮件由于以下原因被退回 :
allstaff@a.com SMTP error, RCPT TO: 554 5.7.1 <allstaff@a.com
>: Recipient address rejected: Access denied

四:还有个问题就是有的时候发送给邮件组又同时发送给个人,这个人又包含在这个邮件组里,会收到两封一样的邮件,很不好,网上搜刮只要修改main.cf,添加一条参数即可!
实现方法:#vim /etc/postfix/main.cf 
enable_original_recipient = no
最后别忘记postfix restart

五:我们企业里面有人发送一些非法或者垃圾邮件,我们怎么进行监控呢,其实很简单,只需在main.cf里加一个参数,实现每一封发到服务器的邮件都密送一份给指定邮箱,我们就可以实现邮件的监控了。
实现方法:#vim /etc/postfix/main.cf 
always_bcc =
backup@abc.com
最后别忘记postfix restart   这样每一封邮件都会密送一封给
backup@abc.com了,用户是察觉不到,但会在服务器mailog里产生日志

六、附上常用的邮箱管理命令:
#postsuper -d ID          删除特定邮件队列      
#postsuper -d ALL       删除所有邮件队列
#mailq                           查看所有邮件队列
#postfix flush                 立即投递队列中所有邮件(慎用)
#postfix check               修复队列以及任何权限错误
#tail -f /var/log/maillog    查看邮件系统日志

七、企业人员太多,邮箱帐号记不住?让全局邮件列表来帮你,在webmail写邮件时不需要记住对方的邮箱帐号,直接选中即可。
实现方法:   #cd $/extmail/tools
#vim   makeglobabook.pl

#!/usr/bin/perl -w
#
# makeglobabook.pl
# make extmail globa book for mysql server. 
# ver 0.2

use strict;
use DBI;
use IO::File;
use lib "../libs";
use Ext;
use POSIX qw(strftime);
use vars qw(@ISA $usercfg $sysconfig);

my $gbook="../globabook.cf";
my $time = strftime ("%Y\-%m\-%d\_%H\:%M\:%S", localtime);
my $app = Ext->new( config => '../webmail.cf' );

system("mv $gbook $gbook.$time") if -f $gbook;

my $dbuser = $Ext::Cfg{SYS_MYSQL_USER};
my $dbpassword = $Ext::Cfg{SYS_MYSQL_PASS};
my $dbname = $Ext::Cfg{SYS_MYSQL_DB};

my $dbh = DBI->connect("dbi:mysql:database=$dbname",$dbuser,$dbpassword)
    or die "Can not connect DB server!\n";

my $query=qq~SELECT `username`,`name` FROM mailbox ~;
my $sth=$dbh->prepare($query);
$sth->execute();

my $fh=IO::File->new(">$gbook");
print $fh "Name,Mail,Company,Phone\n";

while (my @row=$sth->fetchrow_array()){
    print $fh "\"$row[1]\",\"$row[0]\"\n";

#chmod 755 makeglobabook.pl 

#./makeglobabook.pl 就会更新上一级目录的globabook.cf文件了。可放入crontab中定期执行

 

 

 

八、搭建完以后的性能优化,应对500+用户的环境(extmail论坛牛人发的)
1、修改/usr/lib/courier-imap/etc/pop3d
MAXDAEMONS=512
MAXPERIP=9000

2、修改/etc/authlib/authdaemonrc
daemons=256

3、修改/etc/amavisd.conf
$max_servers = 50;

4、修改/usr/sbin/apachectl
HTTPD='/usr/sbin/httpd.worker'

5、修改/etc/httpd/conf/httpd.conf
<IfModule worker.c>
StartServers         10
MaxClients       1500
ServerLimit         100
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

6、修改/etc/clamd.conf
MaxThreads 50

7、修改/etc/my.cnf
max_connections=2048

8、去除rar打包exe会被ban的问题
编辑/etc/amavisd.conf,把$banned_filename_re = new_RE 这段内容相应的修改下
如果你知道该重启哪些服务,就重启这些服务,不清楚的话重启下系统就好。

9、加强发信人限制策略
编辑/etc/postfix/master.cf,把-o smtpd_client_restrictions=permit_sasl_authenticated,reject这行注释去掉。
 
九、以下是建议:
1、刚上线的邮件服务器特别是迁移的服务器,上线后先把fail2ban服务关闭,这是一个防暴力破解的软件,要是不停的话,局域网内有员工密码输错了,次数超过阀值就会把局域网的公网ip列入临时黑名单(fail2ban实际就是调用iptables来工作的),所以建议临时关闭,等服务器稳定后再开启。
#/etc/init.d/fail2ban stop
2、dnsbl列表:这是个实时黑名单列表,但里面的绝大数列表都不适合在国内使用,所以建议关闭。
#vim /usr/local/slockd/config/plugin.cf
修改dnsbl_plugin = no
3、spf检查:也是防垃圾邮件的,检查对方是否具有spf记录,没有则拒绝,因有的邮件服务器确实没有做这个记录,只做了ip反解,所以在这里我把这个检查关了,当然,如果对垃圾邮件要求较高,可以不关
#vim /usr/local/slockd/config/plugin.cf
修改spf_plugin = no
4、greylist列表:灰名单,容易误判,所以关闭
#vim /usr/local/slockd/config/plugin.cf
修改greylist_plugin = no
以上只是个人思想,请不要果断如此做。
 
 十、维护工作:
1、维护工作离不开观察日志,因为只有看日志才有可能知道是什么问题,这就带来个问题,时间越来查日志就越慢,日志文件也会越来越大,所以可以考虑做日志轮询,每天生成一个日志文件,这样便于查询。(感谢同事小军:自动化的高手)
实现方法:vim logrotate.sh
#!/bin/bash
log_files=('/var/log/maillog')
log_date=`date -d "-1 day" +"%Y-%m-%d"`
rm_log=`date -d "-90 day" +"%Y-%m-%d"`
for log in "${log_files[@]}"
do
        if [ -f "$log" ];then
                cp ${log} ${log}.${log_date}
                cat /dev/null >${log}
        fi
        if [ -f "${log}.${rm_log}" ];then
                rm -f "${log}.${rm_log}"
        fi
done
放到crontab里,夜里定期执行即可
2、日志还有就是过滤日志,把很关键的字段过滤出来方便查询问题
cat /var/log/maillog |grep reject
暂时想到这么多,后续继续补充~
整理完不容易,唉,只为自己回头能看见~
                                                                                                               ---date 2012.05.16