Dovecot

如果超出配額,不會重新計算 Dovecot 配額,也不會拒絕郵件

  • February 12, 2019

我正在嘗試在 Dovecot 設置配額。目前 Postfix 在 Debian Jessie 上與 Dovecot 和 postfixadmin 一起執行。

我遇到的問題是配額沒有應用,也沒有重新計算。即使我超出配額 300% 或更多,郵件仍然會送達。此外,當收到新郵件時,相應表中的值quota2永遠不會更新。

這是我到目前為止所做的:

我已經編輯了我/etc/dovecot/dovecot.conf以啟用配額(好吧,至少我認為我這樣做了):

# 2.1.7: /etc/dovecot/dovecot.conf
# 作業系統:Linux 3.2.0-4-amd64 x86_64 Debian 7.1
# 啟用配額外掛
mail_plugins = $mail_plugins 配額

auth_mechanisms = 普通登錄
log_timestamp = "%Y-%m-%d %H:%M:%S"

# 我們需要每個 ip 超過 10 個連接
mail_max_userip_connections = 20

# 只啟用 imap
協議 = imap

# 證書
ssl_cert=</etc/ssl/localcerts/mailserver.crt
ssl_key=</etc/ssl/localcerts/mailserver.key

傳遞數據庫 {
參數 = /etc/dovecot/dovecot-mysql.conf
驅動程序 = sql
}

使用者數據庫 {
參數 = /etc/dovecot/dovecot-mysql.conf
驅動程序 = sql
}

服務認證{
unix_listener /var/spool/postfix/private/auth_dovecot {
組=後綴
模式 = 0660
使用者 = 後綴
}
unix_listener auth-master {
模式 = 0600
使用者 = vmail
}
使用者 = 根
}

# 為配額啟用字典內容
服務字典 {
unix_listener 字典 {
模式 = 0600
使用者 = vmail
}
}

# 啟用 imap_quota
協議 imap {
mail_plugins = 配額 imap_quota
}

插入 {
# 使用 SQL 表儲存目前配額大小
quota_grace = 10M
quota = dict:使用者配額::proxy::sqluserquota
quota_exceeded_message = 對不起,%u 的郵箱超出了限制。
}

auth_debug = 是
auth_debug_passwords = 是
auth_verbose = 是
mail_debug = 是

聽寫{
sqluserquota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf
}

協議pop3 {
pop3_uidl_format =%08Xu%08Xv
}

協議 lda {
mail_plugins = 配額
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = admin@domain
}

該文件/etc/dovecot/dovecot-dict-sql-user.conf包含:

連接=主機=本地主機數據庫名=postfixadmin使用者=postfixadmin密碼=秘密

地圖 {
模式 = priv/配額/儲存
表=配額2
username_field = 使用者名
value_field = 字節
}
地圖 {
模式 = priv/quota/messages
表=配額2
username_field = 使用者名
value_field = 消息
}

文件中郵箱和密碼的查詢/etc/dovecot/dovecot-mysql.conf包含:

驅動程序 = mysql
連接=主機=本地主機數據庫名=postfixadmin使用者=postfixadmin密碼=秘密
default_pass_scheme = PLAIN-MD5

password_query = SELECT CONCAT('*:bytes=', quota) AS userdb_quota_rule, 密碼來自郵箱 WHERE username = '%u'

user_query = SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, CONCAT('*:bytes=', quota) AS quota_rule, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u'

如果我手動觸發報價計算,事情看起來很合理:

root@zame:/etc/dovecot#dovadm quota recalc -u user@domain
root@zame:/etc/dovecot# doveadm quota get -u user@domain
配額名稱 類型 值限制 %
使用者配額 STORAGE 37091 10000 370
使用者配額 MESSAGE 126 - 0

如果我在 Thunderbird 中啟用Display Quota外掛,Thunderbird 還報告使用了 371% 的配額。所以從數據庫中讀取目前值似乎是可行的。

但是,如果我向該郵箱發送郵件(超過 370% 的配額),郵件仍然會送達。

登錄期間的日誌/var/log/mail.log顯示以下內容(如果我剛剛啟動 Thunderbird):

