aikawa

DovecotのQuotaをSQLで個別に設定

前回の投稿 にクォータを加えて、個人別に容量を制限出来るようにしてみます。






※使用した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で制限されている事が確認出来ました。