我已经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的回答和朋友的帮助提供了一些有用的提示),有两种方法(两者似乎同样好):
使用${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}
使用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}