我在这里已经阅读了类似的问题,但由于所有正则表达式都没有相同,我无法找到解决问题的方法。
我正在制定针对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
答案 0 :(得分:1)
在@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]*?