以前も書いたとおり、弊社のメールはさくらインターネットを利用している。で、スパムメールが溜まりすぎて割り当て容量を超えたユーザーからメール受信できないという打ち上げがあったので、直接サーバーに入ってスパムメールを削除するスクリプトを書いた。
しばらくするとそんなことはすっかり忘れるもので、その後2回ほどそれぞれ別のユーザーからメール受信できないという打ち上げがあった。
もう忘れちゃってるからカスタマーセンターに問い合わせたら「容量超過のエラーです」との回答を得た。これは間抜けだ。
メールの使用率を求めてみる
前回のスパムメール容量集計の応用で、~/MalBox/ユーザー名/maildirディレクトリ内の容量が100MB以上のユーザーを集計してみた。
$ du -sh /home/directory/MailBox/*/maildir/ | cut -d '/' -f 1,5 | grep -e '[1-9][0-9][0-9]M'
125M /*********
427M /********
119M /*****
369M /*********
101M /****
130M /********
317M /*********
515M /************
207M /*********
403M /********
232M /******
674M /*****
111M /************
423M /******
790M /******
332M /***********
436M /*******
525M /*******
428M /*******
299M /**********
391M /*******
549M /*********
597M /********
Code language: Shell Session (shell)
今のところ使用量上限は512MBのユーザーと1GBのユーザーがいるので、これだと自分の上限を把握していないユーザーは上限近いのかどうかがわからないね。使用率を計算するのが良さそうだ。
とはいえシェルスクリプトで計算するのは大変なので、ここはお手軽にphpにバトンタッチ。100MB以上でフィルタを掛けたリストのユーザー別に使用率を計算して、さらに70%を超えたユーザーだけ抽出してみた。
Code language: Shell Session (shell)83.01% ******** 73.44% ********* 80.47% ************ 78.13% ******** 82.42% ****** 80.86% ****** 85.16% ******* 76.37% *******
実際には上限1GBを超えるユーザーもいるのだけれど、これは役員だから一旦除外。
Chatworkで通知する
容量の多いユーザーにいちいち注意喚起するのもダルいので、計算したリストはチャットで公表するのがいいね。弊社はChatworkを使っているので、ここに自動投稿することにする。
ChatworkにはAPIがあるので、集計結果を自動投稿させればよいのだ。最近Chatwork APIのドキュメントが見やすくなって、実際の値を設定するとコードが自動生成されるようになり便利になった。
こんな感じで通知される。ボット名は「おしらせくん™」。メッセージを柔らかい感じにして、「とっとと整理しやがれ!」感を消してみた。

さすがに毎日だとウザいので、毎週月曜の早朝にcronを走らせている。
# NAME: メール使用量チェッカー
3 5 * * 1 /home/directory/script/chkmail.sh
Code language: PHP (php)
こんなコードだよ
参考までにコードを置いておきます。
まずはシェルスクリプト。ROOMIDとTOKENはそれぞれ設定してね。
#! /bin/sh
ROOMID=*****
TOKEN=********************************
CHKMAIL=`mktemp`
MESSAGE=`mktemp`
du -sh /home/directory/MailBox/*/maildir/ | cut -d '/' -f 1,5 | grep -e '[1-9][0-9][0-9]M' | tr -d '\t' > $CHKMAIL
php /home/directory/script/chkmail.php $CHKMAIL > $MESSAGE
echo "[hr]" >> $MESSAGE
date >> $MESSAGE
echo "[/info]" >> $MESSAGE
curl --request POST --url https://api.chatwork.com/v2/rooms/${ROOMID}/messages --header "accept: application/json" --header "content-type: application/x-www-form-urlencoded" --header "x-chatworktoken: ${TOKEN}" --data self_unread=0 --data body="`cat $MESSAGE`"
Code language: Bash (bash)
続いてphp。エラー処理とか端折ってる。まあ動けばいいよねって感じ。
<?php
$limit = 70;
echo "[info][title]おしらせくん™がメール使用量" . $limit . "%以上をお知らせします♪[/title]";
$record = explode("\n", file_get_contents($argv[1]));
foreach ($record as $value){
if ($value === ""){exit;}
$field = explode('/', $value);
$name = $field[1];
if ($name === "user1" || $name === "user2" || $name === "user3"){
$vol = 1024;
}else{
$vol = 512;
}
$num = round((int)$field[0] * 100 / $vol, 2);
if ($num > (float)$limit){echo $num . "%\t" . $name . "\n";}
}
Code language: PHP (php)
今になって思えばphpでまとめてしまえって感じだけど、当初は使用率計算とか想定してなかったからね。次の機能追加のときやろう。