我正在尝试在 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
。