首页 > 代码库 > 强大的邮件系统和简单的后台管理

强大的邮件系统和简单的后台管理

强大的邮件系统和简单的后台管理
环境: CentOS 6.0
软件:PostFix Dovecot
描述:Postfix是收发信全球最快的邮件服务器,而且安全免费,无论是从成本还是稳定/安全考虑
      都是企业最好的选择。服务器运维技术一直都是朝着高效,稳定,安全,易管理的方向发展。
      本邮件服务器有各种安全机制和一条命令可完成管理员所有的任务。规范,易于操作,而且管
      理界面简洁,全中文,就是一个不懂linux和英文的IT管理员都能完成所有邮件后台工作。
环境配置
设置主机名
[root@mail sbin]# hostname mail.davistest.com
设置网络主机名
vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=mail.davistest.com
设置本机解析(这里就不架域名服务器了,如感兴趣你可以本站其它地方去了解)DNS查询顺序HOST-ETH-NETWORK-RESOLV.CONF
vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.109 mail.davistest.com
如果是Centos 7 的话,还要把主机名加在/etc/hostname文件里,要不然重启后又回到解放前了。
网卡配置
(LAN IP能出外网的哦)(如果有WAN IP,可以再配一个网卡,域名在WAN上有MX解析的话就能接收外部邮件)
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=08:00:27:2a:6c:9d
NM_CONTROLLED=yes
ONBOOT=yes
IPADDR=192.168.1.109
BOOTPROTO=none
NETMASK=255.255.255.0
TYPE=Ethernet
GATEWAY=192.168.1.1
IPV6INIT=no
USERCTL=no
DNS1=192.168.1.1
关闭Selinux
[root@mail ~]# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled                                  #这里设成禁用disabled
# SELINUXTYPE= can take one of these two values:  
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
#一定要关了它,要不然会出现Maildir权限问题。
搞个防火墙规则,有点粗口,还是叫建个防火墙规则吧。这样更安全,除了指定的端口开放,其它的端口都进不了服务器。
vi /usr/local/sbin/startmailf
#!/bin/bash
#create: 15-Nov-2014
#Creater: Davis Dai
service network restart                            #重启网络
service postfix restart                            #重启postfix
service dovecot restart                            #重启dovecot
service saslauthd restart                          #重启ASAL授权
iptables -F                                        #清空防火墙
iptables -I INPUT -j DROP                          #拒绝所有输入端口
iptables -I INPUT -p tcp --dport 110 -j ACCEPT     #允许邮件收信110端口,POP3的IP入口
iptables -I INPUT -p udp --dport 110 -j ACCEPT     #允许邮件收信110端口,POP3的带数据包入口
iptables -I INPUT -p tcp --dport 25 -j ACCEPT      #允许邮件发信25端口,IP入口
iptables -I INPUT -p udp --dport 25 -j ACCEPT      #允许邮件发信25端口,带数据包入口
iptables -I INPUT -p udp --dport 143 -j ACCEPT     #允许邮件收信143端口,IMAP的IP入口
iptables -I INPUT -p tcp --dport 143 -j ACCEPT     #允许邮件收信143端口,IMAP的带数据包入口
iptables -I INPUT -p udp --dport 22 -j ACCEPT      #开放PUTTY和WINSCP 22号端口,方便管理员进入
iptables -I INPUT -p tcp --dport 22 -j ACCEPT      #开放PUTTY和WINSCP 22号端口,方便管理员进入
iptables -I INPUT -p tcp --dport 53 -j ACCEPT      #开放DNS查询端口,这样能解析到邮件服务器
iptables -I INPUT -p udp --dport 53 -j ACCEPT      #开放DNS查询端口,这样能解析到邮件服务器
#当然你也可以再加456,1925,587等邮件SSL/TLS端口,80网页管理端口,根据你的邮件服务器而定。
建好了防火墙规则,现把它加为开机启动,让它自动化,省得开机后来要打那该死的命令。
vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don‘t
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
sh /usr/local/sbin/startmailf  #把你的防火墙规则加在这里启动
软件安装
在安装之前你可以先更新一下您的yum源:
下载软件仓库
[root@mail ~]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
[root@mail ~]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
备份原有源
[root@mail ~]# cd /etc/yum.repos.d/
[root@mail yum.repos.d]# mkdir backup
[root@mail yum.repos.d]# mv CentOS-* backup/
更新源
[root@mail ~]# cp CentOS6-Base-163.repo /etc/yum.repos.d/
[root@mail ~]# rpm -ivh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
以上repo和rpm包的版本号要实时上网查询,现在不一定为个是最新版的了哦
用CentOS提供在线安装的功能。
Yum –y install postfix*
Yum –y install dovecot*
还要用到Pam.但这都是系统默认有的,如果没有,要安装
Yum -y install pam-devel
邮件服务器配置
邮件服务器是怎么工作的  
花上几分钟了解它的工作流程,绝对对下面的学习有用,这就可能是传说中的洗脑吧。
Postfix是干嘛的呀,大道理很难懂,也很难讲,通俗一点,打个比喻,它就是一个快递公司,客户要寄一件东西出去,首先
客户会电话或其它方式联系快递公司,打好包(客户端(outlook,foxmail...)配置好与服务器的连结,也就是我们平常
说的客户端邮件配置,客户端的必须要POSTFIX服务器提供的用户和密码,服务器地址等,也就是说客户寄快递要先找到快递
公司的电话或联系方式,设置完客户端的后,我们就要写邮件了,可以理解为寄件者先准备和打包好包裹),客户一切都准备
好后(邮寄地址,邮编.....),就转交给快递公司代理递送业务,快递公司收到后会给这个这个包裹一个运单号,供客户查询
快递情况(就是说我们的POSTFIX服务器会给每一封邮件一个MESSAGE ID号,这个ID号在是不变的,一直到递送完成,对于管
理员来说一定要知道怎么去找这个ID号,便于你追踪邮件的去向,)快递公司有的时候可能是因为业务员不够或双十一节日快递
爆棚,处理不过来,所以来的包裹要先来后到顺序排队,(就是说POSTFIX服务器会排先来后到来处理你的邮件,我们可以用
mailq来查询有哪些在排队未处理的),快递公司首先会对包裹进行检查,是否符合国家法律,如果是***,枪支,违禁品危险品
等直接扣下,不给邮寄,(POSTFIX 会对邮件进行检查,是否带病毒,地址是否正确等等,POSTFIX 有spam过滤所有的邮件,
如果不合格直接丢弃,并返回信息给客户端说明为什么),如果合格包裹快递公司会按地方进行分类,该装
船的装船,该空运的空运,送行目的城市的代理点,让他们再去派送,本地的就叫业务员直接送过去(postfix也是一样,先分
出哪些是本地域的,哪些是外域的,本地的址接放入目地邮箱,外域的送住目的域的邮件服务器,让它们去分发下去),同时快递
公司也接收其它城市的快件,接到后同样一样的检查,有些直接拒收,有些地址不祥,退回,等等(postfix 收到从各个域发来
的快件经检查该退回的退回,该投递到本地邮箱的投递到本地邮箱),整个工作流程大致就是这样,当然我们今天开的这个快递公司
未经注册,别人查不到有这个快递公司,外地的快递是送不过来的,但我们的快递还是可以送到外地,因为我们能知道外地的注册过
的快递公司在哪,可以送达,除非人家拒收我们这种无证公司的快件。(我们的域名没注册,在WAN上没有MX记录,WAN上邮件不知怎
么发给我们,这也是WAN的规矩,如果每个外部IP都可以收邮件,那就天下大乱了,因为我们能上网,不管是动态的还是静态的,都
个有个WAN IP,有WAN IP我们就能找到WAN的域,就可以发给他们,但有很多邮件服务器处于安全考虑拒收没经注册的域邮件,同样
我们也可以在我们的服务器上做这种设置)。
废话少说,马上开配。
  /etc/postfix/目录有两个主配置文件main.cf和master.cf,我们主要设置main.cf,master.cf基本保持默认就行。
