Postfix:条件标题检查

Postfix:条件标题检查

这是我的 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 放在第二位置,那么它将向两个收件人发送邮件进行隔离。

相关内容