8 月 21 日 17:27:01 zame dovecot:身份驗證:調試:從目錄載入模組:/usr/lib/dovecot/modules/auth
8 月 21 日 17:27:01 zame dovecot:身份驗證:調試:模組已載入:/usr/lib/dovecot/modules/auth/libdriver_mysql.so
8 月 21 日 17:27:01 zame dovecot: auth: Debug: Read auth token secret from /var/run/dovecot/auth-token-secret.dat
8 月 21 日 17:27:01 zame dovecot: auth: Debug: auth client connected (pid=22901)
8 月 21 日 17:27:01 zame dovecot:身份驗證:調試:客戶端在:AUTH#0111#011PLAIN#011service=imap#011secured#011session=E54/5tMd9QBUSpxA#011lip=91.214.168.151#011rip=84.74.156.64#011lport=143 #011rport=61173
8 月 21 日 17:27:01 zame dovecot: auth: Debug: client passdb out: CONT#0111
8 月 21 日 17:27:01 zame dovecot: auth: Debug: client in: CONT#0111#011AGVnQHphbWUuY2gANHBsVVRPX25pdW0=(之前的 base64 數據可能包含敏感數據)
8 月 21 日 17:27:01 zame dovecot:auth-worker(22905):調試:從目錄載入模組:/usr/lib/dovecot/modules/auth
8 月 21 日 17:27:01 zame dovecot:auth-worker(22905):調試:模組已載入:/usr/lib/dovecot/modules/auth/libdriver_mysql.so
8 月 21 日 17:27:01 zame dovecot: auth-worker(22905): Debug: sql(eg@domain,84.74.156.64): query: SELECT CONCAT('*:bytes=', quota) AS userdb_quota_rule, password FROM 郵箱WHERE 使用者名 = 'eg@domain'
8 月 21 日 17:27:01 zame dovecot: auth: Debug: client passdb out: OK#0111#011user=eg@domain
8 月 21 日 17:27:01 zame dovecot: auth: 調試: master in: REQUEST#0111999634433#01122901#0111#011636e2ad86df15a637411ff278b1f4db9#011session_pid=22907#011request_auth_token
8 月 21 日 17:27:01 zame dovecot: auth-worker(22905): Debug: sql(eg@domain,84.74.156.64): SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, CONCAT( '*:bytes=', quota) AS quota_rule, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = 'eg@domain'
8 月 21 日 17:27:01 zame dovecot: auth: Debug: master userdb out: USER#0111999634433#011eg@domain#011mail=maildir:/var/vmail/domain/eg/#011quota_rule=*:bytes=10240000#011uid= 5000#011gid=5000#011auth_token=d6c1d88ed77a7ffaf8057151bb5db289c4815786
8 月 21 日 17:27:01 zame dovecot: imap-login: Login: user=, method=PLAIN, rip=84.74.156.64, lip=91.214.168.151, mpid=22907, TLS, session=
8 月 21 日 17:27:01 zame dovecot:imap:調試:從目錄載入模組:/usr/lib/dovecot/modules
8 月 21 日 17:27:01 zame dovecot:imap:調試:模組已載入:/usr/lib/dovecot/modules/lib10_quota_plugin.so
8 月 21 日 17:27:01 zame dovecot:imap:調試:模組已載入:/usr/lib/dovecot/modules/lib11_imap_quota_plugin.so
8 月 21 日 17:27:01 zame dovecot:imap:調試:添加了 userdb 設置:mail=maildir:/var/vmail/domain/eg/
8 月 21 日 17:27:01 zame dovecot:imap:調試:添加了 userdb 設置:plugin/quota_rule=*:bytes=10240000
8 月 21 日 17:27:01 zame dovecot: imap(eg@domain): Debug: Effective uid=5000, gid=5000, home=
8 月 21 日 17:27:01 zame dovecot: imap(eg@domain): Debug: Quota root: name=User quota backend=dict args=:proxy::sqluserquota
8 月 21 日 17:27:01 zame dovecot: imap(eg@domain): 調試: 配額規則: root=使用者配額郵箱=* 字節=10240000 消息=0
8 月 21 日 17:27:01 zame dovecot: imap(eg@domain): 調試: 配額寬限期: root=使用者配額字節=10485760
8 月 21 日 17:27:01 zame dovecot: imap(eg@domain): 調試: dict quota: user=eg@domain, uri=proxy::sqluserquota, noenforcing=0
8 月 21 日 17:27:01 zame dovecot: imap(eg@domain): 調試: maildir++: root=/var/vmail/domain/eg, index=, indexpvt=, control=, inbox=/var/vmail/domain/例如,alt=
8 月 21 日 17:27:14 zame dovecot: auth: Debug: auth client connected (pid=22910)
8 月 21 日 17:27:14 zame dovecot:身份驗證:調試:客戶端在:AUTH#0111#011PLAIN#011service=imap#011secured#011session=OdQF59MdDQBUSpxA#011lip=91.214.168.151#011rip=84.74.156.64#011lport=143#rport =61197
8 月 21 日 17:27:14 zame dovecot: auth: Debug: client passdb out: CONT#0111
8 月 21 日 17:27:14 zame dovecot: auth: Debug: client in: CONT#0111#011AGVnQHphbWUuY2gANHBsVVRPX25pdW0=(之前的 base64 數據可能包含敏感數據)
8 月 21 日 17:27:14 zame dovecot: auth-worker(22905): Debug: sql(eg@domain,84.74.156.64): query: SELECT CONCAT('*:bytes=', quota) AS userdb_quota_rule, password FROM 郵箱WHERE 使用者名 = 'eg@domain'
8 月 21 日 17:27:14 zame dovecot: auth: Debug: client passdb out: OK#0111#011user=eg@domain
8 月 21 日 17:27:14 zame dovecot: auth: 調試: master in: REQUEST#011213516289#01122910#0111#0119ed3b0c072c59928f45493e80687b82a#011session_pid=22911#011request_auth_token
8 月 21 日 17:27:14 zame dovecot: auth-worker(22905): Debug: sql(eg@domain,84.74.156.64): SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, CONCAT( '*:bytes=', quota) AS quota_rule, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = 'eg@domain'
8 月 21 日 17:27:14 zame dovecot: auth: Debug: master userdb out: USER#011213516289#011eg@domain#011mail=maildir:/var/vmail/domain/eg/#011quota_rule=*:bytes=10240000#011uid= 5000#011gid=5000#011auth_token=58a5177adf128ec45bf2e621abc97e43c9924530
8 月 21 日 17:27:14 zame dovecot: imap-login: 登錄: user=, method=PLAIN, rip=84.74.156.64, lip=91.214.168.151, mpid=22911, TLS, session=
8 月 21 日 17:27:14 zame dovecot:imap:調試:從目錄載入模組:/usr/lib/dovecot/modules
8 月 21 日 17:27:14 zame dovecot:imap:調試:模組已載入:/usr/lib/dovecot/modules/lib10_quota_plugin.so
8 月 21 日 17:27:14 zame dovecot:imap:調試:模組已載入:/usr/lib/dovecot/modules/lib11_imap_quota_plugin.so
8 月 21 日 17:27:14 zame dovecot:imap:調試:添加了 userdb 設置:mail=maildir:/var/vmail/domain/eg/
8 月 21 日 17:27:14 zame dovecot:imap:調試:添加了 userdb 設置:plugin/quota_rule=*:bytes=10240000
8 月 21 日 17:27:14 zame dovecot: imap(eg@domain): Debug: Effective uid=5000, gid=5000, home=
8 月 21 日 17:27:14 zame dovecot: imap(eg@domain): Debug: Quota root: name=User quota backend=dict args=:proxy::sqluserquota
8 月 21 日 17:27:14 zame dovecot: imap(eg@domain): 調試: 配額規則: root=使用者配額郵箱=* 字節=10240000 消息=0
8 月 21 日 17:27:14 zame dovecot: imap(eg@domain): Debug: Quota Grace: root=User quota bytes=10485760
8 月 21 日 17:27:14 zame dovecot: imap(eg@domain): Debug: dict quota: user=eg@domain, uri=proxy::sqluserquota, noenforcing=0
8 月 21 日 17:27:14 zame dovecot: imap(eg@domain): 調試: maildir++: root=/var/vmail/domain/eg, index=, indexpvt=, control=, inbox=/var/vmail/domain/例如,alt=

