メールボックスの容量制限を行う場合、ネットを検索すると、postfixにパッチをあてる。
という方法をよく見ますが、パッチ自体、だいぶ前から更新されていなく・・・
最近では、Dovecotで、Quotaプラグインを使う方法が無難な感じのようです。
Quota設定のメモ書きです。
・新しくテーブルを作る必要はないです
・容量を計算するプログラムを用意する必要はないです
・PostfixAdminと、きちんと連携します。
・容量オーバーの場合、エラーで返ります。
・Thunderbird上で、利用率が表示されます(imap時)
前提作業
CentOS Stream 8
Postfix 3.6.0
dovecot-2.3.14
で検証しました。
Dovecot quota 容量計算方法
Dovecotがメールの容量を計算する方法はいくつかあります。
・count
・dict
・dirsize
・fs
・imapc
・maildir
この中で、最新は、「count」で、Version 2.2.19から搭載されています。インデックスファイルにデータを保存します。
「dict」は、今回試した方法で、MySQLなどに、利用状況を書き込みます。
dovecotとしては、最新の「count」をお勧めしていますね・・・
Dovecot設定
# vi /etc/dovecot/local.conf dict { quotadict = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext } service dict { unix_listener dict { group = vuser user = vuser mode = 0660 } user = root } service quota-warning { executable = script /usr/local/bin/quota-warning.sh user = vuser unix_listener quota-warning { group = vuser user = vuser mode = 0660 } } service quota2-warning { executable = script /usr/local/bin/quota2-warning.sh user = vuser unix_listener quota2-warning { group = vuser user = vuser mode = 0660 } } service stats { unix_listener stats-reader { user = vuser group = vuser mode = 0660 } unix_listener stats-writer { user = vuser group = vuser mode = 0660 } } auth_verbose = yes auth_debug = yes
↑「/etc/dovecot/dovecot.conf」と同じディレクトリに、「local.conf」を作成して、そこに、独自の設定を書き込みます。
自動的に読み込まれます。
最後の2行はデバック用です。なにか、意図しない動きをしたときには、この2行を有効にするといいでしょう。
# vi /etc/dovecot/dovecot-dict-sql.conf.ext connect = host=localhost dbname=(DB名) user=(DB用ユーザ) password=(DB用パスワード) 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 }
↑新規に作成をします。
# vi /etc/dovecot/conf.d/10-master.conf # Postfix smtp-auth #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #} ↓ # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix }
# vi /etc/dovecot/conf.d/15-lda.conf #postmaster_address = ↓ postmaster_address = (メールアドレス)
↑dovecotが、エラーを送信するときのメールアドレス(任意)
設定しなければ、「postmaster@利用ドメイン」から、返事されます。
# vi /etc/dovecot/conf.d/10-mail.conf #mail_uid = #mail_gid = ↓ mail_uid = 10000 mail_gid = 10000
↑ メールディレクトリのユーザID/グループIDを指定します。
# vi /etc/dovecot/conf.d/10-mail.conf #mail_plugins = ↓ mail_plugins = $mail_plugins quota
# vi /etc/dovecot/conf.d/dovecot-sql.conf.ext user_query = SELECT concat('/mail/', maildir) AS home, 10000 AS uid, 10000 AS gid FROM mailbox WHERE username = '%u' AND active = '1' ↓ user_query = SELECT concat('/mail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule, CONCAT('*:bytes=', domain.quota*1024000) AS quota2_rule FROM mailbox,domain WHERE username = '%u' AND mailbox.active = '1' AND domain.domain = '%d'
↑「user_query」を変更します。「10000」は、設定済みのIDにあわせます。
# vi /etc/dovecot/conf.d/90-quota.conf plugin { quota = dict:User quota::proxy::quotadict quota2 = dict:domain quota:%d:proxy::quotadict quota_warning = storage=100%% quota-warning +100 %u quota_warning2 = storage=95%% quota-warning +95 %u quota_warning3 = -storage=50%% quota-warning -50 %u quota2_warning = storage=100%% quota2-warning +100 %u quota2_warning2 = storage=95%% quota2-warning +95 %u quota2_warning3 = -storage=50%% quota2-warning -50 %u }
↑ 上記を追加します。
「quota」は、各メールアドレス毎の設定。
「quota2」は、ドメイン毎の設定。
後半6行は、メールボックスが規定の数字よりオーバーしたときに、メールを送る設定。
最初の3行が、メールアドレス毎の設定
後半の3行が、ドメイン毎の設定。
# vi /usr/local/bin/quota-warning.sh #!/bin/sh BOUNDARY="$1" USER="$2" MSG1="" MSG2="" if [[ "$BOUNDARY" = "+100" ]]; then MSG1="Your mailbox on the server is now more than 100% full." MSG2="So that you can continue to receive mail,you need to remove some messages from your mailbox." elif [[ "$BOUNDARY" = "+95" ]]; then MSG1="Your mailbox on the server is now more than 95% full." MSG2="So that you can continue to receive mail,you need to remove some messages from your mailbox." elif [[ "$BOUNDARY" = "-50" ]]; then MSG1="Your mailbox is now back to normal." MSG2="" fi cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing" From: postmaster@(ドメイン) Subject: Email mailbox Quota Warning Dear User $MSG1 $MSG2 Best regards EOF
# vi /usr/local/bin/quota2-warning.sh #!/bin/sh BOUNDARY="$1" USER="$2" MSG1="" MSG2="" if [[ "$BOUNDARY" = "+100" ]]; then MSG1="Your domain's mailbox on the server is now more than 100% full." MSG2="So that you can continue to receive mail,you need to remove some messages from your mailbox." elif [[ "$BOUNDARY" = "+95" ]]; then MSG1="Your domain's mailbox on the server is now more than 95% full." MSG2="So that you can continue to receive mail,you need to remove some messages from your mailbox." elif [[ "$BOUNDARY" = "-50" ]]; then MSG1="Your domain's mailbox is now back to normal." MSG2="" fi cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing" From: postmaster@(ドメイン) Subject: Email mailbox (domain) Quota Warning Dear User $MSG1 $MSG2 Best regards EOF
↑メールのフォーマット。「(ドメイン)」は適宜変更をしてください。
このメールは、メール受信者(容量制限をしている方)に行くメールです。
↑もし、容量オーバーの場合、送信者には、上記のようなメールが返ってきます。
# chmod 755 /usr/local/bin/quota-warning.sh # chmod 755 /usr/local/bin/quota2-warning.sh
↑スクリプトのパーミッションを変更しておきます。
# vi /etc/dovecot/conf.d/20-imap.conf #mail_plugins = $mail_plugins ↓ mail_plugins = $mail_plugins imap_quota
↑ この設定をすると、Thunderbird上で、使用量が出てきます。
↑ Thunderbirdの右下に出てきます。クリックすると
↑ というように、使用率が表示されます。
Postfix
# vi /etc/postfix/main.cf virtual_transport = virtual ↓ virtual_transport = dovecot
# vi /etc/postfix/master.cf dovecot unix - n n - - pipe flags=DRhu user=vuser:vuser argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
↑ 上記の行を加えます
PostfixAdmin
↑ ドメインでの容量制限。
上記は、「ドメインクォータ」というところが、ドメイン全体の容量制限。
上記の例では、20Mとなっている。
左横の「容量制限」は、各メールアドレスの最大容量。メールアドレスを作成する場合、この数字(10M)以上の容量には、設定ができない。
↑ 各メールアドレスの容量制限
doveadmで、利用量チェック
「doveadm」コマンドで、どれだけ、利用しているかをチェックできます。
# doveadm quota get -u メールアドレス1 Quota name Type Value Limit % User quota STORAGE 0 - 0 User quota MESSAGE 0 - 0 domain quota STORAGE 1540 20000 7 domain quota MESSAGE 19 - 0
↑ドメインの制限、200Mで、1.5M(7%)を利用中
メールアドレスの制限はなし。
# doveadm quota get -u メールアドレス2 Quota name Type Value Limit % User quota STORAGE 10 5000 0 User quota MESSAGE 9 - 0 domain quota STORAGE 1540 20000 7 domain quota MESSAGE 19 - 0
↑ドメインの制限、200Mで、1.5M(7%)を利用中
メールアドレスの制限は、5M。
DB上での情報
mysql> select * from quota2; +----------------+---------+----------+ | username | bytes | messages | +----------------+---------+----------+ | info3@(domain) | 1569463 | 12 | | info4@(domain) | 0 | 0 | | info5@(domain) | 1533 | 2 | | info@(domain) | 9784 | 9 | | (domain) | 1576450 | 19 | +----------------+---------+----------+ 5 rows in set (0.00 sec)
↑ 各メールアドレス、及び、ドメイン全体の容量は自動的に計算されて、「quota2」というテーブルに格納されます。