我们有邮件服务器,它通过我的 sendmail 的 mailertable 配置中的以下配置将仅具有内部域(例如@osp.com,@asp.com)的邮件中继到外部世界。任何发往其他域的电子邮件都会被拒绝。当前的要求是,如果电子邮件标头中存在例如“X-Test”的特定自定义标头,并且从任何其他电子邮件域(当前被拒绝)发送,则中继电子邮件。
我考虑过使用规则集,我得到的最接近的规则集是下面的链接,但它没有用,我不是在寻求解决方案,而是在寻求方向。到目前为止,我已经了解规则/规则集是如何编写的(尽管在 sendmail 中有点复杂)。
osp.net smtp:ms.osp.net
asp.net smtp:ms.osp.net
. procmail:/etc/mail/reject-mail.proc
相关链接: http://bradthemad.org/tech/notes/sendmail_header_filter.php
答案1
“仅在设置时才允许”比链接的“如果设置则拒绝”示例复杂得多;当标头具有特定值时,“如果设置则拒绝”会简单地拒绝消息。 “仅在设置时才允许”必须将适当的消息标记为允许,但同时也在其他地方拒绝所有其他消息。 “仅在设置时才允许”的另一个复杂问题是系统消息(例如来自 cron 的消息)也可能需要被允许,在这种情况下,一揽子拒绝是不够的。另一个问题是您的系统是否允许远程中继;如果是这样,并且如果规则集设计不正确,您可以将您的服务器变成开放中继,供任何设置有问题的标头字段的人使用。这可能很糟糕,除非您在某处删除测试标头,否则任何可以从您的系统读取消息的人都可以看到它。
一种方法是在标头末尾检查是否X-Test
已被看到;如果不是,则拒绝该消息。这将使没有标头集的系统消息失败,但不应将系统转变为开放中继,因为各种其他规则集仍应适用于确定中继权限。因此sendmail.mc
添加如下内容:
LOCAL_RULESETS
Kstorage macro
HX-Test: $>CheckTestHeader
SCheckTestHeader
R$* $: $(storage {xtestsetp} $@ OK $) $1
Scheck_eoh
R$* $: < $&{xtestsetp} >
R$* $: $(storage {xtestsetp} $) $1
R< $+ > $@ OK
R$* $#error $: 553 Missing Header
并重建sendmail.cf
、重新启动sendmail
、发送带或不带测试标头的测试消息。
那些运行的“大量空格”必须替换为一个或多个制表符,因为 Sendmail 是那些不幸的软件之一,它强制要求使用大量空格(我知道这很疯狂,但我们就是这样)。
有关此示例的更多信息,请参阅 Sendmail
op.pdf
手册中的第 5.1.4.6 节,上面的内容或多或少是抄袭的。
另请注意,上述内容只能用于发送邮件服务器配置,因为它将拒绝不具有所需标头的传入邮件。
答案2
@thrig 再次感谢您的建议。我必须了解规则是如何编写的,因此花了这个时间。我已经修改了给定的规则集(因为我需要允许标头而不是停止),因此将以下行添加到 sendmail.mc 中,我得到了所需的结果。虽然我还没有在我们的预生产农场中对此进行测试,但这让我对如何继续前进有了一些见解。
我创建了一个小的 python 脚本,它帮助我创建我需要的标头并发送它们。下面的规则集允许“X-Test”标头,这是我的要求,因为我的邮件表拒绝基于前面列出的域的任何其他电子邮件。如果您的反馈有任何缺陷,请表示感谢。
LOCAL_RULESETS Kstorage 宏 HX-Test: $>CheckTestHeader
SCheckTestHeader R$* $: $(存储 {xtestsetp} $@ OK $) $1 R< $+ > $@ OK