|
发表于 2005-10-25 17:38:48
|
显示全部楼层
转载(虽然是SO2.7的,但是可以参考一下)
在sendmail中实现邮箱大小设置
在Linux/Unix平台上,Sendmail邮件服务器得到广泛应用。但是Sendmail本身并不具有限定用户邮箱大小的功能。如果用户长时间不取信或设定了保留邮件副本,其信件将在服务器上不断堆积,以致邮箱越来越大,占用大量的硬盘空间。当然,我们是可以很方便灵活地对用户邮箱的大小进行设定的。
如果我们可以设定一个用户邮箱大小的门限值,然后定期启动一个进程,检查每一个用户邮箱文件的大小,将所有超过这一限值的邮箱文件名临时写进某一特定的文件中,再读取该文件,将它写进Sendmail 的黑名单(blacklist_recipients) 中,从而使邮件服务器拒收该用户的新邮件,直到下次检查时该邮箱大小已小于设定的门限值为止。
以Solaris 2.7/Sendmail 8.11.3为例进行说明,其他系统可参照来做。
在Sendmail软件包已下载到当前目录后即可进行编译,操作步骤如下。
$ gzip -dc sendmail.8.11.3.tar.gz | tar -xf –
$ cd sendmail-8.11.3/sendmail
$ ./Build(编译Sendmail )
用超级用户身份安装并生成配置文件:
# ./Build install()
# cd ../cf/domain
# vi generic.m4
此时,在文件的末尾增加如下两行内容:
FEATURE('access_db','dbm /etc/mail/access')dnl
FEATURE('blacklist_ recipients')dnl
然后,我们可以按着输入以下内容:
# cd ../cf
# m4 ../m4/cf.m4 ./generic-solaris2.mc > ./sendmail.cf
# cp ./sendmail.cf /etc/mail/
生成 access 文件及邮件服务器名称的参数文件:
# cd /etc/mail
# makemap dbm access < /dev/null
# vi local-host-names
现在启动Sendmail:
# /usr/lib/sendmail -bd -q30m
编缉限制邮箱大小的程序要用sh命令编缉一个限制邮箱大小的程序,然后用操作系统的定时
执行功能crontab设定其执行的频率。
# vi /etc/mail/limit_mailbox.sh
# chmod u+x /etc/mail/limit_mailbox.sh
# crontab –e
接着,我们可以输入以下内容。
0 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 * * * /etc/mail/
limit_mailbox.sh 10
它表示在每天6:00~20:00间,每隔1小时启动一次,检查邮箱大小的sh命令。用户也可根据
实际情况进行调整。“10”表示邮箱大小的门限值为10MB。
limit_mailbox.sh 源代码如下:
#!/usr/bin/ksh
# search the mailbox larger than MAXSIZE , then set this mailbox full and
reject new mails
error() {
echo " $1 "
exit 1
}
BIN=/usr/bin
MAIL=/etc/mail
#Sendmail 参数文件所在的目录
MAILDIR=/var/mail
#存放邮箱文件的目录
ACCESS=access.db
#用于临时存放超过门限值的邮箱名
SUBACCESS=access.sub
#用于存放额外的收、转发限制规则
if [ $# -lt 1 ]; then
error "Must set the MAX mailbox size with the command!"
fi
if [ $1 -le 0 ] ; then
error " Mailbox Size < 0, Failed"
fi
((MAXSIZE=$1*1024*1024))
if [ -f $MAIL/$SUBACCESS ]; then
$BIN/cat $MAIL/$SUBACCESS > $MAIL/$ACCESS ' '
error "piping $MAIL/$SUBACCESS into $MAIL/$ACCESS, Failed"
else
> $MAIL/$ACCESS' 'error "clearing $MAIL/$ACCESS, Failed"
fi
cd $MAILDIR' 'error "entering $MAILDIR Failed"
for box in '$BIN/find .
! -user root -size +"$MAXSIZE"c -type f -print'; do
case $box in
.|..|./.*.pop)
;;
*)
mailuser=${box#./}
echo "Tomailuser@
ERROR:550 $mailuser's Mailbox is full " >> $MAIL/$ACCESS
;;
esac
done
cd $MAIL || error " entering $MAIL Failed"
/usr/sbin/makemap dbm access
< ./$ACCESS || error "makemaping access Failed"
exit 0' |
|