后缀通过smtp中继时强制从地址


28

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

通过仔细配置,我可以设置我的服务以该用户身份发送。但是我不是非常小心的忠实拥护者-我宁愿使用postfix强制解决此问题。有没有办法做到这一点?

Answers:


38

这是在后缀中真正实现的方法。

此配置从本地发起的和中继的SMTP邮件流量更改发件人地址:

/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

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

/ etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

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

/ etc / postfix / header_check:

/From:.*/ REPLACE From: newsender@address.com

如果您使用的是本地中继smtp服务器,那么该功能将非常有用,该服务器可被所有多功能组件和多个应用程序使用。

如果您使用Office 365 SMTP服务器,则任何具有不同于已验证用户本身的电子邮件的发件人地址的邮件都将被拒绝。上面的配置可以防止这种情况。


谢谢!这看起来像我要找的东西。不幸的是,我对Office 365的访问是两项工作。有人可以确认这是否对他们有用吗?
约翰·惠特洛克

1
我可以。我在Office 365中使用它。–
Jasper

1
使用sender_canonical_mapspostfix时,无法将被拒绝的邮件保存到本地假脱机中,而是尝试通过中继无限地发送它
盆地

2
@Jasper仅供参考,我发现更改上述配置行更加容易postconf -e sender_canonical_classes=envelope_sender,header_sender postconf -e sender_canonical_maps=regexp:/etc/postfix/sender_canonical_maps postconf -e smtp_header_checks=regexp:/etc/postfix/header_check
Jacob Evans

有一个类似的问题,sender_canonical_classes = wallet_sender保存了我的一天!
斯蒂芬·里希特

13

可选的通用表指定一个地址映射,该地址映射在从服务器传递(发送)邮件时适用。

这与规范映射相反,规范映射在服务器接收邮件时适用。

(注意:FROM和TO地址都匹配,以替换任何通用表和规范表。)

其他解释还说明了在服务器接收邮件时使用规范表。

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

根据postfix文档

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    user@localdomain.local      account@isp.example.com
    @localdomain.local          wholedomain@isp.example.com

然后做:

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

参考文献:


1
这有效,但是如何更改FROM名称?
乔安娜·米卡莱

我对通用映射的经验是,它将识别FROM和TO地址,使用规范映射按OP要求仅强制使用FROM地址
doz87

是否可以使用正则表达式更改发件人的邮件并匹配发件人地址?
WM

@ doz87 FROM和TO都将被规范图和通用图匹配。我已经更新了答案,以解释两张地图之间的区别。
Jocelyn

@WM是的,您可以使用regexp。我从未尝试过,但是您可能必须更改hash:regexp:main.cf并使用/foo.*@localdomain.local/ account@example.com通用映射中的行。手册页对此
Jocelyn

7

更新:在一位IT朋友的建议下,我在所有服务器上运行后缀,而不是制造一台云邮件服务器。到目前为止,这是我的解决方案:

/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 relayer@hosteddomain.com: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 relayer@hosteddomain.com
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal relayer@hosteddomain.com

/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:           awsadmins@hosteddomain.com

/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

我很高兴的事情:

  • 许多邮件被发送到root用户,其中一行alias指示谁接收它。
  • 来自本地用户的所有邮件都转换为来自的邮件relayer@hosteddomain.com,因此它通过MS Online SMTP服务器获取。
  • postfix的文档比sendmail更好。

我不满意的事情:

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

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


4

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

例:

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

/ etc / postfix / login-map:

mail1@domain    userlogin
mail2@domain    userlogin, otheruser@example.com

它确实适用于发送,它也适用于中继。


目的是在排队时重写发件人地址吗?我的印象是smtpd_sender_login_maps用于拒绝发件人(作为smtpd_sender_restrictions的一部分),而不是将登录名转换为电子邮件地址。有了这个功能后,echo "This is a test" | /usr/sbin/sendmail test@example.com邮件仍来自user@domU-DE-AD-BE-EF-00-01.compute-1.internal
约翰·惠特洛克)2010年

不好,我以某种方式了解您确实授权使用Postfix。在这种情况下,smtpd_sender_login_maps将限制哪些用户可以使用什么发送者地址。
丝绸

这可能最终成为我最终解决方案的一部分。我可以拒绝前端上除一个发件人地址之外的所有地址,并通知邮局主管任何前端被拒绝的情况,以便在服务配置不正确时通知我。我正在查看smtp_generic_maps,以查看是否可以使用它们将所有本地帐户修改为“一个真实的发件人地址”。但是,我需要重新阅读postfix文档,以了解它如何确定本地帐户-AWS DNS与我的直觉不符。
John Whitlock 2010年

0

我使用规范映射来重写发件人地址,例如将root @ app01重写为no-reply@example.com。


3
欢迎来到服务器故障!我们确实更愿意答案包含内容而不是内容的指针。虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
user9517支持GoFundMonica 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.