我们有一个设置,其中 postfix 通过 Amazon SES 中继发送邮件。除电子邮件转发外,一切正常。
虽然这个话题至少已经讨论过了这里和这里,还有一些点我无法理解。
问题是,Amazon SES 不会发送From:
未经验证的电子邮件。因此,当内部地址想要转发到外部地址并且发件人也是外部地址时,邮件将无法发送。
为了解决这个问题,我们目前在 main.cf 中使用以下配置
header_checks = regexp:/etc/postfix/first_header_checks
smtp_header_checks = regexp:/etc/postfix/second_header_checks
sender_canonical_maps = regexp:/etc/postfix/sender_canonical
sender_canonical_classes = envelope_sender
smtpd_data_restrictions = check_sender_access pcre:/etc/postfix/sender_access
使用 first_header_checks
/^From:(\s)?(.*)/i PREPEND X-Original-From: $2
/^To:(\s)?(.*)$/i PREPEND X-Original-To: $2
second_header_checks
/^From:(.*)/i REPLACE From: <[email protected]>
sender_canonical
/.*/ [email protected]
发件人访问
/(.*)/ prepend Reply-To: <$1>
这对于收到的邮件非常有用。[电子邮件保护]发送邮件至[电子邮件保护]并转发至[电子邮件保护]
Reply-To: <[email protected]>
X-Original-To: <[email protected]>
To: [email protected]
From: <[email protected]>
X-Original-From: <[email protected]>
问题是,这也发生在从服务器发出的邮件上。比如说[电子邮件保护]发送邮件时,发件人将被重写为无回复,并将设置回复。我想修复这个问题。邮件标题只应对将要转发的来信进行重写。
我曾尝试使用类似的正则表达式!/^From:(\s)?(.*@verified-domain\.com)/
,但到目前为止还没有成功。
答案1
Postfix 2.1 及更高版本支持regex
和pcre
表中的条件运算符。 在你的情况下,second_header_checks
使用这些条件应该如下所示:
if !/^From:(.*)@verified-domain.com/i
/^From:(.*)/i REPLACE From: <[email protected]>
endif
您可以测试查找表而不需要实际发送任何如下内容:
peter@mail:~peter $ cat msgheaders
From: <[email protected]>
To: [email protected]
peter@mail:~peter $ postmap -hmq - regexp:/etc/postfix/second_header_checks < msgheaders
From: <[email protected]> REPLACE From: <[email protected]>
peter@mail:~peter $ cat msgheaders-1
From: <[email protected]>
To: [email protected]
peter@mail:~peter $ postmap -hmq - regexp:/etc/postfix/second_header_checks < msgheaders-1
peter@mail:~peter $
答案2
我试图用不同的电子邮件服务做与此非常相似的事情,下面是我解决问题的方法(从这个帖子中得到很多帮助后):
- 设置传输图,将下一跳设置为外部目标示例的本地运行的 smtp 守护程序:
[email protected] smtp:localhost:9999
- 将新的本地运行的 smtp 守护进程添加到 master.cf,将标头检查、规范映射和 canonical_classes 仅应用于此守护进程
- 在本地运行的守护进程上使用 content_filter 指向外部目标的 mx 服务器。我的看起来像这样
-o content_filter=smtp:[mx.somedomain.com]:25
- 您可能需要修改本地运行的守护程序上的 smtpd_recipient_restrictions,以允许它充当中继。例如:(
-o smtpd_recipient_restrictions=permit_mynetworks,defer
这可能不是理想的选择,在推送直播之前请仔细检查安全策略)
祝你好运,如果你需要更多详细信息,我可以尽力提供帮助。