超过配额时如何使用 Dovecot 向用户发送警告?

超过配额时如何使用 Dovecot 向用户发送警告?

我正在尝试对超过配额的用户实施配额警告,Dovecot 如下这个提示。我已将以下内容添加到我的/etc/dovecot/conf.d/30-overquota.conf(据说原件中的任何修改/etc/dovecot/dovecot.conf都将在更新时删除)。

plugin {
  quota = dict:user::file:/var/vmail/%d/%n/.quotausage
  sieve=/var/vmail/%d/%n/.sieve

quota_warning = storage=50%% quota-warning 50 %u
quota_warning2 = storage=80%% quota-warning 80 %u
quota_warning3 = -storage=100%% quota-warning below %u # user is no longer over quota

}

service quota-warning {
  executable = script /opt/extra-script/quota-warning.sh
  user = root
  unix_listener quota-warning {
        user = root
        mode = 0600
  }
}

然后我创建了 /opt/extra-script/quota-warning.sh,将其 chmod 为 755

#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: [email protected]
Subject: Mailbox piena

La tua casella è piena al $PERCENT%. Cancellare i messaggi vecchi.
EOF

不幸的是,这并不能正常工作,因为我在 1MB 的测试邮箱中没有收到任何消息,该邮箱已满 95%(并且我的 30-overquota.conf 中的限制在第 5 行设置为 50%)。

谁能帮助我正确配置该服务?下面是dovecot -n输出,据我所知,确认我的额外配置包含在正在运行的服务中(但没有任何预期的效果)

root@centos1670:~# dovecot -n
# 2.2.18: /etc/dovecot/dovecot.conf
# Pigeonhole version 0.4.8 (0c4ae064f307+)
# OS: Linux 2.6.32-642.15.1.el6.x86_64 x86_64 CentOS release 6.8 (Final) ext3
auth_mechanisms = plain login digest-md5 cram-md5 apop
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890&.-_@'
disable_plaintext_auth = no
first_valid_uid = 30
imap_client_workarounds = delay-newmail
imap_logout_format = rcvd=%i, sent=%o
mail_home = /var/qmail/mailnames/%Ld/%Ln
mail_location = maildir:/var/qmail/mailnames/%Ld/%Ln/Maildir
mail_log_prefix = "service=%s, user=%u, ip=[%r]. "
mail_plugins = " quota"
managesieve_logout_format = rcvd=%i, sent=%o
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate imapflags notify
namespace inbox {
  inbox = yes
  location = 
  prefix = INBOX.
  separator = .
}
passdb {
  driver = plesk
}
plugin {
  quota = dict:user::file:/var/vmail/%d/%n/.quotausage
  quota_grace = 0
  quota_warning = storage=50%% quota-warning 50 %u
  quota_warning2 = storage=80%% quota-warning 80 %u
  quota_warning3 = -storage=100%% quota-warning below %u
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
  sieve_extensions = +notify +imapflags
}
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
pop3_logout_format = rcvd=%i, sent=%o, top=%t/%p, retr=%r/%b, del=%d/%m, size=%s
protocols = imap pop3 sieve
service auth-worker {
  group = 
  user = 
}
service auth {
  group = 
  unix_listener auth-userdb {
    group = popuser
    mode = 0600
    user = popuser
  }
  user = 
}
service quota-warning {
  executable = script /opt/extra-script/quota-warning.sh
  unix_listener quota-warning {
    mode = 0600
    user = root
  }
  user = root
}
ssl_cert = </etc/dovecot/private/ssl-cert-and-key.pem
ssl_key = </etc/dovecot/private/ssl-cert-and-key.pem
userdb {
  args = uid=popuser gid=popuser
  driver = static
}
protocol imap {
  mail_plugins = " quota imap_quota"
}
protocol pop3 {
  pop3_uidl_format = UID%u-%v
}
protocol lda {
  mail_plugins = " quota sieve"
}

编辑:按照 Jens Erat 的建议,root@centos1670:~# doveadm quota get实际上会产生以下输出:

Quota name Type Value Limit %
user STORAGE 0 - 0
user MESSAGE 0 - 0

这似乎表示配置有缺陷,可以通过添加诸如quota_rule = *:storage=1GB强制配额重新计算之类的内容来修复。这样做的问题是,我所询问的 Dovecot 设置是在 Plesk 下运行的,其中可以为每个用户设置不同的邮箱大小,因此如果能够quota_rule以参数方式定义该值,我们将不胜感激。

答案1

Dovecot 只会对用户的配额使用情况添加新的更改,除非明确要求重新计算配额(对于大型用户群和邮箱来说,该操作可能需要相当长的时间)。因此,如果您没有强制重新计算配额,Dovecot 可能不知道邮箱已超过配额限制。

使用doveadm quota get获取当前配额数据库的转储;doveadm quota recalc强制重新计算配额。

答案2

您的问题是由错误的配额源定义引起的。

pleskDovecot根本没有 passdb 驱动程序。可能的驱动程序有:passwdpasswd-fileldapsqldictvpopmail您必须参考 plesk 配置并找出passdbplesk 使用的是什么类型。然后你必须在你的 dovecot 配置中添加相应的行。

一般来说,dovecot 配额的配置应该如下所示:

quota           = maildir:User quota
quota_rule      = Junk:ignore
quota_rule2     = Trash:storage=+100M
quota_warning   = storage=90%% quota-warning 90 %u %d
quota_warning2  = storage=80%% quota-warning 80 %u %d
quota_exceeded_message = ERROR:422 - Mailbox full 

这里,每用户配额与用户的凭据相关联,并与登录名/密码和存储位置一起存储在同一位置。当 dovecotdeliver引用 passdb 时,它也会检索配额限制并将其与实际邮箱大小进行比较。

注意

您还可以注意到通知脚本quota-warning有三个参数而不是两个 - 我分别传递了用户名和域,因为多个域由一个域提供服务,dovecot并且很少有不同的域可能具有相同的用户,例如webmasterabuse。通过准确的本地部分和域后,dovecot 可以避免歧义并将消息存储在正确的邮箱中。

相关内容