Postfix、Dovecot、メールボックス容量制限 [quota]

メールボックスの容量制限を行う場合、ネットを検索すると、postfixにパッチをあてる。
という方法をよく見ますが、パッチ自体、だいぶ前から更新されていなく・・・

最近では、Dovecotで、Quotaプラグインを使う方法が無難な感じのようです。

Quota設定のメモ書きです。

・新しくテーブルを作る必要はないです
・容量を計算するプログラムを用意する必要はないです

・PostfixAdminと、きちんと連携します。
・容量オーバーの場合、エラーで返ります。
・Thunderbird上で、利用率が表示されます(imap時)

前提作業

Postfix 3.6 ソースインストール CentOS Stream8
Postfix 3.6、マルチドメン版をソースからインストールします。 Postfix 3.4 + CentOS7版は、上記から CentOS Stream8 CentOS9の中止、CentOS8のサポート短縮など、Cen...
Dovecot-2.3.14 [CentOS Stream 8] 基本設定
上記の作業の次、POP系のソフト、Dovecot-2.3.14のインストールメモ書きです。 CentOS7版は、上記。 今回も、Conoha VPSで、行いました。 dovecot 用 ユーザ/...
Postfix 3.6,Dovecot 2.3 SSL送受信 [CentOS Stream 8]
Postfixにて、SSL送信 Dovecotにて、SSL受信 を行う設定です。 ↑Postfix3.4 CentOS7版 今回も、Conoha VPSで、行いました。 Let's Encrypt ...

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」というテーブルに格納されます。

 

 

タイトルとURLをコピーしました