1

我在这里读过类似的问题,但是由于并非所有正则表达式都是平等的,因此我无法找到解决问题的方法。

我正在为 SpamAssassin 制定一条规则,该规则将判断收件人的电子邮件用户名是否包含在邮件正文中。例如,发送到的电子邮件testuser@somedomain.com包含testuser在邮件正文中。我已经在Regex-101上编写并测试了一个正则表达式,并且能够按预期匹配它,但是当我创建规则时,当我在 SpamAssassin 中测试它时它不起作用。

这是表达式:

/To:\s([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\1\b/i

应该做的是匹配标头中的电子邮件地址To:(或匹配格式的邮件正文中的任何位置To: user@somedomain.com。正如我之前提到的,表达式在 Regex-101 上按预期匹配,但是当我在 SpamAssassin 中制定规则时, 不匹配。

如果我删除前导,那么它确实匹配,但我只关心匹配标题To:\s中的电子邮件。To:我已经尝试过表达的这些不同的突变:

/To:\s([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\1\b/i
/To: ([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\1\b/i
/To:[\s]{0,2}([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\1\b/i
/:\s([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\1\b/i

/\s([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\1\b/i

之前的规则都不匹配,但这条规则匹配:

/([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\1\b/i

这是我用于测试的文本:

Subject: Test spam mail (GTUBE) private jet rental
Message-ID: <GTUBE1.1010101@example.net>
Date: Wed, 23 Jul 2003 23:30:00 +0200
From: Sender <sender@live.com>
To: recipient@somedomain.com
Precedence: junk
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
recipient
This is the GTUBE, the
    Generic
    Test for
    Unsolicited
    Bulk
    Email

哪个应该To: recipient@somedomain.com....上匹配,但是当我从表达式recipient中删除时,我只能让它匹配。To:\s完整的表达式在 Regex-101 中测试,所以它似乎是 SpamAssassin 特有的,但我不确定。

编辑

这是表达式的更新版本,不允许在用户名末尾使用破折号,但允许在中间:

/\bTo:\s([a-z0-9][-a-z0-9]{0,18}[a-z0-9])\@somedomain\.com[a-z0-9\s=;:\/\.-]*\b\1\b/i
4

1 回答 1

2

在聊天中@sln 的帮助下,我们提出了以下表达式,符合预期的完整规则:

/To:\s+([a-z0-9][-a-z0-9]{1,18}[a-z0-9])\@somedomain\.com[\S\s]*?\1\b/i

这将匹配To: username@somedomain.com ... username,因此在大多数情况下,它应该匹配在邮件正文中包含收件人用户名的任何电子邮件。在我们的案例中,我们收到的许多垃圾邮件都包含用户名,例如:

Greetings username!  Blah Blah Blah spam message.

最终修复它的是将[a-z0-9\s=;:\/\.-]*以下电子邮件地址替换为[\S\s]*?

于 2015-07-07T23:33:57.973 回答