其它文件都是些参数呀,表呀....,打个比方说,main.cf 是个人,其它的都是这个人的手机,衣服呀,手表呀,钱包呀。
postfix有100多个参数,但我们可以根据自己的要求去改少量的参数,其它保持默认就可。
我们要养成个良好的习惯,在修改任何文件之前必须把原文件备份。
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
vi /etc/postfix/main.cf
alias_database = hash:/etc/aliases       #用户别名数据文件,默认,可根据自己的要求可改成SQL,LDAP,VIRTUAL
alias_maps = hash:/etc/aliases           #用户别名配置文件,默认,可根据自己的要求可改成SQL,LDAP,VIRTUAL
broken_sasl_auth_clients = yes           #设定 SASL 支持非标准 E-mail Client 的认证动作,自己添加
command_directory = /usr/sbin            #命令目录      默认    
config_directory = /etc/postfix          #配置文件目录 默认
daemon_directory = /usr/libexec/postfix  #守护进程目录 默认
data_directory = /var/lib/postfix        #数据目录  默认
debug_peer_level = 2                     #排错管理级别 默认
home_mailbox = Maildir/                  #主目录存储格式,你也可以设成另外的格式mbox,
html_directory = no                      #是否支持网页格式管理
inet_interfaces = all                    #参数指定postfix系统监听的网络接口
inet_protocols = all                     #只支持IPv4协议,还是IPv4 IPv6都支持,还是主机,ip
mail_owner = postfix                     #邮件及邮件队列的所有者
#mail_spool_directory = /vbox            #指定UNIX风格的邮箱保存的目录。默认设置取决于系统类型。
mailq_path = /usr/bin/mailq.postfix      #指定查看邮件队列命令MAILQ的路径
manpage_directory = /usr/share/man       #Postfix的在线手册页的位置
mydestination = $myhostname,... #参数指定postfix接收邮件时收件人的域名,即您的postfix系统要接收到哪个域名的邮件
mydomain = davistest.com         #参数指定您的域名,默认情况下,postfix将myhostname的第一部分删除而作为mydomain的值
myhostname = mail.davistest.com  #参数指定运行postfix邮件系统的主机的主机名,默认情况下,其值被设定为本地机器名
mynetworks = 192.168.1.0/24 #参数指定你所在的网络的网络地址,postfix系统根据其值来区别用户是远程的还是本地的
myorigin = $mydomain                     #参数用来指明发件人所在的域名
newaliases_path = /usr/bin/newaliases.postfix #刷新别名命令newaliases路径
queue_directory = /var/spool/postfix      #指定队列的位置
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES #帮助文档位置
sample_directory = /usr/share/doc/postfix-2.6.6/samples   #模板文件位置
sendmail_path = /usr/sbin/sendmail.postfix #发送邮件命令的位置
setgid_group = postdrop  #这个组是提交邮件和对列管理命令
message_size_limit = 10240000  #限制发送人单个邮件的大小,单位是Byte
smtpd_recipient_restrictions = permit_mynetworks,  
permit_sasl_authenticated,reject_unauth_destination  #信件收件的限制
smtpd_sasl_security_options = noanonymous  #拒绝匿名登入
smtpd_sasl_auth_enable = yes    #Postfix SMTP server支援SASL验证
smtpd_sasl_path = private/auth  #postfix与dovecot通讯程序文件路径
smtpd_sasl_type = dovecot       #指定sasl验证程序
unknown_local_recipient_reject_code = 550
#拒绝不存在的本地帐户/「不明使用者」(unknown user)
#如果收信地址的人名部份,在任何对照表、别名表、系统帐户都查不出来,
#这个人会被视为「不明使用者」(unknown user),系统会拒收。
#如果希望蒐集这类信件,使用下列设定,并指定集中收集的信箱
#以上的mydestination一定要有本机主机名,要不然会收不到信
伟大的postfix也自带很多反垃圾设置,可根据实际情况以及自己的需要进行调整。
smtpd_helo_required = yes #握手要求
smtpd_delay_reject = yes  #中继要求
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/client_access #客户端访问控制列表
smtpd_helo_restrictions=
reject_invalid_hostname,check_helo_access hash:/usr/local/etc/postfix/helo_access#主机和握手控制列表
smtpd_sender_restrictions =                 #客户端发送人控制列表
 reject_non_fqdn_sender,                    #拒收没有注册域名的发送者
 reject_unknown_sender_domain,              #拒收不知发件人域的发送者
 check_sender_access hash:/usr/local/etc/postfix/sender_access  #发件人控制列表
