在筛选器中实现算术规则来过滤收件人地址,可以吗?

在筛选器中实现算术规则来过滤收件人地址,可以吗?

例如,收件人的地址应采用以下格式:

最后一位数字 = (第一位数字 + 第二位数字)%10。

如果我发现有人给我发邮件却不遵守规则,邮件会被拒绝。是否可以创建这样的筛选过滤器?

答案1

我可以想到一个潜在的解决方案,但它不是很好:使用variables存储正则表达式提取结果并处理它的功能。首先,提取数字并将其替换为与值相关的点数。将它们加在一起并删除连续出现的 10 个点。然后使用修饰符:length对它们进行计数。然后将最后一个变量与提取的第 3 位数字进行比较并在处理中做出决定。

require ["variables", "ereject", "regex"];
if envelope :regex "to" "^abc.23@testdomain\.com$" {
  set "first" "${1}";
}
if string :matches " ${first} " "1" {
  set "firstdot" ".";
}
if string :matches " ${first} " "2" {
  set "firstdot" "..";
}
...
set "sum" "${firstdot}${seconddot}";
if string :regex " ${sum} " "(..........)*(.*)" {
          set "summod" "${2}";
}
set :length "thirdexpect" "${summod}";
if string :matches "${third}" "${thirdexpect}" {
   ereject "recipient address does not match expected pattern";
}
else
{
   keep;
   stop;
}

当然有可能,但肯定不容易阅读或诊断。


但是:我不知道有任何筛选实现能够正确拒绝(在 SMTP 阶段ereject)消息,只返回副本并丢弃(“反弹”)。当您的规则实际上是静态的并且在接收时易于计算时,这对其他服务器来说不是一件好事。因此,我强烈建议您在接收服务器上实现此规则

如果该服务器是 postfix,您可以在 smtpd_recipient_restrictions 中添加另一个check_recipient_access type:table带有查找的条目类型让您更轻松地表达您的图案。您可能会发现我之前对类似的“基于规则的地址”问题的回答对于构建你的机制很有用,我期望它在 SQL 中相当简单。

相关内容