Exim 条件逻辑

Exim 条件逻辑

我正在尝试让 exim 根据域列表检查发送和接收邮件的域。如果发送邮件的发件人地址和接收邮件的收件人/抄送/密送地址不在本地域列表中,我想拒绝/丢弃该邮件。以下是我想出的方法,放在“acl_not_smpt”部分中:

discard
condition = ${if and {{! match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
{if or {\
{! match_domain{${domain:${address:$h_to:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}}\
{! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}}\
}\
}\
}\
message = Mail discarded for spoofing

但是我的 exim 日志中出现了以下错误:

“and{...}”条件内的未知条件“if”

对 exim 语法非常陌生,希望得到一些帮助。

答案1

第二个if是错误的,事实上你不需要它:and条件可以使用任何布尔函数(参见扩展条件), 尽管$if返回一个字符串(参见扩展项扩展运算符)。还有一些额外的}。工作条件变为:

condition = ${if and {\
              {!match_domain{${domain:${address:$h_from:}}}{+local_domains}}\
              { or {\
                {! match_domain{${domain:${address:$h_to:}}}{+local_domains}}\
                {! match_domain{${domain:${address:$h_cc:}}}{+local_domains}}\
                {! match_domain{${domain:${address:$h_bcc:}}}{+local_domains}}\
              }}\
            }}

这个条件有一些错误:它确实检查是否存在多个收件人和From:地址。

还要注意的是禁止 smtp 请求仅当(本地)用户使用以下命令调用 exim4 时,ACL 才会运行-bm 或 -bS 选项。这意味着您的 ACL 将阻止本地用户发送外发邮件。

如果这就是您想要做的,那么您的表达可以简化:

  • From:可以通过配置 Exim 的更有效地检查标头受信任的用户

  • 您不用分别检查To:和,Cc:而是Bcc:可以使用$recipients将所有内容包含在,单独字符串中的变量。

所有这些相当于两个 ACL 节:

  accept
    condition = ${if forall {<,${recipients}}\
                  {match_domain{${domain:${item}}}{+local_domains}}\
                }
  deny

通常,你可以SMTP通过创建(或保存)电子邮件(比如说email.eml)并运行来调试字符串扩展和非 ACL:

exim4 -d-all+acl+expand -bm -t < email.eml

以 root 身份(警告:这将尝试真正的电子邮件传递),而仅检查扩展运行:

exim4 -bem email.eml

相关内容