Hi,
I am still struggling with this, and would appreciate any help ayone can
give. Let me try to explain step for step.
I created a test account test at company.com:
> root at dovecot:/# doveadm quota get -u test
> Quota name Type Value Limit
%
> STORAGE 1209 1368
88
> MESSAGE 35 -
0
As you can see, the test mailbox is 88% full, so it should receive
warnings, because in dovecot.conf I have set:
> plugin {
> quota = maildir
> quota_rule = ?:storage=5G
> quota_rule2 = Trash:storage=+100M
> quota_warning = storage=97%% quota-warning 97 %u
> quota_warning2 = storage=95%% quota-warning 95 %u
> quota_warning3 = storage=90%% quota-warning 90 %u
> quota_warning4 = storage=85%% quota-warning 85 %u
> quota_warning5 = storage=80%% quota-warning 80 %u
> quota_warning6 = -storage=100%% quota-warning below %u
> }
We use a script to send out the email warnings, configured like this:
> service quota-warning {
> executable = script /usr/local/bin/quota-warning.sh
> unix_listener quota-warning {
> user = vmail
> mode = 0666
> }
> user = vmail
> }
When running this script manually as vmail, the warning is delivered to
the test user:
> sudo -H -u vmail bash -c '/usr/local/bin/quota-warning.sh 90 test'
However, in practice: dovecot never sends out any quota-warnings. It
just starts generating delivery failures when the mailbox is over 100%.
We define the per-user quota in the first line of each user's
maildirsize file, for the test user: /var/vmail/test/Maildir/maildirsize
Here is a debug=yes log file of 88% full incoming mailbox delivery:
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Loading modules from directory:
/usr/lib/dovecot/modules
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Module loaded:
/usr/lib/dovecot/modules/lib01_acl_plugin.so
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Module loaded:
/usr/lib/dovecot/modules/lib02_lazy_expunge_plugin.so
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Module loaded:
/usr/lib/dovecot/modules/lib10_quota_plugin.so
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Module loaded:
/usr/lib/dovecot/modules/lib15_notify_plugin.so
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Module loaded:
/usr/lib/dovecot/modules/lib20_mail_log_plugin.so
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Module loaded:
/usr/lib/dovecot/modules/lib20_zlib_plugin.so
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: Module loaded:
/usr/lib/dovecot/modules/lib90_sieve_plugin.so
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: auth USER input: test uid=5000
gid=5000 home=/var/vmail/test
> Dec 15 13:56:07 mail dovecot: auth: Debug: master in: USER#0111#011test at
company.com#011service=lda
> Dec 15 13:56:07 mail dovecot: auth: Debug: userdb out:
USER#0111#011test#011uid=5000#011gid=5000#011home=/var/vmail/test
> Dec 15 13:56:07 mail dovecot: lda(test at
company.com)<20290><>: Debug: changed username to test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Effective uid=5000,
gid=5000, home=/var/vmail/test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: lazy_expunge: No
lazy_expunge setting - plugin disabled
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota root: name=
backend=maildir args> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota rule: root=
mailbox=? bytes=5368709120 messages=0
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota rule: root=
mailbox=Trash bytes=+104857600 messages=0
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=5207647846 (97%) messages=0 reverse=no command=quota-warning 97 test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=5100273664 (95%) messages=0 reverse=no command=quota-warning 95 test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=4831838208 (90%) messages=0 reverse=no command=quota-warning 90 test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=4563402752 (85%) messages=0 reverse=no command=quota-warning 85 test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=4294967296 (80%) messages=0 reverse=no command=quota-warning 80 test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=5368709120 (100%) messages=0 reverse=yes command=quota-warning below test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota grace: root=
bytes=536870912 (10%)
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Namespace :
type=shared, prefix=shared/%n/, sep=/, inbox=no, hidden=no, list=children,
subscriptions=no
location=maildir:/var/vmail/%u/Maildir:LAYOUT=fs:DIRNAME=mAildir:INDEX=/var/vmail/test/shared/%u
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: shared:
root=/var/run/dovecot, index=, indexpvt=, control=, inbox=, alt> Dec 15
13:56:07 mail dovecot: lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>:
Debug: acl: initializing backend with data: vfile
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: acl: acl username =
test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: acl: owner = 0
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: acl vfile: Global
ACLs disabled
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Namespace inbox:
type=private, prefix=, sep=/, inbox=yes, hidden=no, list=yes, subscriptions=yes
location=maildir:/var/vmail/test/Maildir:LAYOUT=fs:DIRNAME=mAildir
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: fs:
root=/var/vmail/test/Maildir, index=, indexpvt=, control=, inbox=, alt> Dec
15 13:56:07 mail dovecot: lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>:
Debug: acl: initializing backend with data: vfile
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: acl: acl username =
test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: acl: owner = 1
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: acl vfile: Global
ACLs disabled
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: quota:
quota_over_flag check: quota_over_script unset - skipping
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota root: name=
backend=maildir args> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota rule: root=
mailbox=? bytes=5368709120 messages=0
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota rule: root=
mailbox=Trash bytes=+104857600 messages=0
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=5207647846 (97%) messages=0 reverse=no command=quota-warning 97 raw mail
user
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=5100273664 (95%) messages=0 reverse=no command=quota-warning 95 raw mail
user
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=4831838208 (90%) messages=0 reverse=no command=quota-warning 90 raw mail
user
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=4563402752 (85%) messages=0 reverse=no command=quota-warning 85 raw mail
user
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=4294967296 (80%) messages=0 reverse=no command=quota-warning 80 raw mail
user
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota warning:
bytes=5368709120 (100%) messages=0 reverse=yes command=quota-warning below raw
mail user
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota grace: root=
bytes=536870912 (10%)
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: quota:
quota_over_flag check: quota_over_script unset - skipping
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Destination
address: <test at company.com> (source: -a parameter)
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: Pigeonhole
version 0.5.4 () initializing
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: include:
sieve_global is not set; it is currently not possible to include `:global'
scripts.
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: file
storage: Using active Sieve script path: /var/vmail/test/.dovecot.sieve
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: file
storage: Using script storage path: /var/vmail/test/sieve
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: file
storage: Relative path to sieve storage in active link: sieve/
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: file
storage: Using Sieve script path: /var/vmail/test/.dovecot.sieve
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: file
storage: Storage path `/var/vmail/test/.dovecot.sieve' not found
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: file
storage: Using Sieve script path: /var/lib/dovecot/default.sieve
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: file script:
Opened script `default' from `/var/lib/dovecot/default.sieve'
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: Using the
following location for user's Sieve script: /var/lib/dovecot/default.sieve
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: Opening
script 1 of 1 from `/var/lib/dovecot/default.sieve'
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: Loading
script /var/lib/dovecot/default.sieve
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: Script
binary /var/lib/dovecot/default.svbin successfully loaded
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: binary save:
not saving binary /var/lib/dovecot/default.svbin, because it is already stored
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: sieve: Executing
script from `/var/lib/dovecot/default.svbin'
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Mailbox INBOX:
Mailbox opened because: lib-lda delivery
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Quota root :
Recalculated relative rules with bytes=1400000 count=0. Now grace=140000
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: Debug: Mailbox INBOX:
saving UID 0: Opened mail because: mail stream
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: save: box=INBOX, uid=20,
msgid=<46e7b334-80a0-3a99-4494-bc6fd07aa3db at external.com>, from=user
name <user at external.com>, subject=test
> Dec 15 13:56:07 mail dovecot:
lda(test)<20290><cqPGJOfluWFCTwAA4uZ9mg>: sieve: user at
external.com | test | msgid=<46e7b334-80a0-3a99-4494-bc6fd07aa3db at
external.com>: stored mail into mailbox 'INBOX'
> Dec 15 13:56:07 mail postfix/pipe[20088]: 76722819170D6: to=<test at
company.com>, relay=dovecot, delay=0.24, delays=0.2/0.02/0/0.03, dsn=2.0.0,
status=sent (delivered via dovecot service)
> Dec 15 13:56:07 mail postfix/qmgr[19577]: 76722819170D6: removed
I would appreciate any help. :-)
Finally, our dovecont -n running-config:
> root at dovecot:# dovecot -n
> # 2.3.4.1 (f79e8e7e4): /etc/dovecot/dovecot.conf
> # Pigeonhole version 0.5.4 ()
> # OS: Linux 4.19.0-17-amd64 x86_64 Debian 10.11 xfs
> # Hostname: mail.company.com
> auth_debug = yes
> auth_failure_delay = 10 secs
> auth_master_user_separator = *
> auth_mechanisms = plain login
> auth_username_format = %Ln
> auth_verbose = yes
> auth_verbose_passwords = sha1
> default_vsz_limit = 512 M
> deliver_log_format = %f | %s | msgid=%m: %$
> lda_mailbox_autocreate = yes
> lda_mailbox_autosubscribe = yes
> login_greeting = Dovecot ready.
> login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e
%c lport=%a
> mail_gid = vmail
> mail_location = maildir:/var/vmail/%Ln/Maildir:LAYOUT=fs:DIRNAME=mAildir
> mail_plugins = acl lazy_expunge zlib quota mail_log notify
> mail_shared_explicit_inbox = yes
> mail_uid = vmail
> 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 ihave
> namespace {
> list = children
> location =
maildir:/var/vmail/%%u/Maildir:LAYOUT=fs:DIRNAME=mAildir:INDEX=/var/vmail/%u/shared/%%u
> prefix = shared/%%n/
> separator = /
> subscriptions = no
> type = shared
> }
> namespace inbox {
> inbox = yes
> location =
> mailbox "Deleted items" {
> special_use = \Trash
> }
> mailbox Drafts {
> special_use = \Drafts
> }
> mailbox Junk {
> special_use = \Junk
> }
> mailbox Sent {
> special_use = \Sent
> }
> mailbox "Sent items" {
> special_use = \Sent
> }
> mailbox Trash {
> special_use = \Trash
> }
> mailbox inbox {
> auto = subscribe
> }
> prefix =
> separator = /
> type = private
> }
> passdb {
> args = /etc/dovecot/deny.imap
> deny = yes
> driver = passwd-file
> }
> passdb {
> args = /etc/dovecot/master-users
> driver = passwd-file
> master = yes
> }
> passdb {
> args = /etc/dovecot/dovecot-ldap.conf.ext
> driver = ldap
> result_failure = return-fail
> }
> plugin {
> acl = vfile
> acl_shared_dict = file:/var/lib/dovecot/db/shared-mailboxes.db
> mail_log_events = delete undelete expunge copy mailbox_delete
mailbox_rename append
> mail_log_fields = uid box msgid from subject
> quota = maildir
> quota_rule = ?:storage=5G
> quota_rule2 = Trash:storage=+100M
> quota_warning = storage=97%% quota-warning 97 %u
> quota_warning2 = storage=95%% quota-warning 95 %u
> quota_warning3 = storage=90%% quota-warning 90 %u
> quota_warning4 = storage=85%% quota-warning 85 %u
> quota_warning5 = storage=80%% quota-warning 80 %u
> quota_warning6 = -storage=100%% quota-warning below %u
> sieve = ~/.dovecot.sieve
> sieve_default = /var/lib/dovecot/default.sieve
> sieve_dir = ~/sieve
> }
> protocols = imap lmtp sieve
> service auth {
> unix_listener /var/spool/postfix/private/auth {
> mode = 0666
> }
> unix_listener auth-userdb {
> group = vmail
> mode = 0666
> user = vmail
> }
> }
> service imap-login {
> process_limit = 500
> process_min_avail = 2
> }
> service quota-warning {
> executable = script /usr/local/bin/quota-warning.sh
> unix_listener quota-warning {
> mode = 0666
> user = vmail
> }
> user = vmail
> }
> service stats {
> unix_listener stats-reader {
> group = vmail
> mode = 0666
> user = vmail
> }
> unix_listener stats-writer {
> group = vmail
> mode = 0666
> user = vmail
> }
> }
> shutdown_clients = no
> ssl = required
> ssl_cert = </etc/ssl/letsencrypt/fullchain.pem
> ssl_cipher_list =
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
> ssl_dh = # hidden, use -P to show it
> ssl_key = # hidden, use -P to show it
> ssl_min_protocol = TLSv1.2
> userdb {
> args = uid=vmail gid=vmail home=/var/vmail/%n allow_all_users=yes
> driver = static
> }
> userdb {
> args = /etc/dovecot/dovecot-ldap.conf.ext
> driver = ldap
> }
> verbose_proctitle = yes
> protocol lda {
> mail_plugins = acl lazy_expunge zlib quota mail_log notify sieve quota
> }
> protocol imap {
> imap_max_line_length = 2 M
> mail_max_userip_connections = 40
> mail_plugins = acl lazy_expunge zlib quota mail_log notify imap_quota
imap_acl
> }
Thanks very much for your help!
MJ