smtpd_recipient_restrictions=               #收件控制
 permit_mynetworks,                         #允许我的网络定义的客户端收信
 permit_sasl_authenticated,                 #允许simple authenticated security layer 授权的客户端。
 reject_non_fqdn_hostname,                  #拒收没有注册的主机  
 reject_non_fqdn_sender,                    #拒收没有注册的发送人
 reject_non_fqdn_recipient,                 #拒收没注册的接收者
 reject_unauth_destination,                 #拒收没授权的目的主机
 reject_invalid_hostname,                   #拒收不可用的主机
 #还有很多,就不写了 
 smtpd_data_restrictions = reject_unauth_pipelining         #拒绝没有授权的通道
    header_checks = regexp:/postfix/head_checks      #绝对路径邮件头(主题,附件名等)控制列表
    body_checks = regexp:/etc/postfix/body_checks    ##绝对路径邮件内容控制列表
  创建刚才指定的文件就不一一写出来了,照这个方法就行了
 touch /usr/local/etc/postfix/head_checks
 touch /usr/local/etc/postfix/body_checks
 postmap /usr/local/etc/postfix/head_checks
 postmap /usr/local/etc/postfix/body_checks
还是例举一下吧,要不然想了解的都不知文档怎么写。
假如/etc/postfix/mail.cf 下有如下反垃圾设置: 
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access_client
smtpd_helo_restrictions = check_client_access hash:/etc/postfix/helo_client
smtpd_sender_restrictions = check_client_access hash:/etc/postfix/sender_client
smtpd_recipient_restrictions = check_client_access hash:/etc/postfix/recipient_client
header_checks = regexp:/etc/postfix/header_check
body_checks = regexp:/etc/postfix/body_check
那么我们在access_client/helo_client/sender_client/recipient_client 文件的语法如下:
列表分三项,第一项是规则内容,第二项是对满足规则时所采取的行动,第三项是返回给客户端的信息
客户端域名/ip   550/REJECT/OK.. 你不可以通过我们的服务器发邮件!access_client
客户端域名/ip   550/REJECT/OK.. 禁止davis通过本服务器发送邮件  sender_client
客户端域名/ip   550/REJECT/OK.. 服务器拒收来自davis的邮件.     recipient_client
客户端IP/域名   550/REJECT/OK.. 服务器拒绝你的连接.             helo_client
不详说了,知道它是怎么工作的就行了,现在有很多软件,比如Mailscanner..功能强大,易管理。
 配完之后,你可以用postconf -n main.cf去查看没有注释的内容。
