答案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 中相当简单。