如果超过配额,Dovecot 配额不会重新计算,也不会拒绝邮件

erg*_*erg 5 dovecot

我正在尝试在 Dovecot 中设置配额。目前 Postfix 与 Dovecot 和 postfixadmin 一起在 Debian Jessie 上运行。

我的问题是配额没有应用,也没有重新计算。即使我超过了 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

密码{
  args = /etc/dovecot/dovecot-mysql.conf
  驱动程序 = sql
}

用户数据库{
  args = /etc/dovecot/dovecot-mysql.conf
  驱动程序 = sql
}

服务认证{
  unix_listener /var/spool/postfix/private/auth_dovecot {
    组 = 后缀
    模式 = 0660
    用户 = 后缀
  }
  unix_listener auth-master {
    模式 = 0600
    用户 = vmail
  }
  用户 = 根
}

# 为配额启用字典内容
服务字典{
  unix_listener dict {
    模式 = 0600
    用户 = vmail
  }
}

# 启用 imap_quota
协议 imap {
  mail_plugins = 配额 imap_quota
}

插入 {
  # 使用 SQL 表存储当前配额大小
  quota_grace = 10M
  配额 = dict:用户配额::代理::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包含:

connect = host=localhost dbname=postfixadmin user=postfixadmin 密码=secret

地图 {
  模式 = priv/配额/存储
  表 = 配额 2
  用户名_字段 = 用户名
  value_field = 字节
}
地图 {
  模式 = priv/quota/messages
  表 = 配额 2
  用户名_字段 = 用户名
  value_field = 消息
}

对文件中邮箱和密码的查询/etc/dovecot/dovecot-mysql.conf包含:

驱动程序 = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin 密码=secret
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 邮箱 WHERE username = '%u'

如果我手动触发报价的计算,事情看起来很合理:

root@zame:/etc/dovecot# doveadm quota recalc -u user@domain
root@zame:/etc/dovecot# doveadm quota get -u user@domain
配额名称 类型 值限制 %
用户配额 STORAGE 37091 10000 370
用户配额 MESSAGE 126 - 0

如果我Display Quota在 Thunderbird 中启用插件,Thunderbird 还会报告使用了 371% 的配额。所以从数据库中读取当前值似乎有效。

但是,如果我将邮件发送到该邮箱(超过 370% 的配额),邮件仍然会被送达。

登录/var/log/mail.log期间的日志显示以下内容(如果我只是启动雷鸟):

8 月 21 日 17:27:01 zame dovecot:auth:调试:从目录加载模块:/usr/lib/dovecot/modules/auth
8 月 21 日 17:27:01 zame dovecot:auth:调试:模块加载:/usr/lib/dovecot/modules/auth/libdriver_mysql.so
8 月 21 日 17:27:01 zame dovecot:auth:调试:从 /var/run/dovecot/auth-token-secret.dat 读取身份验证令牌秘密
8 月 21 日 17:27:01 zame dovecot:auth:调试:auth 客户端已连接(pid=22901)
8 月 21 日 17:27:01 zame dovecot: auth: 调试: 客户端: AUTH#0111#011PLAIN#011service=imap#011secured#011session=E54/5tMd9QBUSpxA#011lip=91.214.16061614rip14#168.14514514513 #011rport=61173
8 月 21 日 17:27:01 zame dovecot:auth:调试:客户端密码输出: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):调试:sql(eg@domain,84.74.156.64):查询:SELECT CONCAT('*:bytes=', quota) AS userdb_quota_rule,密码来自邮箱WHERE 用户名 = 'eg@domain'
8 月 21 日 17:27:01 zame dovecot:auth:调试:客户端 passdb 输出:OK#0111#011user=eg@domain
8 月 21 日 17:27:01 zame dovecot: auth: 调试: master in: REQUEST#0111999634433#01122901#0111#011636e2ad86df15a637411ff278b1f4db9_requestth1f4db9#02011
8 月 21 日 17:27:01 zame dovecot: auth-worker(22905): 调试: sql(eg@domain,84.74.156.64): SELECT CONCAT('maildir:/var/vmail/',maildir) AS 邮件,CONCAT( '*:bytes=', quota) AS quota_rule, 5000 AS uid, 5000 AS gid FROM 邮箱 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=1020410000 5000#011gid=5000#011auth_token=d6c1d88ed77a7ffaf8057151bb5db289c4815786
8 月 21 日 17:27:01 zame dovecot:imap-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):调试:有效 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 配额: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:调试:auth 客户端已连接(pid=22910)
8 月 21 日 17:27:14 zame dovecot: auth: 调试: 客户端: AUTH#0111#011PLAIN#011service=imap#011secured#011session=OdQF59MdDQBUSpxA#011lip=91.214.160616rip14r10.168.14r10.168.14r14r10.168.14r10.13 =61197
8 月 21 日 17:27:14 zame dovecot:auth:调试:客户端密码输出: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):调试:sql(eg@domain,84.74.156.64):查询:SELECT CONCAT('*:bytes=', quota) AS userdb_quota_rule,密码来自邮箱WHERE 用户名 = 'eg@domain'
8 月 21 日 17:27:14 zame dovecot:auth:调试:客户端 passdb 输出:OK#0111#011user=eg@domain
8 月 21 日 17:27:14 zame dovecot: auth: 调试: master in: REQUEST#011213516289#01122910#0111#0119ed3b0c072c59928f45493e80687b1session_1auth_ken_1auth=011213516289#01122910
8 月 21 日 17:27:14 zame dovecot: auth-worker(22905): 调试: sql(eg@domain,84.74.156.64): SELECT CONCAT('maildir:/var/vmail/',maildir) AS 邮件,CONCAT( '*:bytes=', quota) AS quota_rule, 5000 AS uid, 5000 AS gid FROM 邮箱 WHERE username = 'eg@domain'
8 月 21 日 17:27:14 zame dovecot:auth:调试:主 userdb 输出:USER#011213516289#011eg@domain#011mail=maildir:/var/vmail/domain/eg/#011quota_rule=*:bytes=10#0110000 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):调试:有效 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):调试:配额宽限:root=用户配额字节=10485760
8 月 21 日 17:27:14 zame dovecot:imap(eg@domain):调试:dict 配额: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:auth:调试:从目录加载模块:/usr/lib/dovecot/modules/auth
8 月 21 日 17:31:50 zame dovecot:auth:调试:模块加载:/usr/lib/dovecot/modules/auth/libdriver_mysql.so
8 月 21 日 17:31:50 zame dovecot:auth:调试:从 /var/run/dovecot/auth-token-secret.dat 读取身份验证令牌秘密
8 月 21 日 17:31:50 zame dovecot:auth:调试:auth 客户端已连接(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)邮件目录)
8 月 21 日 17:31:50 zame postfix/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 = "配额"
密码{
  args = /etc/dovecot/dovecot-mysql.conf
  驱动程序 = sql
}
插入 {
  配额 = dict:用户配额::代理::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 dict {
    模式 = 0600
    用户 = vmail
  }
}
ssl_cert = </etc/ssl/localcerts/mailserver.crt
ssl_key = </etc/ssl/localcerts/mailserver.key
用户数据库{
  args = /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不断增加。我认为这一定是由于将邮件复制到已发送文件夹中所致。

似乎配额只是不适用于传入的邮件?

erg*_*erg 5

好的,经过更多研究,我找到了解决方案:问题出在 postfix 配置中,而不是 dovecot!

Postfix 在该mydestination行中有一个错误的条目- 因此它从未使用虚拟传输将消息传送到 Dovecot,而是将它们直接传送到本地邮箱。

mydestinationpostfix 配置中删除条目后,一切都按预期工作。收到邮件时的日志现在看起来也不同了 - 它现在明确地谈论 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)
Run Code Online (Sandbox Code Playgroud)

请注意relay=dovecot.