目前在Linux/Unix平台上Sendmail因成为缺省安装的邮件服务器而得到非常广泛的应用但是Sendmail本身并不具有限定用户邮箱大小的功能所以如果某些用户长时间不取信或设定了保留邮件副本其信件将在服务器上不断堆积以致邮箱越来越大占用大量的硬盘空间很多网络管理员对此都很有意见这里介绍一种简单实用的方法通过它我们可以很方便灵活地对用户邮箱的大小进行设定 一 基本思路 先设定一个用户邮箱大小的门限值;然后定期启动一个进程检查每一个用户邮箱文件的大小将所有超过这一限值的邮箱文件名临时写进某一特定的文件中; 再读取该文件将它写进Sendmail 的黑名单(blacklist_recipients) 中从而使邮件服务器拒收该用户的新邮件直到下次检查时该邮箱大小已小于设定的门限值为止 二运行环境 我们以Solaris 操作系统为例进行说明其他Unix(或Linux)系统可参照来做 本文以Sendmail 为例若无该版本的Sendmail运行软件可到或 站点下载 三具体操作 . 下载编译 在Sendmail软件包已下载到当前目录后即可进行编译操作步骤如下 $ gzip dc sendmailtargz | tar xf (Gzip 是一个压缩/解压缩的工具相当于 Windows平台上的WinZip在网上能很容易地找到并下载) $ cd sendmail/sendmail $ /Build (编译Sendmail ) . 安装 # /Build install (用超级用户身份安装) . 生成配置文件 # cd /cf/domain # vi genericm 此时在文件的末尾增加如下两行内容 FEATURE(access_dbdbm /etc/mail/access)dnl FEATURE(blacklist_ recipients)dnl 然后我们可以按着输入以下内容 # cd /cf # m /m/cfm /genericsolarismc > /sendmailcf # cp /sendmailcf /etc/mail/ .生成 access 文件及邮件服务器名称的参数文件 # cd /etc/mail # makemap dbm access < /dev/null # vi localhostnames (该文件是一个文本文件内容为本地邮件服务器的域名和别名它们之间要用回车分隔详见Readme文件的有关介绍) . 启动Sendmail # /usr/lib/sendmail bd qm . 编缉限制邮箱大小的程序 用sh命令编缉一个限制邮箱大小的程序然后用操作系统的定时执行功能crontab设定其执行的频率内容如下 # vi /etc/mail/limit_mailboxsh (内容见附录) # chmod u+x /etc/mail/limit_mailboxsh # crontab e 接着我们可以输入以下内容 * * * /etc/mail/limit_mailboxsh 它表示在每天:~:间每隔小时启动一次检查邮箱大小的sh命令用户也可根据实际情况进行调整表示邮箱大小的门限值为MB 四附录limit_mailboxsh 源代码 #!/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=accessdb #用于临时存放超过门限值的邮箱名 SUBACCESS=accesssub #用于存放额外的收转发限制规则 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 +$MAXSIZEc type f print; do case $box in ||/*pop) ;; *) mailuser=${box#/} echo To:$mailuser@ ERROR: $mailusers Mailbox is full >> $MAIL/$ACCESS ;; esac done cd $MAIL || error entering $MAIL Failed /usr/sbin/makemap dbm access < /$ACCESS || error makemaping access Failed exit |