目前
在Linux/Unix平台上
Sendmail因成為缺省安裝的郵件服務器而得到非常廣泛的應用
但是Sendmail本身並不具有限定用戶郵箱大小的功能
所以
如果某些用戶長時間不取信或設定了保留郵件副本
其信件將在服務器上不斷堆積
以致郵箱越來越大
占用大量的硬盤空間
很多網絡管理員對此都很有意見
這裡介紹一種簡單實用的方法
通過它
我們可以很方便靈活地對用戶郵箱的大小進行設定
一
基本思路
先設定一個用戶郵箱大小的門限值;然後定期啟動一個進程
檢查每一個用戶郵箱文件的大小
將所有超過這一限值的郵箱文件名臨時寫進某一特定的文件中; 再讀取該文件
將它寫進Sendmail 的黑名單(blacklist_recipients) 中
從而使郵件服務器拒收該用戶的新郵件
直到下次檢查時該郵箱大小已小於設定的門限值為止
二
運行環境
我們以Solaris
操作系統為例進行說明
其他Unix(或Linux)系統可參照來做
本文以Sendmail
為例
若無該版本的Sendmail運行軟件
可到或 站點下載
三
具體操作
. 下載編譯
在Sendmail軟件包已下載到當前目錄後即可進行編譯
操作步驟如下
$ gzip
dc sendmail
tar
gz | tar
xf
(Gzip 是一個壓縮/解壓縮的工具
相當於 Windows平台上的WinZip
在網上能很容易地找到並下載)
$ cd sendmail
/sendmail
$
/Build
(編譯Sendmail )
. 安裝
#
/Build install
(用超級用戶身份安裝)
. 生成配置文件
# cd
/cf/domain
# vi generic
m
此時
在文件的末尾增加如下兩行內容
FEATURE(
access_db
dbm /etc/mail/access
)dnl
FEATURE(
blacklist_ recipients
)dnl
然後
我們可以按著輸入以下內容
# cd
/cf
# m
/m
/cf
m
/generic
solaris
mc >
/sendmail
cf
# cp
/sendmail
cf /etc/mail/
.生成 access 文件及郵件服務器名稱的參數文件
# cd /etc/mail
# makemap dbm access < /dev/null
# vi local
host
names
(該文件是一個文本文件
內容為本地郵件服務器的域名和別名
它們之間要用回車分隔
詳見Readme文件的有關介紹)
. 啟動Sendmail
# /usr/lib/sendmail
bd
q
m
. 編緝限制郵箱大小的程序
用sh命令編緝一個限制郵箱大小的程序
然後用操作系統的定時執行功能crontab設定其執行的頻率
內容如下
# vi /etc/mail/limit_mailbox
sh
(內容見附錄)
# chmod u+x /etc/mail/limit_mailbox
sh
# crontab
e
接著
我們可以輸入以下內容
* * * /etc/mail/limit_mailbox
sh
它表示在每天
:
~
:
間
每隔
小時啟動一次
檢查郵箱大小的sh命令
用戶也可根據實際情況進行調整
表示郵箱大小的門限值為
MB
四
附錄limit_mailbox
sh 源代碼
#!/usr/bin/ksh
# search the mailbox larger than MAXSIZE
then set this mailbox full and reject new mails
error() {
echo
$
exit
}
BIN=/usr/bin
MAIL=/etc/mail
#Sendmail 參數文件所在的目錄
MAILDIR=/var/mail
#存放郵箱文件的目錄
ACCESS=access
db
#用於臨時存放超過門限值的郵箱名
SUBACCESS=access
sub
#用於存放額外的收
轉發限制規則
if [ $#
lt
]; then
error
Must set the MAX mailbox size with the command!
fi
if [ $
le
] ; 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
To:$mailuser@
ERROR:
$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
From:http://tw.wingwit.com/Article/program/Oracle/201311/18192.html