B3S
menu close

サーバー関連

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に下記の記述を追記

dict {
  quota = mysql:/etc/dovecot/dovecot-dict-quota.conf
}



・/etc/dovecot/dovecot-dict-quota.confを作成

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に下記の記述を追記

mail_plugins = quota



・/etc/dovecot/conf.d/20-imap.confに下記の記述を追記

protocol imap {
  mail_plugins = quota imap_quota
}



・/etc/dovecot/conf.d/20-pop3.confに下記の記述を追記

protocol pop3 {
  mail_plugins = quota
}



・/etc/dovecot/conf.d/90-quota.confに下記の記述を追記

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で下記の値へ変更

$CONF['quota'] = 'YES';
$CONF['domain_quota'] = 'YES';
$CONF['quota_multiplier'] = '1024000';

設定3:quota2のテーブルを更新ファイル作成(シェルスクリプト作成)

・update_quota2.shを作成

#!/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の方法を使用しています。

強引な方法なので公式に別の方法があれば知りたいです。