我们用pam去调用连接系统用户为邮件用户验证saslauthd,当然也可以用LDAP,MYSQL等,或SYRUS的shadow.后面我们会讲到。
# Directory in which to place saslauthd‘s listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/var/run/saslauthd
# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam                                                                         #这行MECH设成pam
# Options sent to the saslauthd. If the MECH is other than "pam" uncomment the next line.
# DAEMONOPTS=--user saslauth
# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS=
我们用的是dovecot给客户端验证收信,所以我们先确定pam下的dovecot授权如下。
Vi /etc/pam.d/dovecot   
#%PAM-1.0
auth       required     pam_nologin.so
auth       include      password-auth
account    include      password-auth
session    include      password-auth
下面我们来弄一下dovecot收信。没文化,又说粗口了,应该说来配置一下dovecot收信。
protocols = imap pop3 lmtp               #开放IMAP POP3 等协议 路径/etc/dovecot/dovecot.conf 
auth_mechanisms = plain login            #授权机制,如果我们用POSTADMIN网页管理,也可用什么MD5等等
                                             #路径/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no              #允许用明文认证登陆,路径/etc/dovecot/conf.d/10-auth.conf
listen = *                               #我们只监听IPV4端口。路径/etc/dovecot/dovecot.conf 
mail_location = maildir:/vbox/%u/Maildir #邮件目录,%u表示用户名。路径/etc/dovecot/conf.d/10-mail.conf
mbox_write_locks = fcntl                 #邮箱锁的方法。路径/etc/dovecot/conf.d/10-mail.conf
passdb {                                 #帐户授权 
args = dovecot                           #就是/etc/pam.d/下的dovecot文件
driver = pam                             #帐户授权数据提供商 
}                                        # 路径/etc/dovecot/conf.d/auth-system.conf.ext
service auth {                           #服务授权
unix_listener /var/spool/postfix/private/auth {  #UNIX监听的授权文件
  group = postfix                        #指定监听授权文件的属组为POSTFIX
  mode = 0666                            #指定监听授权文件组权限为666
  user = postfix                         #指定监听授权文件的属主为postfix
  }                                      #路径 /etc/dovecot/conf.d/auth-system.conf.ext
}
userdb {                                 #用户数据
driver = passwd                          #共用系统密码驱动
}
建立邮件存放目录邮件备份目录 
mkdir /vbox                              #建立邮件MAILDIR目录
chmod 755 /vbox                          #给权限
mkdir /backup                            #删除用户的备份目录
chmod 755 /backup                        #备份目录权限
mkdir /etc/postfix/Mail_Group            #邮件组软链目录,以后做管理面版脚本要用
启动服务 
service postfix start
service dovecot start
service saslauthd start
设置服务开机自动启动 
chkconfig postfix on
chkconfig dovecot on
chkconfig saslauthd on
脚本编写
管理员控制面版 
vi /usr/local/sbin/main
#!/bin/bash
#create: 15-Nov-2014
#Creater: Davis Dai
echo "1 新建邮件帐号"            #在屏幕上输出菜单 
echo "2 查看邮件帐号"
echo "3 删除邮件帐号"
echo "4 新建邮件组"
echo "5 删除邮件组"
echo "6 查看邮件组"
echo "7 添加用户到组"
echo "8 从组里删除用户"
echo "0 退出邮件管理"
order=""                          #设参数为你要先择的菜单
echo "请选择任务代码:"
read order
echo $order >/tmp/order.txt
if [ "$order" == "1" ];then         #设条件根据你的选择跳到相应的管理模块
    mailacounts;
elif [ "$order" == "2" ];then
    viewusers;
elif [ "$order" == "3" ];then
    dusers;
elif [ "$order" == "4" ];then
    groupacounts;
elif [ "$order" == "5" ];then
    dgroup;
elif [ "$order" == "6" ];then
  viewgroup;
elif [ "$order" == "7" ];then
    AMFG;
