我正在尝试从我们的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服务器。 事情我不高兴:
passwd
名称技巧并不总是工作,并且可能很难找出邮件来自哪个服务器。 warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list
(SMTP服务器在STARTTLS
之前发送空的AUTH
列表,但在之后的AUTH LOGIN
)。 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选项,但我不确定当证书更新时邮件传递是否中断) 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]。