在 Postfix 2.10.2 中,我设置了多个域和多个虚拟别名,用于将邮件地址分配给本地用户。只要我不添加 catchall,它就可以正常工作。
在使用虚拟别名之前,我定义了一个
local_recipient_maps =
luser_relay = catchall
但由于我需要整理来自不同域的邮件地址,所以我不得不使用虚拟别名。
现在postfix.org说我应该这样做,我就这么做了:
/etc/postfix/main.cf:
virtual_alias_domains = example.com
virtual_alias_maps = hash:/etc/postfix/virtual
在/etc/postfix/虚拟:
[email protected] account1
[email protected] account1
[email protected] account2
@example.com catchall
但如果我这样做,catchall 地址会抓取我的所有邮件,而不仅仅是未明确定义地址的邮件。为什么会这样?我该如何更改?
我执行了 postmap virtual,还重新启动了 Postfix。日志中没有错误,它只是记录了到 catchall 地址的传递。并且有一个警告“不要在 mydestination 和 virtual_alias_domains 中同时列出域 example.com”,但我没有这样做!我甚至没有 mydestination 指令。(下面的配置中有一个,但我在 NickW 建议后添加了它。)
以下是我的完整信息:
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
config_directory = /etc/postfix
home_mailbox = Maildir/
inet_interfaces = all
inet_protocols = all
mailbox_command = /usr/lib/dovecot/deliver -c /etc/dovecot/dovecot.conf -m "${EXTENSION}"
mailbox_size_limit = 0
mydestination = $myhostname
myhostname = mydomain.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_use_tls = yes
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_path = private/dovecot-auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/dovecot/dovecot.pem
smtpd_tls_key_file = /etc/dovecot/private/dovecot.pem
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_mandatory_protocols = SSLv3, TLSv1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
tls_random_source = dev:/dev/urandom
virtual_alias_domains = $myhostname, myotherdomain.com
virtual_alias_maps = hash:/etc/postfix/virtual
答案1
所以,我找到了答案。有些人建议将 catch-all 放在虚拟别名文件的顶部,但我之前尝试过,但没用(尽管我发现这个解决方案非常合乎逻辑)。
有效的是:
- 设置
mydestination=localhost
(不是$myhostname
) - 在虚拟别名文件的顶部添加 catchall:
@domain.com catchall-account@localhost
- 添加以下所有其他虚拟别名:
[email protected] contact@localhost
该示例假设您有名为catchall-account
和 的UNIX 用户contact
。邮件发送至[电子邮件保护]将被递送给联系用户,而所有其他邮件将被递送到 catch-all 帐户。
也许这不是在所有情况下都需要的,但在我的特殊情况下,我想使用一个帐户来保存某些地址的邮件,但直接发送到该帐户的邮件最终应该进入全部收集器。
毕竟,Postfix 似乎无法从上到下通过虚拟别名工作,而且 catch-alls 还具有一些特殊优先级。如果有人真的能够解释这种行为,我将很高兴收到进一步的评论。
答案2
如果您在虚拟别名中包含捕获所有电子邮件地址,那么它就会起作用。
在main.cf
:
virtual_alias_maps = hash:/etc/postfix/virtual
在virtual
:
[email protected] [email protected]
[email protected] [email protected]
...
[email protected] [email protected]
@example.com [email protected]
答案3
重要的是真实的邮箱用户还放入虚拟别名查找中。这解决了别名优先于真实帐户这一事实。因此,这与条目的顺序无关,也与 mydestination 的设置无关,您只需将真实邮箱也添加为别名,catchall 将按预期工作,仅收集未定义地址的邮件。
所以最后你的查找必须是这样的
@example.org [email protected]
[email protected] [email protected]
[email protected] [email protected]
[email protected] [email protected]
这样,“actually-exists”、“concrete-alias1”和“concrete-alias2”的邮件都会发送给“actually-exists”,即系统上实际存在的用户,而所有其他可能收件人的邮件都会被塞进“catchall”。
呼喊这文章中的提示。已使用 Postfix 3.4.13 进行确认。
答案4
尝试设置您的mydestination = $myhostname
,并确保您的主机名在 main.cf 中配置,例如myhostname = mail.example.com
。