LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1381|回复: 3

请教关于对现有的用户邮箱大小配额问题

[复制链接]
发表于 2005-10-25 12:50:18 | 显示全部楼层 |阅读模式
我的系统是solaris9.安装了sendmail,运行都很正常。但以前没有对sendmail用户进行限制邮箱大小,造成现在磁盘空间危机。现在想对这些邮箱用户进行限制使用空间大小,通过查资料得知sendmail没有这个功能,只能通过对用户(或者组)做磁盘配额。但我的服务器但邮件存放的目录是/var/mail,而这个分区不是独立的,是在/下。具体的分区表如下,这样的如何对邮件用户存储进行磁盘配额呢?
#device         device          mount           FS      fsck    mount   mount
#to mount       to fsck         point           type    pass    at boot options
#
fd      -       /dev/fd fd      -       no      -
/proc   -       /proc   proc    -       no      -
/dev/dsk/c0t0d0s1       -       -       swap    -       no      -
/dev/dsk/c0t0d0s0       /dev/rdsk/c0t0d0s0      /       ufs     1       no
-
/dev/dsk/c0t0d0s3       /dev/rdsk/c0t0d0s3      /var    ufs     1       no
-
/dev/dsk/c0t0d0s7       /dev/rdsk/c0t0d0s7      /export/home    ufs     2
yes     -
swap    -       /tmp    tmpfs   -       yes     -
发表于 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'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-26 02:45:52 | 显示全部楼层
我之前用这方式,有错误!不知哪个哥们测试成功,不过我现在已经换用磁盘配额了。
回复 支持 反对

使用道具 举报

发表于 2005-10-26 10:04:33 | 显示全部楼层
不好意思,我没有弄过,不知道有错。
但是你是只想解决磁盘危机的话我觉得还是比较好办,你可以考虑对整个邮件目录限制大小而不是对每一个用户的邮箱都限制大小。我的想法是这样的:先把/var/mail下的东西做一个备份,然后删除/var/mail目录下的所有东西,接下来用mkfile 命令创建一个指定大小的文件(具体多大你自己看着办),然后用lofiadm命令将这个文件模拟为一个设备,再用newfs命令在这个模拟的设备上创建一个UFS文件系统,再把它挂载道/var/mail目录上,最后把先前备份的/var/mai下的所有东西全部恢复回去。这样就OK了,不过就是不能对每一个用户的邮箱限制大小,但却能解决你的磁盘危机。(纯理论,没有实践过)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表