メール使用量を監視する

以前も書いたとおり、弊社のメールはさくらインターネットを利用している。で、スパムメールが溜まりすぎて割り当て容量を超えたユーザーからメール受信できないという打ち上げがあったので、直接サーバーに入ってスパムメールを削除するスクリプトを書いた。

しばらくするとそんなことはすっかり忘れるもので、その後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%を超えたユーザーだけ抽出してみた。

83.01% ******** 73.44% ********* 80.47% ************ 78.13% ******** 82.42% ****** 80.86% ****** 85.16% ******* 76.37% *******
Code language: Shell Session (shell)

実際には上限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でまとめてしまえって感じだけど、当初は使用率計算とか想定してなかったからね。次の機能追加のときやろう。

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments