这是我的 SMTP 情况。
邮件流由在线中继提供商标记(!!SPAM!!、!!BULK!! 等)
邮件流由内部后缀接收。传输配置为中继到我们的内部 Exchange,否则如果主题被标记。我使用 Header_checks 执行此操作。标记的邮件流被发送到我们的隔离服务器(个人用户的 webUI 等...)
/^[sS]ubject:.*!!SPAM!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!BULK!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!SUSPECT!!*/ FILTER smtp:192.168.11.250
一切正常。我们的隔离服务器可以为用户生成可信发件人列表。此白名单可用,我可以将其下载到我的 postfix。
我的问题是:如何在标题检查之前应用我的白名单?
If Subject contains *!!SPAM!!*
then
If from contains [email protected] AND if to contains [email protected]
Then redirect to internal exchange server
else redirect to quarantine server
endif
endif
我不知道该怎么做。有什么提示吗?
答案1
在听了 @masegaloeh 的评论后,我找到了一个解决方案。这个想法是让第二个 postfix SMTP 服务器使用策略服务器监听 10025,以便将邮件发送到普通服务器(如果列入白名单)或隔离服务器。
这个想法是从 main.cf 中的 header_checks 解决方案开始的:
header_checks = regexp:/etc/postfix/header_checks
在 header_checks 中:
/^(S|s)ubject: .*!!(SPAM|BULK|SUSPECT)!!.*/ FILTER smtp:127.0.0.1:10025
然后在 master.cf 中(使用@masegaloeh 评论进行编辑):
10025 inet n - n - - smtpd
-o receive_override_options=no_header_body_checks
-o smtpd_recipient_restrictions=${my_switcher_restrictions}
policy unix - n n - 0 spawn user=nobody argv=/etc/postfix/policy-server-switcher
这使得 postfix 的第二个实例覆盖 header_checks 的使用。
在 main.cf 中
my_switcher_restrictions = check_policy_service unix:private/policy
以及 policy-server-switcher 的内容
!/bin/bash
sender=""
recipient=""
while read line
do
key=$(echo $line | cut -f1 -d=)
value=$(echo $line|cut -f2 -d=)
if [ "$key" == "sender" ]
then
sender=${value}
logger -p mail.info -t PolicyServer "Sender is: ${value}"
fi
if [ "$key" == "recipient" ]
then
recipient=${value}
logger -p mail.info -t PolicyServer "Recipient is: ${value}"
fi
if [ "x${recipient}" != "x" ] && [ "x${sender}" != "x" ]
then
if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
then
echo "action=FILTER smtp:192.168.1.150"
echo
exit 0
fi
if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
then
echo "action=FILTER smtp:192.168.1.150"
echo
exit 0
fi
echo "action=FILTER smtp:192.168.1.151"
echo
exit 0
fi
done
当然,您需要对策略服务器进行编程以从数据库或 LDAP 加载白名单,这里只是一个示例来帮助您了解。
但这仍然有一些警告,假设我用这个发送一封邮件
从:[电子邮件保护]
到:[电子邮件保护]
到:[电子邮件保护]
这将转到 alphamikevictor 和 thomas 的正常服务器,只要针对策略服务器的最后一次测试返回 FILTER 为正常,但如果您将 alphamikevictor 放在第二位置,那么它将向两个收件人发送邮件进行隔离。