Postfix 和 Office 365:中继所有出站电子邮件(包括本地电子邮件),但递送入站电子邮件

Postfix 和 Office 365:中继所有出站电子邮件(包括本地电子邮件),但递送入站电子邮件

我们正在慢慢地从 Postfix/Dovecot 迁移到 Office 365,目标是一次启用几个用户。我们域的邮件应该进入 Office 365,然后如果在 Office 365 中找不到地址匹配,它应该被转发到 Postfix,后者将其发送到 Dovecot 邮箱(我们使用虚拟用户设置,所有用户都存储在单独的 LDAP 服务器中)。这允许我们对已设置的用户使用 Office 365,但对于尚未设置的用户,邮件将发送到现有的 Postfix/Dovecot 系统。

我已经关注这些说明制作连接器等,它就可以正常工作 - 将 EOP IP 列入白名单后,Office 365 将顺利交付给 Postfix。问题是让事情朝着相反的方向发展。所有外发电子邮件都应通过 Office 365 中继,如果我设置一个relayhost变量并从中删除我们的本地域,mydestinations那么这就可以正常工作……但 Postfix 将不会传递任何传入邮件(导致退回循环)。如果我保留我们的域,那么mydestinations邮件将在本地传递,而不会经过中继,这意味着仍在 Postfix 系统上的用户无法向 Office 365 用户发送电子邮件。

有没有办法强制所有出站电子邮件(包括本地传送的)通过中继,但仍接受同一域的入站电子邮件?我昨天一直在碰壁,我能想到的唯一真正解决方案是运行两个单独的 Postfix 实例 - 一个中继所有内容,另一个仅用于传入邮件。但肯定有办法只用一个实例来做到这一点?我搜索过,但似乎到处都只是假设你只中继电子邮件而不做其他事情。

postconf -n 如下所示(域名更改为 example.com)。我删除了为尝试让 Office 365 进行中继而进行的所有更改:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
content_filter = smtp-amavis:[127.0.0.1]:10024
dovecot_destination_recipient_limit = 1
inet_interfaces = all
inet_protocols = all
mailbox_command = /usr/lib/dovecot/deliver
mailbox_size_limit = 0
mailbox_transport = dovecot
message_size_limit = 20480000
mydestination = $myhostname, silver.example.com, localhost.example.com, localhost, example.com
myhostname = smtp.example.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/24 192.168.10.0/24
myorigin = /etc/mailname
readme_directory = no
receive_override_options = no_address_mappings
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
recipient_delimiter = +
relayhost =
smtp_tls_note_starttls_offer = yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/recipient_access, check_sender_access hash:/etc/postfix/sender_access, check_sender_access cidr:/etc/postfix/o365, reject_authenticated_sender_login_mismatch, permit_sasl_authenticated, permit_mynetworks, reject_invalid_hostname, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, reject_unauth_destination, reject_rbl_client bl.spamcop.net, reject_rbl_client b.barracudacentral.org, reject_rbl_client zen.spamhaus.org, reject_rbl_client cbl.abuseat.org
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_sender_login_maps = hash:/etc/postfix/local_senders, ldap:/etc/postfix/ldap_senders.cf
smtpd_tls_CAfile = /etc/ssl/certs/example.com.cabundle
smtpd_tls_cert_file = /etc/ssl/certs/example.com.crt
smtpd_tls_key_file = /etc/ssl/private/example.com.key
smtpd_tls_loglevel = 1
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes
tls_random_source = dev:/dev/urandom
virtual_alias_domains = events.example.com
virtual_alias_maps = hash:/etc/postfix/redirect, ldap:/etc/postfix/ldap_virtual_users.cf, ldap:/etc/postfix/ldap_virtual_groups.cf
virtual_transport = dovecot

为了获得所有邮件中继,我可以设置relayhost = example-com.mail.protection.outlook.com并从列表中删除 example.com mydestinations,这可以使 Office 365 的传递正常工作,但会破坏旧系统。

我研究过尝试transport_maps通过中继发送特定电子邮件地址的所有电子邮件(即移动到 Office 365 的电子邮件),其他一切都可以在本地运行,但其中的值似乎总是被忽略。

我完全没有主意了,所以如果有人有想法的话我会很感激。

答案1

好吧,我对此并不完全满意,但我让它工作了。我觉得还有一种更直接的方法,但我搞不清楚。

经过进一步的研究,我发现virtual_alias_maps运行中的任何内容transport_maps,这就是我认为它被忽略的原因。因此,如果您有地址被重写,那么虚拟别名重写的输出需要与您要输入的内容相匹配transport_maps。然后我的transport_maps哈希看起来像这样:

[email protected]        smtp:example-com.mail.protection.outlook.com
@example.com  :
*       :

这将导致电子邮件发送至[电子邮件保护]中继到 Office 365,但其他所有内容都在本地传送。

它确实有效,但我仍然觉得有更好的方法来解决这个问题。

相关内容