Spamassassin 匹配 Han/chinese 个字符
Spamassassin matching Han/chinese characters
我正在尝试实施一个匹配所有中文字符(汉字)的规则
SpamAssassin 版本 3.3.1
运行 Perl 版本 5.10.1
到目前为止,我尝试了以下规则:
body SPAM44 /\p{Han}/
body SPAM44 /[\x{4e00}-\x{9FFF}]/
body SPAM44 /[一-俿倀-忿怀-濿瀀-翿耀-迿退-龥]+/
前 2 条规则不匹配任何内容。最后一条规则几乎匹配我所有的邮件。
所有这些规则都适用于 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
我无法 post 解码字符串,因为 Whosebug 说它是垃圾邮件。
那么如何匹配汉字和spamassassin呢?
除非您在本地配置中单独设置 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
会成为默认设置,但以电子邮件的当前状态,我认为这不会很快实现。字符集信息丢失或不正确的情况太多了,自动修复它的启发式方法很脆弱并且 error-prone.
我正在尝试实施一个匹配所有中文字符(汉字)的规则
SpamAssassin 版本 3.3.1 运行 Perl 版本 5.10.1
到目前为止,我尝试了以下规则:
body SPAM44 /\p{Han}/
body SPAM44 /[\x{4e00}-\x{9FFF}]/
body SPAM44 /[一-俿倀-忿怀-濿瀀-翿耀-迿退-龥]+/
前 2 条规则不匹配任何内容。最后一条规则几乎匹配我所有的邮件。 所有这些规则都适用于 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
我无法 post 解码字符串,因为 Whosebug 说它是垃圾邮件。
那么如何匹配汉字和spamassassin呢?
除非您在本地配置中单独设置 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
会成为默认设置,但以电子邮件的当前状态,我认为这不会很快实现。字符集信息丢失或不正确的情况太多了,自动修复它的启发式方法很脆弱并且 error-prone.