Lost mails with sieve "duplicate" extension in case of failure

Stephan Bosch stephan at rename-it.nl
Tue Oct 1 20:54:19 EEST 2019



On 01/10/2019 19:03, Hanno Stock via dovecot wrote:
> Hi!
>
> we just experienced the following issue:
>
> We have a global sieve_before script using the duplicate extension.
>
> require ["duplicate", "imap4flags"];
> if duplicate {
>      discard;
> }
>
> Now the storage of our mailbox store got full and lmtp deliveries
> started to fail.
>
> This resulted in logs like this:
>
> Sep 25 16:14:56 mail-rc1 dovecot: lmtp(USERNAME): Error:
> o_stream_send_istream(/var/mail/vhosts/mail.COMPANY.com/USERNAME/.dovecot/tmp/1569420896.M612482P5820.mail-rc1)
> failed: No space left on device
> Sep 25 16:14:56 mail-rc1 dovecot: lmtp(USERNAME): Error:
> write(/var/mail/vhosts/mail.COMPANY.com/USERNAME/.dovecot/tmp/1569420896.M612482P5820.mail-rc1)
> failed: No space left on device
> Sep 25 16:14:56 mail-rc1 dovecot: lmtp(USERNAME): Error:
> KT9HJGB2i128FgAATXMPig: sieve:
> msgid=<redmine.journal-441799.20190925141453.94a97fd570706f2f at mail.COMPANY.com>:
> failed to store into mailbox 'INBOX': Internal error occurred. Refer to
> server log for more information. [2019-09-25 16:14:56]
> Sep 25 16:14:56 mail-rc1 dovecot: lmtp(USERNAME): Error:
> KT9HJGB2i128FgAATXMPig: sieve: Execution of script
> /mnt/data/var/mail/vhosts/mail.COMPANY.com/USERNAME/.sieve/.dovecot.sieve was
> aborted due to temporary failure (user logfile
> /mnt/data/var/mail/vhosts/mail.COMPANY.com/USERNAME/.sieve/.dovecot.sieve.log
> may reveal additional details)
> Sep 25 16:14:56 mail-rc1 postfix/lmtp[5851]: 4D27690AC:
> to=<USERNAME at mail.COMPANY.com>, orig_to=<USER.NAME at COMPANY.com>,
> relay=mail-rc1.bvd.COMPANY.x[private/dovecot-lmtp], delay=1.3,
> delays=1.3/0/0/0.01, dsn=4.2.0, status=deferred (host
> mail-rc1.bvd.COMPANY.x[private/dovecot-lmtp] said: 451 4.2.0
> <USERNAME at mail.COMPANY.com> Internal error occurred. Refer to server log
> for more information. [2019-09-25 16:14:56] (in reply to end of DATA
> command))
>
> So far, so good... A 451 response is what we wanted.
>
> However on the next delivery attempt the following happens:
>
> Sep 25 16:24:00 mail-rc1 postfix/lmtp[7040]: 4D27690AC:
> to=<USERNAME at mail.COMPANY.com>, orig_to=<USER.NAME at COMPANY.com>,
> relay=mail-rc1.bvd.COMPANY.x[private/dovecot-lmtp], delay=545,
> delays=545/0.09/0.02/0.01, dsn=2.0.0, status=sent (250 2.0.0
> <USERNAME at mail.COMPANY.com> DBcCEYB4i11qGwAATXMPig Saved)
> Sep 25 16:24:00 mail-rc1 dovecot: lmtp(USERNAME):
> DBcCEYB4i11qGwAATXMPig: sieve:
> msgid=<redmine.journal-441799.20190925141453.94a97fd570706f2f at mail.COMPANY.com>:
> marked message to be discarded if not explicitly delivered (discard action)
> Sep 25 16:24:00 mail-rc1 postfix/lmtp[7040]: 4D27690AC:
> to=<USERNAME at mail.COMPANY.com>, orig_to=<USER.NAME at COMPANY.com>,
> relay=mail-rc1.bvd.COMPANY.x[private/dovecot-lmtp], delay=545,
> delays=545/0.09/0.02/0.01, dsn=2.0.0, status=sent (250 2.0.0
> <USERNAME at mail.COMPANY.com> DBcCEYB4i11qGwAATXMPig Saved)
>
> As the duplicate extension has already seen the mail, it is now
> immediately discarded.
>
> RFC 7352 however explicitly states:
>
>     Implementations MUST only update the internal duplicate-tracking list
>     when the Sieve script execution finishes successfully.  If failing
>     script executions add the unique ID to the duplicate-tracking list,
>     all "duplicate" tests in the Sieve script would erroneously yield
>     "true" for the next delivery attempt of the same message.
>
> Dovecot seems not to honour this specification.
>
> Maybe this is because the "before_script" is not the script that fails,
> but the subsequent scripts fail?
> Am I missing some configuration option that would propagate the
> subsequent failure back to the before_script?
> Or is this a general limitation of the before_script mechanism?
>
> Any help appreciated how to alleviate this issue!

