在邮件垃圾邮件检测中避免使用负前瞻正则表达式

问题描述 投票:0回答:3

典型的合法电子邮件“标题来自”字段如下所示:

From: DHL <[email protected]>

From: DHL <[email protected]>

虽然非合法电子邮件“标题来自”字段看起来像:

From: DHL <[email protected]>

我想编写一个正则表达式来匹配非合法电子邮件“header from”的情况,也就是说,如果DHL出现在“From:”之后,那么<>里面的内容必须以dhl.com结尾

我使用负向前瞻提供了以下正则表达式(不确定它是否 100% 准确,但它似乎有效):

^From: DHL <.*@(?!.*dhl\.com>$)

现在的问题是我的正则表达式引擎不支持负向前瞻,我正在尝试用等效的非捕获组替换它,例如:

(?:[^d]|d[^h]|dh[^l]|dhl[^\.]|dhl\.[^c]|dhl\.c[^o]|dhl\.co[[^m])

到目前为止还没有成功。有什么想法吗?

如果有解决方案,我也想支持大小写混合(例如 DhL.COm)。

我正在寻找一种 Postfix 解决方案,最好是不需要 PCRE 的解决方案。

regex regex-lookarounds postfix-mta email-spam
3个回答
1
投票

由于您不能使用负向前瞻,并且您只知道您不想匹配的内容,因此您必须使用大量 | 逐个字母地测试它。运营商

这样的东西应该有效:

^From: DHL <.*@.*[^mM]>$|^From: DHL <.*@.*[^oO][mM]>$|^From: DHL <.*@.*[^cC][oO][mM]>$|^From: DHL <.*@.*[^.][cC][oO][mM]>$|^From: DHL <.*@.*[^lL][.][cC][oO][mM]>$|^From: DHL <.*@.*[^hH][lL][.][cC][oO][mM]>$|^From: DHL <.*@.*[^dD][hH][lL][.][cC][oO][mM]$>

0
投票

我认为这符合要求。

(?<=^From: DHL <).*dhl\.com(?=>$)

只需更改:

^From: DHL 

并将其与

相匹配
.*dhl\.com

在领域领域更普遍一些:

(?<=^From: DHL <).*dhl\.([a-zA-Z]{1,3})(?=>$)

0
投票

对于 Postfix

regexp_table
(5):

/^From: DHL <.*@([-A-Za-z0-9]+\.)*[Dd][Hh][Ll]\.[Cc][Oo][Mm]>$/i  DUNNO
/^From: DHL </i                                                   REJECT

对于后缀

pcre_table
(5):

/^From: DHL <.*@(?!(?i)([-a-z0-9]+\.)*dhl\.com>$)/i  REJECT
© www.soinside.com 2019 - 2024. All rights reserved.