收到郵件時的以下內容(對於超出配額的使用者):

8 月 21 日 17:31:50 zame postfix/smtpd[22964]:從 mout.gmx.net[212.227.15.19] 連接
8 月 21 日 17:31:50 zame dovecot:身份驗證:調試:從目錄載入模組:/usr/lib/dovecot/modules/auth
8 月 21 日 17:31:50 zame dovecot:身份驗證:調試:模組已載入:/usr/lib/dovecot/modules/auth/libdriver_mysql.so
8 月 21 日 17:31:50 zame dovecot: auth: Debug: Read auth token secret from /var/run/dovecot/auth-token-secret.dat
8 月 21 日 17:31:50 zame dovecot: auth: Debug: auth client connected (pid=0)
8 月 21 日 17:31:50 zame postfix/smtpd[22964]:CB20237236F:client=mout.gmx.net[212.227.15.19]
8 月 21 日 17:31:50 zame 後綴/清理 [22971]:CB20237236F:消息 ID =
8 月 21 日 17:31:50 zame postfix/qmgr[22288]: CB20237236F: from=, size=2826, nrcpt=1 (queue active)
8 月 21 日 17:31:50 zame postfix/virtual[22972]: CB20237236F: to=, relay=virtual, delay=0.06, delays=0.04/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to郵件目錄)
8 月 21 日 17:31:50 zame 後綴/qmgr [22288]:CB20237236F:已刪除
8 月 21 日 17:31:50 zame postfix/smtpd[22964]:斷開與 mout.gmx.net[212.227.15.19] 的連接

