我已运行 Postfix,并在 master.cf 中配置了许多 smtpd 进程,如下所示:
# Internet facing one
1.2.3.4:25 inet n - y - - smtpd
-o ... # internet-only overrides
# Internal facing one
10.0.0.1:10026 inet n - y - - smtpd
-o ... # internal-only overrides
现在,我想添加一个具有静态名称和值的标题,以传入邮件取决于它是在哪个 smtpd 上接收的。
例子:
X-Gert-Postfix-Received-From: the evil internet
我考虑的选择:
添加
header_checks
选项并使用PREPEND
文件中的操作。快到了,但是:
- 它需要匹配现有的标题,然后在后续匹配中再添加一个。
- 我并不总是已经拥有某个特定的标题,例如,甚至可能
From
缺少一个。 - 如果您已经存在,我认为
header_checks
没有简单的方法来堆叠两个文件。header_check
构建一个使用Milter 协议并将其与 Postfix 连接起来
smtpd_milters
。当然,这可行。我可以在自己的应用程序中检查邮件,然后在那里注入邮件头。对于添加邮件头这样的简单任务来说,这似乎过于复杂了。此外,它需要额外的维护,需要运行另一个守护程序应用程序、相当多的样板代码等。
根据评论中的建议,使用
check_recipient_access
(相关问答)。与
header_checks
(见1)有相同的缺点。
我感觉我忽略了一些简单的事情。有人有更好的主意吗?
答案1
如果您有现有的 header_checks,我认为没有简单的方法来堆叠两个 header_check 文件。
实际上有一种方法可以让每个守护进程拥有多个独立的 header_checks 文件。
每个-omaster.cf 中的选项会覆盖 main.cf 中的默认值或任何 postfix 配置参数。要为每个守护进程设置不同的 header_checks(例如/etc/postfix/header_checks1和/etc/postfix/header_checks2),你必须覆盖每一个header_checks范围:
# Internet facing one
1.2.3.4:25 inet n - y - - smtpd
-o header_checks = regexp:/etc/postfix/header_checks1
# Internal facing one
10.0.0.1:10026 inet n - y - - smtpd
-o header_checks = regexp:/etc/postfix/header_checks2
这样你将拥有完全独立的header_checks每个 smtpd 守护进程的文件数。从那里,您可以添加规则,将您谈论的标签添加到前面。
答案2
要解决的限制smtpd_*_restrictions
:
一条消息(即使是发件人为“空”的消息)也只有一个信封发件人。因此请使用check_sender_access
而不是check_recipient_access
。使用的查找类型可以是 ,static:
因为我们不关心返回路径的细节。在任何检查生成结果之前,将其添加到 smtpd_sender_restrictions 列表中ACCEPT
(postfix 不会查询超出范围的其他查找)。
# in main.cf
common_sender_restrictions =
reject_non_fqdn_sender
reject_unknown_sender_domain
..
internet_sender_restrictions =
$common_sender_restrictions
check_sender_access static:{PREPEND X-Gert-Postfix-Received-From: the evil internet}
# in master.cf
192.0.2.0:25 inet n - y - - smtpd
-o smtpd_sender_restrictions=$internet_sender_restrictions
10.0.0.1:10026 inet n - y - - smtpd
-o smtpd_sender_restrictions=$common_sender_restrictions