这是我的 /etc/postfix/main.cf header_checks 行:
header_checks = regexp:/etc/postfix/maps/header_checks
以下是 header_checks:
/From:.*email@my\.com.(\n|.)*?To:.*email@my\.com./ DISCARD
以下是我尝试匹配的电子邮件标题的一部分:
Received: from localhost (localhost [127.0.0.1])
by mail.server.com (Postfix) with ESMTP id 690649204C0
for <[email protected]>; Mon, 7 Nov 2022 13:27:00 -0600 (CST)
From: "White Carb Tricks" <[email protected]>
To: "email" <[email protected]>
Subject: Clear artery-blocking plaque overnight
Date: Mon, 7 Nov 2022 09:42:42 -0600
正如您所看到的,我正在尝试匹配垃圾邮件发送者伪造的“发件人”和“收件人”以使其看起来像是用户发送的。
如果我通过在线正则表达式工具测试 header_checks 中的正则表达式,它会匹配我想要的“发件人”和“收件人”行。
当我做:
postmap -q $'From: "White Carb Tricks" <[email protected]>\r\nTo: "email" <[email protected]>' regexp:/etc/postfix/maps/header_checks
它按预期返回“DISCARD”。
当我将标题文本粘贴到测试文件中并像这样测试时:
postmap -q - regexp:/etc/postfix/maps/header_checks < /etc/postfix/maps/regex-test
...它返回空白。
我应该注意,Postfix 也不会丢弃它们。用户会继续收到电子邮件。
我也在 master.cf 中更改了这一点:
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_address_mappings
到
-o receive_override_options=no_unknown_recipient_checks,no_address_mappings
...基于我读过的另一个帖子。
你知道我做错了什么吗?是我的 header_checks 中的正则表达式吗?
答案1
它不是那样工作的,正如记录所言man 5 header_checks
(重点是我的):
注意:检查邮件标题一次一个逻辑头,即使邮件头跨越多行。正文行始终一次检查一行。
您可以通过调用 postmap 来测试这一点,其目的是:
# does not mimic header_checks, trues the whole lookup key.
postmap -q $'HA: value\r\nHB: value2' regexp:header_checks.pcre
# does mimic header_checks, one header (including continuation) at a time:
postmap -h -q $'HA: value\r\nHB: value2' regexp:header_checks.pcre
如果您想一次匹配多个标头,请插入适合此目的的工具。针对垃圾邮件反击用例的热门选择包括 SpamAssassin(已过时,但仍有效)和 Rspamd。
如果你想让人们停止使用你的域名,查看DMARC。