サーバー関連
PostfixAdminで使用容量(quota)表示機能を利用する(POP対応)
ヤス
更新日:2021/08/10
最近は調べても情報がないことが多く、自作して対応することがあります。
動作環境
OS:ubuntu-14.04
MDA:dovecot-2.2.9
PostfixAdmin:postfixadmin-2.9.3
PostfixAdminの使用容量(quota)表示機能がPOPで利用できない
PostfixAdminのMaildirの使用容量表示機能ですが、公式に書いてある通りにdovecotで機能を実装してもPOPではうまく機能しませんでした。
quota2のテーブルを利用しているですが、メールを受信した場合にデータの更新がされずPostfixAdmin容量制限の値が更新されません。
POPで外部からメールを取得すると、データの更新が更新されるため容量制限の値がマイナスになってしまっていました。
dovecotでメールの受信時にデータを更新する方法がわからなかったため、Maildirの設定されているディレクトリの受信メールのあるディレクトリを解析しに行き、quota2のテーブルを更新する機能を自作しました。
設定1:dovecotの設定(quota利用)
・/etc/dovecot/dovecot.confに下記の記述を追記
1 2 3 |
dict { quota = mysql:/etc/dovecot/dovecot-dict-quota.conf } |
・/etc/dovecot/dovecot-dict-quota.confを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 |
connect = host=localhost dbname=DB名 user=ユーザー名 password=パスワード map { pattern = priv/quota/storage table = quota2 username_field = username value_field = bytes } map { pattern = priv/quota/messages table = quota2 username_field = username value_field = messages } |
・/etc/dovecot/conf.d/10-mail.confに下記の記述を追記
1 |
mail_plugins = quota |
・/etc/dovecot/conf.d/20-imap.confに下記の記述を追記
1 2 3 |
protocol imap { mail_plugins = quota imap_quota } |
・/etc/dovecot/conf.d/20-pop3.confに下記の記述を追記
1 2 3 |
protocol pop3 { mail_plugins = quota } |
・/etc/dovecot/conf.d/90-quota.confに下記の記述を追記
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
plugin { quota_rule = *:storage=1G:messages=100M quota_rule2 = Trash:storage=+100M } plugin { quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=80%% quota-warning 80 %u } plugin { quota = maildir:User quota } plugin { quota2 = dict:User quota::proxy::quota } dict { quota = mysql:/etc/dovecot/dovecot-dict-quota.conf } |
設定2:PostfixAdminの設定(quota利用)
・config.inc.phpで下記の値へ変更
1 2 3 |
$CONF['quota'] = 'YES'; $CONF['domain_quota'] = 'YES'; $CONF['quota_multiplier'] = '1024000'; |
設定3:quota2のテーブルを更新ファイル作成(シェルスクリプト作成)
・update_quota2.shを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/bin/sh #--config start-- MailDir=MailDirの設定ディレクトリ(postfixのmain.cf参照) WorkDir=作業ディレクトリ #--config end-- # メールアドレス別にメールの数を容量を取得 find ${MailDir} -type d -name new | awk '{printf("echo %s | cut -d \"/\" -f5 | tr \"\n\" \"@\" && echo %s |cut -d \"/\" -f4 | tr \"\n\" \" \" && echo `du -sb %s | cut -f1 | tr \"\n\" \" \" && ls -dl %s | cut -d \" \" -f5` | awk %c{dir_size = $1 - $2}{print dir_size}%c | tr \"\n\" \" \" && ls -F %s | grep -v / | wc -l \n",$0,$0,$0,$0,39,39,$0) }' | sh > ${WorkDir}maildirsize.csv # csvインポート用のSQL文を作成 echo "DELETE FROM quota2;" > ${WorkDir}maildirsize.sql echo "load data local infile '${WorkDir}maildirsize.csv' into table quota2 fields terminated by ' ';" >> ${WorkDir}maildirsize.sql # データのインポート mysql -u ユーザー名 -pパスワード DB名 < ${WorkDir}maildirsize.sql # 処理用ファイルの削除 rm ${WorkDir}maildirsize.csv rm ${WorkDir}maildirsize.sql |
あとがき
設定3で作成したファイルをcron等で定期的に実行すると、正しいデータ容量がPostfixAdminで確認可能です。(MailDirの設定ディレクトリへ権限のあるユーザーで実行してください)
上記設定3の方法以外にも各メールアドレスのmaildirsizeというファイルを解析しても容量の取得が可能ですが、データが一致しない場合があったので設定3の方法を使用しています。
強引な方法なので公式に別の方法があれば知りたいです。