如前所述,列的值bytes不會在 table 中更新quotas2

所以,我不知何故錯過瞭如何連結 dovecot 以考慮配額並在嘗試將郵件傳遞到/var/vmail/.

我會很高興任何提示。

為了完整起見,這裡是輸出dovecot -n

# 2.2.13: /etc/dovecot/dovecot.conf
# 作業系統:Linux 3.2.0-4-amd64 x86_64 Debian 8.1
auth_debug = 是
auth_debug_passwords = 是
auth_mechanisms = 普通登錄
auth_verbose = 是
聽寫{
sqluserquota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf
}
log_timestamp = "%Y-%m-%d %H:%M:%S"
mail_debug = 是
mail_max_userip_connections = 20
mail_plugins = "配額"
傳遞數據庫 {
參數 = /etc/dovecot/dovecot-mysql.conf
驅動程序 = sql
}
插入 {
quota = dict:使用者配額::proxy::sqluserquota
quota_exceeded_message = 對不起,%u 的郵箱超出了限制。
quota_grace = 10M
}
協議 = imap
服務認證{
unix_listener /var/spool/postfix/private/auth_dovecot {
組=後綴
模式 = 0660
使用者 = 後綴
}
unix_listener auth-master {
模式 = 0600
使用者 = vmail
}
使用者 = 根
}
服務字典 {
unix_listener 字典 {
模式 = 0600
使用者 = vmail
}
}
ssl_cert = </etc/ssl/localcerts/mailserver.crt
ssl_key = </etc/ssl/localcerts/mailserver.key
使用者數據庫 {
參數 = /etc/dovecot/dovecot-mysql.conf
驅動程序 = sql
}
協議 imap {
mail_plugins = 配額 imap_quota
}
協議pop3 {
pop3_uidl_format =%08Xu%08Xv
}
協議 lda {
auth_socket_path = /var/run/dovecot/auth-master
mail_plugins = 配額
postmaster_address = admin@domain
}

編輯:如果我更詳細地查看表格,它會變得更加混亂quota2

如果我從啟用了配額的帳戶(使用 Thunderbird 或 Squirrelmail)發送郵件,我實際上可以看到郵件中的值bytesquota2增加。我認為這一定是由於將消息複製到了已發送的文件夾中。

似乎配額不適用於傳入郵件?

好的,經過更多研究,我找到了解決方案:問題出在 postfix 配置中,而不是 dovecot!

Postfix 在mydestination一行中有一個錯誤的條目——因此它從未使用虛擬傳輸將消息傳遞到 Dovecot,而是直接將它們傳遞到本地郵箱。

mydestination後綴配置中刪除條目後,一切都按預期工作。現在收到郵件時的日誌看起來也不同了——它現在明確地談到了 Dovecot:

Aug 21 20:32:39 zame postfix/pipe[26958]: 676243723C8: to=<user@domain>, relay=dovecot, delay=0.85, delays=0.5/0.03/0/0.33, dsn=2.0.0, status=sent (delivered via dovecot service)

注意relay=dovecot.

引用自:https://serverfault.com/questions/715845