Postfix(虚拟用户)+ dovecot + sieve:信封不包含原始收件人

Postfix(虚拟用户)+ dovecot + sieve:信封不包含原始收件人

我已经按照以下方式设置了我的电子邮件服务器ISPMail 教程使用 postfix + dovecot + sieve 中的虚拟用户。我的问题是:envelopsieve 中的“变量”不包含原始收件人。


我有一个邮件帐户,我们将其称为,[email protected]并为 Postfix 设置附加别名,所有邮件都发送到上述地址:

[email protected] -> [email protected]
@domain.com -> [email protected]

后者是一个包罗万象的地址。

Postfix 使用以下配置行调用 dovecot master.cfg

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${recipient}

使用 sieve,我想将收到的所有发往 catch-all 地址的邮件放入特定文件夹中。我的 sieve 代码如下所示:

if envelope :is :domain "To" "domain.com" {
  fileinto "special-folder";
}

遗憾的是,这行不通。进一步挖掘后,我发现里面的内容envelop始终是最终送货地址,即[email protected]本例中的内容。我使用以下规则找到了这一点:

if envelope :matches "To" "*" {
  fileinto "${1}";
}

筛子告诉我:

failed to store into mailbox '[email protected]': Mailbox doesn't exist: [email protected].

我已经猜测这一定是 postfix 和 dovecot 之间的某个问题,因为邮件日志告诉我以下内容:

Aug 29 10:38:27 *** dovecot: lda([email protected]): sieve: msgid=<54003C01.1080704@***>: stored mail into mailbox 'INBOX'
Aug 29 10:38:27 *** dovecot: lda([email protected]): Error: sieve: execution of script /var/vmail/example.org/mail/dovecot.sieve failed, but implicit keep was successful (user logfile /var/vmail/example.org/mail/dovecot.sieve.log may reveal additional details)
Aug 29 10:38:27 *** postfix/pipe[12469]: A31A28006B: to=<[email protected]>, orig_to=<[email protected]>, relay=dovecot, delay=0.29, delays=0.18/0.01/0/0.1, dsn=2.0.0, status=sent (delivered via dovecot service)

显然,后缀说明了原始收件人([电子邮件保护]) 和投递至 ( 的邮箱[电子邮件保护]) 但不知何故这些信息在前往鸽舍的途中丢失了?!

答案1

发生此行为是因为您{recipient}在参数中添加了宏dovecot-lda。如所述人管,后缀将用最终收件人(mail.example.org)替换该宏,而不是非原始收件人([电子邮件保护])。


除了解析信封之外,您还可以解析另一个标头,例如X-原始-至. 此标头旨在保留原始收件人在重写或使用别名之前。要启用此标头,请编辑master.cfdovecot 行,使其变为(请注意,已编辑标志参数)

dovecot   unix  -       n       n       -       -       pipe
  flags=DROhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${recipient}

然后你的筛选脚本变成

if header :matches "X-Original-To" "*" {
  fileinto "${1}";
}

有点复杂,但结果是您可以拥有原始收件人及其别名。

答案2

经过一些测试(masegaloeh 的回答并在朋友的帮助下提供了一些有用的提示)有两种方法(两者似乎同样有效):

  1. 使用${original_recipient}而不是${recipient}

    作为人管告诉我们 ”此宏在进行任何地址重写或别名操作之前会扩展为完整的收件人地址“所以这是我的问题的解决方案。因此修改后的命令行master.cf应如下所示

    dovecot   unix  -       n       n       -       -       pipe
      flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -a ${original_recipient}
    
  2. 使用X-Original-To标题告诉 dovecot 将其信封设置为以下标题字段:

    根据 masegaloeh 的建议,我O向标志中添加了告诉 postfix 添加X-Original-To标头的内容。在里面,/etc/dovecot/conf.d/15-lda.conf我告诉 dovecot 将此标头用作其信封:

    lda_original_recipient_header = X-Original-To
    

    正如此配置选项上方的注释告诉我们的那样,我们在通过后缀-a调用时不能使用该选项,dovecot-lda因为它会覆盖此设置。因此master.cf看起来像:

    dovecot   unix  -       n       n       -       -       pipe
      flags=DORhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop}
    

相关内容