当postfix通过smtp继电器时强制发件人地址

我正在尝试从我们的AWS EC2实例获取电子邮件报告。 我们正在使用Exchange Online(Microsoft Online Services的一部分)。 我已经设置了一个专门用于SMTP中继的用户帐户,并且我已经设置了Postfix来满足通过这个服务器中继消息的所有要求。 但是,除非发件人地址与validation地址完全匹配,否则Exchange Online的SMTP服务器将拒绝邮件(错误消息是550 5.7.1 Client does not have permissions to send as this sender )。

通过仔细的configuration,我可以设置我的服务作为这个用户发送。 但我不是一个很小心的粉丝 – 我宁愿有postfix强制这个问题。 有没有办法做到这一点?

这是如何在后缀中真正做到这一点。

此configuration从本地发起和中继的SMTP邮件stream量更改发件人地址:

/etc/postfix/main.cf文件:

 sender_canonical_classes = envelope_sender, header_sender sender_canonical_maps = regexp:/etc/postfix/sender_canonical_maps smtp_header_checks = regexp:/etc/postfix/header_check 

从源自服务器本身的电子邮件重写信封地址

/等/后缀/ sender_canonical_maps:

 /.+/ [email protected] 

从SMTP中继的电子邮件地址中重写

/等/后缀/ header_check:

 /From:.*/ REPLACE From: [email protected] 

这是非常有用的,如果你是例如使用本地中继smtp服务器,所有你的多function和多个应用程序使用。

如果您使用的是Office 365 SMTP服务器,则任何发件人地址不同于经过身份validation的用户本身的电子邮件的邮件都将被拒绝。 上面的configuration阻止了这一点。

可选的通用表指定了邮件从服务器传送(发送)时适用的地址映射。

这与规范映射相反,它适用于邮件被服务器接收的情况。

(注意:FROM和TO地址都是匹配的,用于replace任何通用表和规范表。)

当邮件被服务器接收时使用规范表已经解释了其他答案。

使用smtp_generic_maps 从服务器发送邮件时,可以重写FROM地址。

根据postfix文档 :

 /etc/postfix/main.cf: smtp_generic_maps = hash:/etc/postfix/generic /etc/postfix/generic: [email protected] [email protected] @localdomain.local [email protected] 

然后做:

 sudo postmap /etc/postfix/generic sudo /etc/init.d/postfix reload 

参考文献:

更新:在IT朋友的build议下,我在所有服务器上运行postfix,而不是制作一个云邮件服务器。 到目前为止,我的解决scheme是:

/etc/postfix/main.cf

 # output of hostname -f - mail from local users appears to come from here myhostname = domU-01-02-03-04-05-06.compute-1.internal # Local delivery - include all 127.0.0.1 aliases from /etc/hosts mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts # Needed for address translation to work myorigin = $mydomain # Talking to MS Online # :submission = port 587 relayhost = [smtp.mail.microsoftonline.com]:submission smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = # Yes, leave empty smtp_tls_security_level = encrypt smtp_generic_maps = hash:/etc/postfix/generic # Enable if you need debugging, but it does leak credentials to the log #debug_peer_level = 2 #debug_peer_list = smtp.mail.microsoftonline.com # Only listen on the local interfaces (not the public) inet_interfaces = localhost # I left out a bunch of CentOS defaults. postconf -n is your friend. # These are included alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases 

/etc/postfix/sasl_passwd

 # Run postmap /etc/postfix/sasl_passwd after editing # Also, chown root:root; chmod 600 smtp.mail.microsoftonline.com [email protected]:YourP@ssw0rd 

/etc/postfix/generic

 # Run postmap /etc/postfix/generic # I've seen local mail come from either source # output of dnsdomainname @compute-1.internal [email protected] # output of hostname -f @domU-01-02-03-04-05-06.compute-1.internal [email protected] 

/etc/aliases

 # Run newaliases after changing # Lot of stuff here. Mostly, just make sure the graph points to root, such as mailer-daemon: postmaster postmaster: root # And the important part - your email or distribution group root: [email protected] 

/etc/passwd

 # Sometimes it helps to expand the name, so email comes from 'root at aws host 5' # rather than just 'root' # Was #root:x:0:0:root:/root:/bin/bash # Is root:x:0:0:root on aws host 5:/root:/bin/bash 

事情我很高兴:

  • 许多邮件被发送到根,并在alias一行指示谁获得它。
  • 所有来自本地用户的邮件都被翻译成来自[email protected] ,所以它通过MS在线SMTP服务器。
  • 与sendmail相比,postfix有更好的文档。

事情我不高兴:

  • 每个主机都需要自定义更改,以及几个步骤。 我写了一个bash脚本来帮助。
  • passwd名称技巧并不总是工作,并且可能很难找出邮件来自哪个服务器。
  • 发送的每封邮件都会在日志中显示三条警告:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list (SMTP服务器在STARTTLS之前发送空的AUTH列表,但在之后的AUTH LOGIN )。
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (有certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate的一些configuration选项,但我不确定当证书更新时邮件传递是否中断)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (与#2相同)

感谢serverfault社区在邮件服务器上分享强烈的意见。

您可以使用smtpd_sender_login_maps指定地图列表:发件人地址 – 用户。

例:

 smtpd_sender_login_maps = hash:/etc/postfix/login-map 

/等/后缀/login映射:

 mail1@domain userlogin mail2@domain userlogin, [email protected] 

它确实发送,它应该以相同的方式中继。

我使用规范映射来重写发件人地址,例如将root @ app01重写为[email protected]