在 Postfix 上彻底改变收件人

在 Postfix 上彻底改变收件人

我想要实现的是,任何发送至的电子邮件[email protected]都会被重写[email protected]并发送给[email protected]

canonical_maps和都virtual_alias_maps用于将信息传递给替代收件人。当我读到文档它告诉我,使用canonical_mapscleanup可以进行完全重写。

但实际上,电子邮件中仍保留to原始收件人的姓名。因此,当查看 Bob 邮箱中的电子邮件时,它会显示一封发给 Joe 的电子邮件。

不知怎的,我感觉这里缺少了一些东西。

配置:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
bounce_queue_lifetime = 2d
canonical_maps = hash:/etc/postfix/canonical
config_directory = /etc/postfix
header_checks = pcre:/etc/postfix/header_checks
home_mailbox = Maildir/
html_directory = /usr/share/doc/postfix/html
inet_interfaces = all
mailbox_size_limit = 0
maximal_queue_lifetime = 4d
milter_default_action = accept
milter_protocol = 2
mydestination = ...
myhostname = ...
mynetworks = ...
myorigin = /etc/mailname
non_smtpd_milters = inet:localhost:8891
readme_directory = /usr/share/doc/postfix
recipient_delimiter = +
relayhost =
smtp_fallback_relay = ...
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_milters = inet:localhost:8891
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/recipient_access        permit_mynetworks       reject_unauth_destination
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
transport_maps = hash:/etc/postfix/transport
virtual_alias_maps = hash:/etc/postfix/virtual

日志:

Sep 25 09:40:30 server1 postfix/smtpd[28285]: connect from mail-la0-f66.google.com[209.85.215.66]
Sep 25 09:40:31 server1 postfix/smtpd[28285]: 7CA784EDB6: client=mail-la0-f66.google.com[209.85.215.66]
Sep 25 09:40:31 server1 postfix/cleanup[28339]: 7CA784EDB6: message-id=<CAJjncucnGM532xhcn37VAwmwQoYEwOUfE_A33-oyJJH5PqPUcA@mail.gmail.com>
Sep 25 09:40:31 server1 postfix/qmgr[7593]: 7CA784EDB6: from=<[email protected]>, size=1813, nrcpt=1 (queue active)
Sep 25 09:40:32 server1 postfix/smtpd[28285]: disconnect from mail-la0-f66.google.com[209.85.215.66]
Sep 25 09:40:32 server1 postfix/smtp[28593]: 7CA784EDB6: enabling PIX workarounds: disable_esmtp delay_dotcrlf for ...[...]]:25
Sep 25 09:40:33 server1 postfix/smtp[28593]: 7CA784EDB6: to=<[email protected]>, orig_to=<[email protected]>, relay=...[...]:25, delay=1.6, delays=0.45/0/0.42/0.73, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 98F729600E)
Sep 25 09:40:33 server1 postfix/qmgr[7593]: 7CA784EDB6: removed

答案1

从 mail.log 来看,您似乎想要从远程客户端重写电子邮件。postfix rewrite 的默认设置可防止这种情况发生。

摘录自Postfix 重写自述文件

Postfix 2.2 版为您提供了两种选择:要么完全不重写来自远程 SMTP 客户端的邮件头,要么将此类邮件头中的不完整地址标记为无效。其工作原理如下:

  • Postfix 总是重写来自本地 SMTP 客户端和 Postfix sendmail 命令的消息头,并将自己的域附加到不完整的地址。该local_header_rewrite_clients参数控制 Postfix 认为哪些 SMTP 客户端是本地的(默认情况下,只有本地网络接口地址)。

  • remote_header_rewrite_domain当参数值为空(默认设置)时,Postfix 永远不会重写来自远程 SMTP 客户端的邮件头地址。

  • 否则,Postfix 会重写来自远程 SMTP 客户端的邮件头,并将remote_header_rewrite_domain值附加到不完整的地址。此功能可用于附加保留域(如“domain.invalid”),这样不完整的地址就不会被误认为是本地地址。

因此,最简单的解决方案是不要让参数remote_header_rewrite_domain为空。您需要为该参数提供值,例如

remote_header_rewrite_domain = domain.invalid

或者您可以使用static:all参数local_header_rewrite_clients,这样 Postfix 就会将所有远程客户端视为本地。

local_header_rewrite_clients = static:all

来源:Postfix 地址重写的官方文档

相关内容