DovecotのQuotaをSQLで個別に設定
- 2023/01/06
- aikawa
前回の投稿 にクォータを加えて、個人別に容量を制限出来るようにしてみます。
※使用したDovecotのバージョンは2.3.16でした。2.2.19以降であれば恐らく設定をそのまま使えると思います。
まずは、全員共通の設定が出来るようにします。
Dovecot設定
- /etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins quota- /etc/dovecot/conf.d/20-imap.conf
protocol imap{
mail_plugins = $mail_plugins imap_quota
# ...
}- /etc/dovecot/conf.d/90-quota.conf
plugin {
quota_rule = *:storage=100M
# res postfix
quota_status_success = DUNNO
quota_status_nouser = DUNNO
quota_status_overquota = "552 5.2.2 Mailbox is full"
}
# ...
# backend
plugin{
quota_vsizes = yes
quota = count:User quota
}
# for postfix
service quota-status {
executable = quota-status -p postfix
inet_listener {
port = 12340
# You can choose any port you want
}
client_limit = 1
}quota_status_*とservice quota-statusはPostfix用の設定で、Dovecot 2.2からはPostfix用ポリシーサービスを使えるようになり、PostfixはDovecotにquotaのお伺いを立てるだけで良いようです。
https://blog.sys4.de/postfix-dovecot-mailbox-quota-en.html
バックエンドには2.2.19からcountが追加され、新規インストールにはcountを使う事を推奨しているようですのでcountを使います。
https://doc.dovecot.org/configuration_manual/quota_plugin/
Postfix設定
- /etc/postfix/main.cf
smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:12340これでPostfixは送信前にDovecotへお伺いを立てるようになります。
ここまでの設定で、全員が100MBの容量制限を設定されました。
DovecotとPostfixをリロードしてRoundCubeで見ると、確かに100MBの制限が入っています。

次は個人ごとの設定です。
PostgreSQL
psqlコマンドラインでクォータ用カラムを追加します。
取り合えず細かい容量設定は必要無いのでquota_mbとして、MB単位での入力にしておきます。
ALTER TABLE mail_users ADD quota_mb integer DEFAULT 100;
DROP VIEW user_view;
CREATE VIEW user_view AS SELECT *,
name||'@'||domain AS mail,
'/var/mail/vhosts/'||domain||'/'||name AS dovecot_home,
domain||'/'||name||'/Maildir/' AS maildir,
'*:storage='||quota_mb||'M' AS quota_rule
FROM mail_users;user_viewにquota_ruleを追加する事で、前回のdovecot-sql.conf.extならquota_ruleを個別に適用してくれます。
Dovecotをリロードしてquota_mbの値を10にUPDATEしてみると、RoundCubeも10MBに更新されています(UPDATEするたびに値が変わるので、結構楽しいです)。

doveadm userでも10MBになっている事が確認出来ます。
ここで自分宛に送って10MB容量いっぱいにしてから送信をすると、送信時にエラーメッセージが表示され、送信出来ない事が確認出来ました。

これで全体の100MBでなく、ちゃんと個別の10MBで制限されている事が確認出来ました。