使用 Postfix (2.11.3) 我想将所有邮件重定向到外部地址。
/etc/postfix/main.cf
:
virtual_alias_maps = regexp:/etc/postfix/rewrite
/etc/postfix/rewrite
:
/^.+$/ [email protected]
发送邮件至[email protected]
,出现以下错误:
[...] to=<[email protected]>, orig_to=<[email protected]> [...] status=bounced (User unknown in virtual alias table)
文档说:
有效的收件人地址与 virtual_alias_maps 参数一起列出。 Postfix SMTP 服务器通过“虚拟别名表中的用户未知”拒绝无效收件人。
事实证明,该错误与虚拟别名域的验证有关:virtual_alias_domains
默认情况下$virtual_alias_maps
,将其设置为其他任何内容(设置为不匹配的域,甚至将其留空)可以解决该问题。
我找到的另一个解决方案在一个答案中以另一种形式给出正则表达式:
/^.+@.+$/ [email protected]
所以我的问题是,当使用正则表达式表进行虚拟别名时,别名域的验证如何工作?为什么设置virtual_alias_domains
为其他值可以解决问题?上述两种地址映射方式的等效模式有何不同?
的输出postconf -n
是:
config_directory = /etc/postfix
inet_interfaces = loopback-only
inet_protocols = ipv4
mydestination =
myhostname = example.org
myorigin = $myhostname
virtual_alias_domains =
virtual_alias_maps = regexp:/etc/postfix/rewrite
答案1
假设您有一封邮件需要[email protected]
投递。
中指定的映射virtual_alias_domains
使用域部分 ( ) 作为键进行查找example.net
,如果它是虚拟别名域,则期望返回任何内容,否则不返回任何内容,即该键应该是未定义的。virtual_alias_maps
使用完整地址 ( ) 作为键来查找中的映射[email protected]
,预计返回重写的地址。
这意味着您可以为两次查找共享一个映射文件,就像/etc/postfix/virtual
中解释的简单哈希映射一样虚拟 (5)。 Postfix ( ) 的默认配置virtual_alias_domains = $virtual_alias_maps
是假设这种混合风格的地图。
example.net OK
[email protected] [email protected]
[email protected] [email protected]
这些查找的重要规则是:
virtual_alias_maps
被递归查找。如果它返回与密钥相同的地址,则使用该地址。- 如果最后返回的重写地址
virtual_alias_maps
仍在 中virtual_alias_domains
,则认为查找失败(User unknown in virtual alias table
)。这似乎没有明确记录,我已经了解到这个线程。
因此,您的第一个正则表达式映射()和配置是有问题的,因为映射匹配所有内容,因此仍然存在并被退回。/^.+$/ [email protected]
[email protected]
virtual_alias_domains
您可以通过在 中不指定任何内容来避免这种情况virtual_alias_domains
,或者使用与单个域字符串不匹配的另一个正则表达式映射()。/^.+@.+$/ [email protected]
但在我看来,它们中的任何一个都不是正确的配置,而是一种不直观的解决方法。我认为会有更适合您目的的解决方案。