elif [ "$order" == "8" ];then
    RMFG;
elif [ "$order" == "0" ];then
   exit 0;
else                                           #如果你的选择不是以上菜单,提示错误并返回控制面版。
    echo "任务代码错误,请重新输入!"
    main
fi
新建邮件模块 
vi /usr/local/sbin/mailacounts
home="/vbox/"                                           #没置目录参数
useraccount=""                                          #设置用户参数       
echo "请给新用户名字:"            
read useraccount
echo $useraccount > /tmp/user.txt                       #给用户参数赋值
userpass=""                                             #设置密码参数
echo "请输入用户密码:"
read userpass
echo $userpass > /tmp/pass.txt                          #给密码参数赋值
useradd -d $home/$useraccount $useraccount              #添加用户并指定邮件主目录
echo $userpass |passwd --stdin $useraccount             #设置邮箱密码
mkdir -p $home/$useraccount/Maildir/{cur,new,tmp}       #建邮件目录和文件
mkdir -p $home/$useraccount/Maildir/.Drafts/{cur,new,tmp}
mkdir -p $home/$useraccount/Maildir/.Sent/{cur,new,tmp}
mkdir -p $home/$useraccount/Maildir/.Trash/{cur,new,tmp}
chown -R $useraccount $home/$useraccount/*    #设置属主-R是做个递归,也就是说文件夹下所以有子文件夹和文件
chmod 700 -R $home/$useraccount/*                       #设置属主有完全权限,其它人没任何权限。
main                                                    #回到管理员控制面版
新建邮件组模块 
vim /usr/local/sbin/groupacounts
#/bin/bash
#Create: 14-Nov-2014
#Creater: Davis Dai
ls /etc/postfix/Mail_Group/                          #显示现有组
home="/vbox/"                                        #没置目录参数      
groupaccount=""                                      #设置邮件组参数  
echo "请输入新邮件组名:"
read groupaccount
echo $groupaccount > /tmp/group.txt                  #给组邮箱参数赋值
grouppass=""                                         #设置密码参数
echo "请输入新邮件组密码:"
read grouppass
echo $grouppass > /tmp/pass.txt                      #给密码参数赋值
useradd -d $home/$groupaccount $groupaccount         #添加组邮箱并指定邮件主目录
echo $grouppass |passwd --stdin $groupaccount        #设置组邮箱密码
mkdir -p $home/$groupraccount/Maildir/{cur,new,tmp}  #建组邮件目录和文件
mkdir -p $home/$groupaccount/Maildir/.Drafts/{cur,new,tmp}
mkdir -p $home/$groupaccount/Maildir/.Sent/{cur,new,tmp}
mkdir -p $home/$groupaccount/Maildir/.Trash/{cur,new,tmp}
chown -R $groupaccount $home/$groupaccount/*    #设置属主权限-R是做个递归,也就是说文件夹下所以有子文件夹和文件
chmod 700 -R $home/$groupaccount/*                   #设置属主有完全权限,其它人没任何权限。
touch $home/$groupaccount/.forward                   #建组邮件名单表
chown root $home/$groupaccount/.forward              #设置权限给名单表
chmod 755 $home/$groupaccount/.forward 
ln -s $home/$groupaccount/.forward /etc/postfix/Mail_Group/$groupaccount #做一个软连结,便于查找
main                                                 #回到管理员控制面版
添加邮箱到指定邮箱组模块 
vim /usr/local/sbin/AMFG
#!/bin/bash
#Create Date: 15-Nov-2014
#Creater: Davis Dai
ls /etc/postfix/Mail_Group
Groupname=""
echo "请输入你要加入的组全称:"
read Groupname
echo $Groupname >/tmp/Groupname.txt
cat -n /vbox/$Groupname/.forward
usermail=""
echo "请输入你要加组的用户邮件地址:"
read usermail
echo $usermail >/tmp/usermail.txt
echo $usermail >> /vbox/$Groupname/.forward
main
删除邮箱帐号模块 
vim /usr/local/sbin/dusers
#!/bin/bash
#create: 15-Nov-2014
#Creater: Davis Dai
ls /vbox/
deluser=""
echo "请键入你要删除的用户:"
read deluser
echo $deluser > /tmp/deluser.txt
cp -R -u -i /vbox/$deluser /backup/
userdel $deluser
rm -rf /vbox/$deluser
main
删除邮箱组模块 
vim /usr/local/sbin/dgroup
#!/bin/bash
#create: 15-Nov-2014
#Creater: Davis Dai
ls /etc/postfix/Mail_Group/
degroup=""
echo "请键入你要删除的邮件组:"
read degroup
echo $degroup > /tmp/degroup.txt
cp -R -u -i /vbox/$degroup /backup/
userdel $degroup
rm -rf /vbox/$degroup
main
查找邮箱用户模块 
vim /usr/local/sbin/viewusers
#!/bin/bash
#create: 15-Nov-2014
#Creater: Davis Dai
ls /vbox/ >/tmp/userview.txt
cat -n /tmp/userview.txt
svuser=""
echo "请输入你要查找的用户名:"
read svuser
echo $svuser > /tmp/svuser.txt
if grep -q $svuser /tmp/userview.txt; then
    echo "用户$svuser已经存在!";
else
  echo "用户$svuser不存在!";
fi
grep -n $svuser /tmp/userview.txt
main
查找用户组模块 
vim /usr/local/sbin/viewgroup
#!/bin/bash
#create: 15-Nov-2014
#Creater: Davis Dai
ls /etc/postfix/Mail_Group/ >/tmp/groupview.txt
cat -n /tmp/groupview.txt
svgroup=""
echo "请输入你要查找的邮件组:"
read svgroup
echo $svuser > /tmp/svgroup.txt
if grep -q $svgroup /tmp/groupview.txt; then
     echo "邮件组$svgroup已经存在!";
else
    echo "邮件组$group不存在!";
fi
grep -n $svgroup /tmp/groupview.txt
main
从邮箱组里删除用户模块 
vi /usr/local/sbin/RMFG
#!/bin/bash
#create: 15-Nov-2014
#Creater: Davis Dai
ls /etc/postfix/Mail_Group >/tmp/groupview.txt
cat -n /tmp/groupview.txt
sgroup=""
echo "请键入你要删除的用户属组名称:"
read sgroup
echo $scgoup >/tmp/sgroup.txt
cat -n /vbox/$sgroup/.forward
rguser=""
echo "请键入你要删除的用户编号:"
read rguser
echo $rguser >/tmp/rguser.txt
sed -i ‘‘$rguser‘d‘ /vbox/$sgroup/.forward #按编号删除
#sed -i “/$rguser/d” /vbox/$sgroup/.forward #按地址删除
main
管理员手册
进入服务器,输入邮件管理命令main,管理所有的任务 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
新建邮件帐号 
[root@mail ~]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
1
请给新用户名字:
john
请输入用户密码:
123456
Changing password for user john.
passwd: all authentication tokens updated successfully.
新建邮件组 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
4
admin  hr  it  price
请输入新邮件组名:
development
请输入新邮件组密码:
123456
Creating mailbox file: File exists
Changing password for user development.
passwd: all authentication tokens updated successfully.
添加用户到组 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
7
admin  development  hr  it  price
请选择你要加入的组:
development
请输入你要加组的用户邮件地址:
john@davistest.com
查看邮件帐号/备份邮件数据(备份到/backup/)/删除邮件目录 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
3
4  admin  Computer  davis  development  hr  john  Maildir  price  qq
请键入你要删除的用户:
qq
删除邮件组/备份邮件组数据(备份到/backup/)/删除邮件组目录 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
5
admin  development  hr  it  price
请键入你要删除的邮件组:
it
cp: overwrite `/backup/it/.forward‘? y
查看邮件帐号是否存在 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
2
   1  4
   2  admin
   3  Computer
   4  davis
   5  development
   6  hr
   7  john
   8  price
请输入你要查找的用户名:
john
用户john已经存在!
查看邮件组是否存在 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
6
   1  admin
   2  development
   3  hr
   4  price
请输入你要查找的邮件组:
fjdajkldajf
邮件组不存在!
从邮件组里删除用户 
[root@mail sbin]# main
1 新建邮件帐号
2 查看邮件帐号
3 删除邮件帐号
4 新建邮件组
5 删除邮件组
6 查看邮件组
7 添加用户到组
8 从组里删除用户
0 退出邮件管理
请选择任务代码:
8
   1  admin
   2  development
   3  hr
   4  price
请键入你要删除的用户属组名称:
admin
   1  davis@davistest.com
   2  4@davistest.com
请键入你要删除的用户编号:
2
客户端测试
只测试收发信,其它组呀,安全呀的,懒得去写了,本人保证做过测试,全部通过!
微软OUTLOOK配置 
 
发送一个邮件给外部邮箱同时抄送内部邮箱(就自己了呀,这样同时可以测试内部收信) 
 
自己邮箱也收到了,测试内部成功。 
 
外部邮箱收到,测试成功.(域名没在INTERNET上注册,所以收不到外部发来的邮件,等我中了500万去注册一个,哈哈) 
 
PostfixAdmin网页管理界面
PostfixAdmin软件和依赖包的安装 
依赖包的安装
yum install -y mysql-server php php-mysql php-imap php-mbstring
PostfixAdmin软件安装 点击这里进入源安装包下载网站下载最新的.tar.gz格式的文件。
 下载后解压改名,放在你想放的位置,并设置权限。
 [root@mail ~]# tar -xzvf postfixadmin-2.92.tar.gz  #解压
 [root@mail ~]# mv postfixadmin-2.92 /postfixadmin  #改名放到指定位置
 [root@mail ~]# chmod 777 /postfixadmin/ -R
 修改PostfixAdmin网页主配置文件
 vim /postfixadmin/config.inc.php
 $CONF[‘configured‘] = true; 
 $CONF[‘postfix_admin_url‘] = ‘/postfixadmin‘;
 $CONF[‘database_type‘] = ‘mysqli‘;
 $CONF[‘database_host‘] = ‘localhost‘;
 $CONF[‘database_user‘] = ‘vmail‘;
 $CONF[‘database_password‘] = ‘vmail‘;
 $CONF[‘database_name‘] = ‘vmail‘;
 $CONF[‘domain_path‘] = ‘YES‘;
 $CONF[‘domain_in_mailbox‘] = ‘NO‘;
 $CONF[‘encrypt‘] = ‘dovecot:CRAM-MD5‘; 
 $CONF[‘emailcheck_resolve_domain] = ‘NO‘;
 $CONF[‘dovecotpw‘] = "/usr/bin/doveadm pw";
      新建PostfixAdmin数据库
启动MySql服务
service mysqld start
进入MySql命令工具,默认的MySql用户root的密码是空的
mysql -u root -p
mysql> CREATE DATABASE vmail;                                   
mysql> GRANT ALL PRIVILEGES ON vmail.* TO ‘vmail‘@‘localhost‘ IDENTIFIED BY ‘vmail‘;
mysql> flush privileges;     
mysql> \q
touch /postfixadmin/DATABASE_MYSQL.TXT
mysql -uvmail -p vmail < /postfixadmin/DATABASE_MYSQL.TXT
如果显示ACCESS DENIY, mysql -u vmail -p vmail 
mysql> set password = password (‘newpassword‘)
配置PostfixAdmin网页管理应用
安装网页程序apache, 默认是已安装的,所以这你可以省了,你可以先查看一下,是否有安装,再决定。
rpm -qa|grep httpd      #查看是否安装
yum install httpd -y    #安装
新建网页索引文件
vim /etc/httpd/conf.d/postfixadmin.conf
Alias /postfixadmin /postfixadmin 
启动Apache服务
service httpd start
POSTFIX的虚拟用户MYSQL设置和sasl设置 
建立邮件目录和管理用户 
useradd -u 1000 -d /vmail -s /sbin/nologin vmail
mkdir /vmail
chmod 770 /vmail/
chown vmail:vmail /vmail/
vim /etc/postfix/main.cf  加入如下设置。
######################Virtual Settings##########################
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_base = /vmail
virtual_minimum_uid = 1000
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000
virtual_transport = dovecot
#####################SASL Settings###############################
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks,
                             permit_sasl_authenticated,
                             reject_non_fqdn_hostname,
                             reject_non_fqdn_sender,
                             reject_non_fqdn_recipient,
                             reject_unknown_sender_domain,
                             reject_unknown_recipient_domain,
                             reject_unauth_pipelining,
                             reject_unauth_destination,
                             reject_invalid_hostname
###################Mail Quota Settings###############################
message_size_limit = 204800000
maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d
vim /etc/postfix/master.cf  最后行加入,flages 前一定要有两个空格哦
dovecot unix -  n  n  -  -  pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}
[root@mail ~]# vim /etc/postfix/mysql_virtual_domains_maps.cf
user = vmail
password = vmail
hosts = localhost
dbname =vmail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = ‘0‘ and active = ‘1‘
[root@mail ~]# vim /etc/postfix/mysql_virtual_alias_maps.cf
user = vmail
password = vmail
hosts = localhost
dbname = vmail
table = alias
select_field = goto
where_field = address
additonal_conditions = and active = ‘1‘
[root@mail ~]# vim /etc/postfix/mysql_virtual_mailbox_maps.cf
user = vmail
password = vmail
hosts =localhost
dbname = vmail
table = mailbox
select_field = CONCAT(domain,‘/‘,maildir)
where_field =username
additional_conditions = and active = ‘1‘
vim /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = vmail
password vmail
hosts = localhost
dbname= vmail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active =‘1‘
DOVECOT收信和SMTPD认证 
[root@mail ~]# vim /etc/dovecot/dovecot.conf 修改如下选项
protocols = imap pop3 lmtp
listen = *
base_dir = /var/run/dovecot/
#first_valid_uid = 89
#last_valid_uid = 89
#maildir_copy_with_hardlinks = yes
[root@mail ~]# vim /etc/dovecot/conf.d/10-auth.conf  修改如下选项
disable_plaintext_auth = no
auth_mechanisms = plain login cram-md5
!include auth-sql.conf.ext
[root@mail ~]# vim /etc/dovecot/conf.d/10-master.conf   修改如下选项
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = vmail
  group = vmail
}
[root@mail ~]# vim /etc/dovecot/conf.d/10-mail.conf 修改如下选项
mail_location = maildir:/vmail/%u/Maildir
[root@mail ~]# vim /etc/dovecot/conf.d/15-lda.conf  修改如下选项
protocol lda {
  postmaster_address = postmaster@dggd.com
  sendmail_path = /usr/lib/sendmail
  auth_socket_path = /var/run/dovecot/auth-master
}
[root@mail ~]# vim /etc/dovecot/conf.d/20-pop3.conf  修改如下选项
pop3_uidl_format = %08Xu%08Xv
[root@mail ~]# vim /etc/dovecot/conf.d/auth-sql.conf.ext  修改如下选项
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
[root@mail ~]# vim /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=vmail user=vmail password=vmail
default_pass_scheme = PLAIN-MD5
password_query = SELECT username as user, password, ‘/vmail/%d/%n‘ as userdb_home, ‘maildir:/vmail/%d/%n/Maildir‘ as userdb_mail, 1000 as userdb_uid, 1000 as userdb_gid FROM mailbox WHERE username = ‘%u‘ AND active = ‘1‘
user_query = SELECT ‘/vmail/%d/%n‘ as home, ‘maildir:/vmail/%d/%n/Maildir‘ as mail, 1000 AS uid, 1000 AS gid, concat(‘dirsize:storage=‘, quota) AS quota FROM mailbox WHERE username = ‘%u‘ AND active = ‘1‘
改文件权限
[root@mail ~]# chmod 600 /etc/dovecot/* -R
[root@mail ~]# chown vmail /etc/dovecot/* -R
[root@mail ~]# chomd 777 /var/run/dovecot/auth-master
打开PostfixAdmin管理界面 http://localhost/postfixadmin/setup.php 填写安装密码。  
复制产生出来的安装密码写入到主配置文件/postfixadmin/config.inc.php的$CONF[‘setup_password‘] =‘‘; 然后设置超级管理员和密码  
现在你就可以成功的登陆PostfixAdmin管理你的邮件帐户了。  
你登陆后就什么都会了
客户端测试全部通过,不再上图了。
RoundCube网页访问客户端
下载解压改名,放入网页引导路径。
下载
wget http://sourceforge.net/projects/roundcubemail/files/roundcubemail/1.0.3/roundcubemail-1.0.3.tar.gz/download
解压
tar -zxvf roundcubemail-1.0.3.tar.gz 
放入网页引导路径
cp roundcubemail-1.0.3 /var/www/html/ -R
改名
mv /var/www/html/roundcubemail-1.0.3 /var/www/html/usermail
Apache添加php模块
vim /etc/httpd/conf/httpd.conf 添加下面两行
  AddType application/x-httpd-php .php
  PHPIniDir "/etc/php.ini"
添加PHP模块时间区域
vim /etc/php.ini 添加下面一行
   date.timezone = Asia/Shanghai
修改权限
chmod 777 /var/www/html/usermail/temp
chmod 777 /var/www/html/usermail/logs
chmod 777 /var/www/html/usermail/config -R
chmod 777 /var/lib/php/session -R
配置CONFIG文件与postfixadmin连接同一个数据库。
启用CONFIG文件
cp /var/www/html/usermail/config/config.inc.php.sample  /var/www/html/usermail/config/config.inc.php
改写MYSQL数据查询与POSTFIXADMIN一样
vim /var/www/html/usermail/config/config.inc.php 修改下面一行。
  $config[‘db_dsnw‘] = ‘mysql://vmail:vmail@localhost/vmail‘;
  $config[‘enable_installer‘] = true;
安装PHP-DOM
yum install php53-dom
yum -y install php-dom
网页配置
 1: http://域名或IP/usermail/installer 打开IE,点击NEXT(下一步).
 2: Create config,设置你的配置文件,显示/服务器名/网络/数据库连接(与postfixadmin相同数据)..等等。自己揣摸。
 3: TEST CONFIG
  出现如下NOT OK.数据库没有初始化
    Check DB config
    DSN (write):  OK
    DB Schema:  NOT OK(Database not initialized)
 点击 Initialize Database, 初始化数据,它会返回结果OK.
    Check DB config
    DSN (write):  OK
    DB Schema:  OK
    DB Write:  OK
    DB Time:  OK 
  输入POSTFIXADMIN建的邮件地址测试SMTP和IMAP.会返回结果OK.
  
  完成了,http://域名或IP/usermail
文章来自 http://www.davis-wiki.com

本文出自 “永远的C” 博客,谢绝转载!

强大的邮件系统和简单的后台管理