メールボックスの利用率を警告するメールを送る


mbox形式の問題

Postfixでmbox(Mailbox)形式を選び、メール受信時にmailbox_size_limitで設定された上限を超過していると送信者にメールボックスが一杯で受信できない旨が返信されるが、メールアドレスの所有者には別の方法で連絡が行かない限り(あるいはメールが届かないことを不審に思わない限り)メールボックスが溢れてしまったことは分からない。
Maildir形式だとQuota設定をすれば使用率がわかるWebメーラなどもあるが、mbox形式だとそれも無い。

対策方法

おことわり

こんな誰でも気になるような問題に対する設定がPostfix本体、あるいは何らかの有名な解決手段があると確信しているのだが見つけられなかったのでこんな事をしているのです…

Postfixの仕様による制限

なお、今回対象のメールサーバは利用しているPostfixの制限によりmboxの容量制限(mailbox_size_limit)はユーザ(mbox)あたり2GBが上限になる。
容量制限の詳細についてはこちらに記載

メールボックスの利用率をチェックして閾値を超えていたらメールする

やってることは上記の通りで、以下のようなスクリプトをcronで定期的に実行することにした。
利用者にはこのメールが来たら何らかの対策をするよう事前に伝えておけばメールボックスが溢れる問題は無くなるだろう。
メールサブジェクトに不備がありMozilla Thunderbirdで文字化けするようなのでそのうち対策する。
あと使用率が1%未満の場合に.nと0が省略されるようなので気が向いたら対応する。

#!/bin/bash
# 警告メールを送信する閾値[%]
THRESHOLD=90

# postfixのmailbox_size_limitの値を取得
MBOXLIMIT=`/usr/sbin/postconf mailbox_size_limit | /bin/awk '{print $3}'`
if [ $MBOXLIMIT -eq '0' ]
  then
  # 0ならpostfixの最大値2Gをセット(本当は2G-1)
  MBOXLIMIT=2*1024*1024*1024-1
  MBOXLIMIT=`echo $MBOXLIMIT | /usr/bin/bc`
  MBOXLIMIT=`printf '%.0f' $MBOXLIMIT`
fi
# mailbox_size_limit * THRESHOLD[%]を計算
MBOXTHRESHOLD=`echo "$MBOXLIMIT * $THRESHOLD / 100" | /usr/bin/bc -l`
MBOXTHRESHOLD=`printf '%.0f' $MBOXTHRESHOLD`
# mboxのリストを取得
MBOXLIST=`/bin/ls -lB /var/mail/ | /usr/bin/tail -n+2`

IFS=$'\n'
for MBOX in $MBOXLIST
  do
  # リスト中の各mboxのサイズと使用率(##.#)を取得
  MBOXSIZE=`echo $MBOX | /bin/awk '{print $5}'`
  MBOXSIZE=`echo $MBOXSIZE | /bin/sed -e 's/[^0-9]//g'`
  MBOXLIMITPCT=`echo "scale=1; 100 * $MBOXSIZE / $MBOXLIMIT" | /usr/bin/bc`

  USERNAME=`echo $MBOX | /bin/awk '{print $9}'`
  # virtual mailboxを確認
  # コメントアウトしてある行を無視
  EMAILVIRTUAL=`cat /etc/postfix/virtual | /bin/grep -w $USERNAME | /bin/grep -v '^#' | /bin/awk '{print $1}'`

  if [ "$EMAILVIRTUAL" ]
  then
    # 複数のvirtual mailboxがある場合は最初のアドレスにメールを送る
    EMAILVIRTUAL=`echo $EMAILVIRTUAL | /bin/awk '{print $1}'`
    EMAILADDR=$EMAILVIRTUAL
  else
    # virtual mailboxが無い場合にはメールアドレスを設定。mydomain.comの部分を書き換えておく
    EMAILADDR=`echo $USERNAME`@mydomain.com
  fi

  # 必要があればここで現在の使用率を記録

  # 使用率チェック
  if [ "$MBOXSIZE" -ge $MBOXTHRESHOLD ]
    then

    # チェックに引っかかったら警告メールを送信
    MSG="<適当なメッセージをいれる>"
    echo -e $MSG | /usr/bin/iconv -f UTF-8 -t iso-2022-jp | /bin/mail -s `echo "<警告用のサブジェクト>" | /usr/bin/iconv -f UTF-8 -t iso-2022-jp`  `echo $EMAILADDR`
  fi
done