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

我已经build立了我的电子邮件服务器跟随ISPMail教程与虚拟用户在后缀+ dovecot + sieve。 我的问题是:筛中的envelop “variables”不包含原始收件人。


我有一个邮件帐户,我们称之为[email protected]和为postfix设置的其他别名,这些别名都提供给上述地址:

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

后者是一个全面的地址。

使用master.cfg的以下configuration行后缀调用dovecot:

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

用筛我想把收到的所有邮件收件人地址到一个特定的文件夹。 我的筛码看起来像这样:

 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) 

很明显,后缀指出原来的收件人([email protected])和邮箱([email protected]),但不知怎的,这种信息迷路了,以鸽子?

发生此行为是因为您在dovecot-lda参数中添加了{recipient}macros。 正如manpipe道中所述,postfix将用最终收件人(mail.example.org)replace该macros,而不是原来的([email protected])。


而不是parsing信封,您可以parsing另一个标题,如X-Original-To 。 此标题旨在保留原来的收件人重写或别名之前。 要启用这个头文件,编辑master.cf使dovecot行成为(注意标志参数被编辑)

 dovecot unix - nn - - 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}"; } 

有点复杂,但结果是你可以有原始收件人和别名。

经过一些testing( masegaloeh的回答和朋友的帮助提供了一些有用的提示),有两种方法(两者似乎同样好):

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

    正如man pipe告诉我们的:“ 这个macros在任何地址重写或别名之前扩展到完整的收件人地址 ”,所以这是我的问题的解决scheme。 所以master.cf修改的命令行应该看起来像

     dovecot unix - nn - - 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将它的信封设置到这个头字段:

    由于masegaloehbuild议我把O添加到告诉后缀添加X-Original-To头的标志。 在/etc/dovecot/conf.d/15-lda.conf里面我告诉dovecot使用这个头信封:

     lda_original_recipient_header = X-Original-To 

    正如上面这个configuration选项的注释告诉我们的,当通过postfix调用dovecot-lda时,我们不能使用-a选项,因为它覆盖了这个设置。 因此, master.cf看起来像:

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