Spamassassin匹配汉/汉字

时间:2018-03-06 12:32:31

标签: regex perl spamassassin

我正在尝试实施一个匹配所有中文字符(汉)与

的规则

SpamAssassin 3.3.1版   在Perl版本5.10.1上运行

到目前为止,我尝试了以下规则:

body SPAM44 /\p{Han}/
body SPAM44 /[\x{4e00}-\x{9FFF}]/
body SPAM44 /[一-俿倀-忿怀-濿瀀-翿耀-迿退-龥]+/

前两条规则与任何内容都不匹配。最后一条规则几乎匹配我的所有邮件。 所有这些规则在regex101.com上运行良好。所以这可能是一个特定于spamassassin的问题。

应匹配的示例正文:

--_000_7f25887479e34b8585663e5702f9ae87companyde_
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

6L2m6Lqr5Yi26YCg5bel6Im65Y+K6KOF5aSH44CB5rG96L2m5pW06L2m6K6+6K6h5byA5Y+R5LiO
6K+V5Yi244CB5rG96L2m5bel56iL5LiO5pyN5Yqh44CB5pm66IO95Lqn57q/54mp5rWB5oqA5pyv
44CB5raC6KOF55Sf5Lqn57q/5Y+K6KOF5aSH44CB5bel5Lia5py65Zmo5Lq65oiQ5aWX5oqA5pyv
5Y+K6KOF5aSH44CB5bqV55uY5Yi26YCg5bel6Im65Y+K6KOF5aSHDQoNCg0KDQoN

我无法发布已解码的字符串,因为stackoverflow表示它是垃圾邮件。

那么如何将中文字符与spamassassin匹配?

1 个答案:

答案 0 :(得分:2)

除非您在本地配置中单独设置normalize_charset 1(默认为0),否则SpamAssassin不会将字符集规范化为Unicode;那么,这些正则表达式几乎没有机会匹配。

如果没有此设置,要匹配UTF-8中的中文字符,您的正则表达式需要匹配字符的UTF-8序列,而不是解码的Unicode表示。

body  SPAM44_UTF8 /[\xe4-\xe9][\x80-\xbf][\x80-\xbf]/
score SPAM44_UTF8 2

(不完全确定正则表达式,但你明白了。)

这显然只适用于UTF-8中的主体,所以你需要为你想要处理的任何其他字符集创建一个类似的规则(也许是GB2312?)并且它可能会对非消息主体产生误报实际上是UTF-8(虽然风险似乎相当小)。

此规则在任何地方都匹配单个中文字符。也许你会想要扩展它来寻找一个序列,比如四个或更多,以减少误报的风险。

也许normalize_charset 1将成为默认的一天,但对于当前的电子邮件状态,我认为这不会很快就可行。字符集信息缺失或不正确的情况太多,而且自动修复它的启发式方法很脆弱且容易出错。