This is most definitely a bug.

Regards,

Stephan.

>
> Best regards
>
> Hanno
>
> ---
>
> Filesystem: ext4
>
> Dovecot config:
>
> # 2.2.27 (c0f36b0): /etc/dovecot/dovecot.conf
> # Pigeonhole version 0.4.16 (fed8554)
> # OS: Linux 4.9.0-11-amd64 x86_64 Debian 9.11
> auth_cache_negative_ttl = 0
> auth_cache_size = 1 M
> auth_cache_ttl = 2 hours
> auth_mechanisms = plain login
> auth_username_format = %Ln
> mail_gid = vmail
> mail_home = /var/mail/vhosts/mail.COMPANY.com/%n
> mail_location = maildir:~/.dovecot
> mail_plugins = " acl"
> mail_privileged_group = vmail
> mail_uid = vmail
> mailbox_list_index = yes
> 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 mime foreverypart
> extracttext editheader imapflags notify
> namespace {
>    hidden = yes
>    list = no
>    location = maildir:~/.dovecot-top-namespace
>    prefix =
>    separator = .
>    subscriptions = yes
>    type = private
> }
> namespace {
>    location =
> maildir:/var/mail/vhosts/mail.COMPANY.com/%%n/.dovecot:INDEXPVT=/var/mail/vhosts/mail.COMPANY.com/%n/.dovecot/shared/%%n
>    prefix = shared.%%u.
>    separator = .
>    subscriptions = no
>    type = shared
> }
> namespace inbox {
>    inbox = yes
>    location =
>    mailbox Drafts {
>      special_use = \Drafts
>    }
>    mailbox Junk {
>      special_use = \Junk
>    }
>    mailbox Sent {
>      special_use = \Sent
>    }
>    mailbox "Sent Messages" {
>      special_use = \Sent
>    }
>    mailbox Trash {
>      special_use = \Trash
>    }
>    prefix = INBOX.
>    separator = .
> }
> passdb {
>    args = /etc/dovecot/dovecot-ldap.conf.ext
>    driver = ldap
> }
> plugin {
>    acl = vfile
>    acl_shared_dict = file:/var/lib/dovecot/db/shared-mailboxes.db
>    sieve =
> file:/var/mail/vhosts/mail.COMPANY.com/%n/.sieve/sieve;active=/var/mail/vhosts/mail.COMPANY.com/%n/.sieve/.dovecot.sieve
>    sieve_after = /var/mail/sieve/global-after.sieve
>    sieve_before = /var/mail/sieve/global-before.sieve
>    sieve_default = /var/mail/sieve/global.sieve
>    sieve_extensions = +imapflags +notify +editheader
>    sieve_global = /var/mail/sieve
> }
> protocols = imap lmtp sieve
> service auth-worker {
>    user = vmail
> }
> service auth {
>    unix_listener /var/spool/postfix/private/auth {
>      group = postfix
>      mode = 0600
>      user = postfix
>    }
>    unix_listener auth-userdb {
>      mode = 0600
>      user = vmail
>    }
>    user = dovecot
> }
> service imap-login {
>    inet_listener imap {
>      port = 0
>    }
>    inet_listener imaps {
>      port = 993
>      ssl = yes
>    }
>    process_limit = 9000
> }
> service imap {
>    process_limit = 9000
> }
> service lmtp {
>    unix_listener /var/spool/postfix/private/dovecot-lmtp {
>      group = postfix
>      mode = 0600
>      user = postfix
>    }
> }
> service pop3-login {
>    inet_listener pop3 {
>      port = 0
>    }
>    inet_listener pop3s {
>      port = 0
>    }
> }
> ssl = required
> ssl_cert = </etc/letsencrypt/live/mail.COMPANY.com/fullchain.pem
> ssl_key =  # hidden, use -P to show it
> userdb {
>    args = /etc/dovecot/dovecot-ldap.conf.ext
>    driver = ldap
> }
> protocol lmtp {
>    mail_plugins = " sieve"
> }
> protocol lda {
>    mail_plugins = " sieve"
> }
> protocol imap {
>    mail_max_userip_connections = 30
>    mail_plugins = " acl imap_acl"
> }
> protocol sieve {
>    mail_debug = yes
> }



More information about the dovecot mailing list