SpamAssassin 正则表达式不匹配

SpamAssassin Regular Expression not matching

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

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

表达式如下:

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

应该做的是匹配To:header(或body中的任何地方的e-mail地址匹配格式 To: user@somedomain.com 的消息。正如我之前提到的,表达式在 Regex-101 上符合预期,但是当我在 SpamAssassin 中制定规则时,它不匹配。

如果我删除前导 To:\s 那么它确实匹配,但我只关心匹配 To: header 中的 e-mail。我已经尝试了表达式的这些不同的突变:

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

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

None 前面的规则匹配,但是这个匹配:

/([a-z0-9][-a-z0-9]{1,19})\@somedomain\.com[a-z0-9\s=;:\/\.-]*\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 上匹配,但我只能在删除 [=19 时才能匹配=] 从表达式。完整的表达式在 Regex-101 中测试出来,所以它似乎是 SpamAssassin 特有的东西,但我不确定。

编辑

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

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

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

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

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

Greetings username!  Blah Blah Blah spam message.

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