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