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

如果超出配额,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

密码数据库 {
  参数 = /etc/dovecot/dovecot-mysql.conf
  驱动程序 = sql
}

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

服务授权 {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    组 = 后缀
    模式 = 0660
    用户 = 后缀
  }
  unix_listener 身份验证主控 {
    模式 = 0600
    用户=vmail
  }
  用户 = root
}

# 启用配额的字典功能
服务字典 {
  unix_listener 字典 {
    模式 = 0600
    用户=vmail
  }
}

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

插入 {
  # 使用 SQL 表存储当前配额大小
  配额宽限期 = 10M
  配额 = 字典:用户配额::proxy::sqluserquota
  quote_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
  邮政局长地址 = admin@domain
}

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

连接 = 主机 = localhost dbname = postfixadmin 用户 = postfixadmin 密码 = secret

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

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

驱动程序 = mysql
连接 = 主机 = localhost dbname = postfixadmin 用户 = postfixadmin 密码 = secret
默认密码方案 = PLAIN-MD5

password_query = SELECT CONCAT('*:bytes=',quota) AS userdb_quota_rule, 密码 FROM mailbox WHERE username ='%u'

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

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

root @ zame:/etc/dovecot# doveadm 配额重新计算-u 用户@域
root @ zame:/etc/dovecot# doveadm 配额获取-u 用户@域
配额名称 类型 值 限制 %
用户配额存储 37091 10000370
用户配额消息 126 - 0

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

但是如果我向该邮箱发送一封邮件(其配额超出 370%),该邮件仍然会被投递。

/var/log/mail.log登录期间,日志显示以下内容(如果我刚刚启动 thunderbird):

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.168.151#011rip=84.74.156.64#011lport=143#011rport=61173
8 月 21 日 17:27:01 zame dovecot:身份验证:调试:客户端 passdb 输出:CONT#0111
8 月 21 日 17:27:01 zame dovecot:auth:调试:客户端在: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,密码来自邮箱,其中用户名 ='eg@domain'
8 月 21 日 17:27:01 zame dovecot:身份验证:调试:客户端 passdb 输出:OK#0111#011user=eg@domain
8 月 21 日 17:27:01 zame dovecot:auth:调试:主控:REQUEST#0111999634433#01122901#0111#011636e2ad86df15a637411ff278b1f4db9#011session_pid=22907#011request_auth_token
8 月 21 日 17:27:01 zame dovecot:auth-worker(22905):调试:sql(eg@domain,84.74.156.64):SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, CONCAT('*:bytes=',quota) AS quote_rule, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = 'eg@domain'
8 月 21 日 17:27:01 zame dovecot:身份验证:调试:master userdb 输出: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:登录:用户=,方法=PLAIN,rip=84.74.156.64,lip=91.214.168.151,mpid=22907,TLS,会话=
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):调试:配额根:名称=用户配额后端=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/eg,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.168.151#011rip=84.74.156.64#011lport=143#011rport=61197
8 月 21 日 17:27:14 zame dovecot:身份验证:调试:客户端 passdb 输出:CONT#0111
8 月 21 日 17:27:14 zame dovecot:auth:调试:客户端在: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,密码来自邮箱,其中用户名 ='eg@domain'
8 月 21 日 17:27:14 zame dovecot:身份验证:调试:客户端 passdb 输出:OK#0111#011user=eg@domain
8 月 21 日 17:27:14 zame dovecot:身份验证:调试:主控:请求#011213516289#01122910#0111#0119ed3b0c072c59928f45493e80687b82a#011session_pid=22911#011request_auth_token
8 月 21 日 17:27:14 zame dovecot:auth-worker(22905):调试:sql(eg@domain,84.74.156.64):SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, CONCAT('*:bytes=',quota) AS quote_rule, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = 'eg@domain'
8 月 21 日 17:27:14 zame dovecot:身份验证:调试:master userdb 输出: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:登录:用户=,方法=PLAIN,rip=84.74.156.64,lip=91.214.168.151,mpid=22911,TLS,会话=
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):调试:配额根:名称=用户配额后端=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/eg,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: 客户端=mout.gmx.net[212.227.15.19]
8月21日 17:31:50 zame postfix/cleanup[22971]: CB20237236F: message-id=
8 月 21 日 17:31:50 zame postfix/qmgr[22288]: CB20237236F: from=, size=2826, nrcpt=1 (队列活跃)
8 月 21 日 17:31:50 zame postfix/virtual[22972]: CB20237236F: to=, reply=virtual, delay=0.06, delays=0.04/0.02/0/0.01, dsn=2.0.0, status=sent (已送达 maildir)
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表中的列值不会更新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
}
插入 {
  配额 = 字典:用户配额::proxy::sqluserquota
  quote_exceeded_message = 抱歉,%u 的邮箱已经超出限制。
  配额宽限期 = 10M
}
协议 = imap
服务授权 {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    组 = 后缀
    模式 = 0660
    用户 = 后缀
  }
  unix_listener 身份验证主控 {
    模式 = 0600
    用户=vmail
  }
  用户 = root
}
服务字典 {
  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 = 配额
  邮政局长地址 = admin@domain
}

quota2编辑:如果我更详细地查看表格,它会变得更加令人困惑:

如果我从启用了配额的帐户发送邮件(使用 Thunderbird 或 Squirrelmail),我实际上可以看到bytes中的值quota2在增加。我认为这一定是由于将邮件复制到已发送文件夹中。

看来配额并不适用于收到的邮件?

答案1

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

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

从 postfix 配置中删除该条目后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

相关内容