我正在尝试让 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