我在设置个人spamassassin
规则时遇到了一些麻烦。我的问题:我收到很多带有西里尔字母的俄语垃圾邮件,其中很多是UTF-8
。因此,搜索字符集是不够的。所以我想搜索几个典型的俄语字母(例如):(д|ж|з|и|й)
。
/(д|ж|з|и|й)/i
我在搜索中尝试了该模式/(\xd0\xb4|\xd0\xb6|\xd0\xb7|\xd0\xb8|\xd0\xb9)/i
(这些正则表达式模式应该做同样的事情,对吗?)Subject
:
header CYRILLIC_LETTER_PRESENT Subject =~/(д|ж|з|и|й)/i
结果:UTF-8
垃圾邮件仍在发送。我分析了收到的电子邮件。它们都具有相似的结构。源(重要部分)查找一封示例垃圾邮件,如下所示
Subject: =?UTF-8?B?0KLQtdCx0LUg0L/QvtC90YDQsNCy0LjRgtGM0YHRjyEg0J/QvtC60LDQt9GL?= =?UTF-8?B?0LLQsNGOINC+0YLQu9C40YfQvdGL0Lkg0LLQsNGA0LjQsNC90YIg0L/QvtC7?= =?UTF-8?B?0YPRh9C10L3QuNGPINC00L7RhdC+0LTQsCEg0J/RgNC+0YHRgtC+0Lkg0Lgg?= =?UTF-8?B?0YDQtdC30YPQu9GM0YLQsNGC0LjQstC90YvQueKAiyE=?=
MIME-Version: 1.0
Date: Wed, 8 Mar 2017 06:57:11 +0100
From: =?UTF-8?B?0KDQsNC00LjQuSDQn9C40YjRgg==?= <[email protected]>
Sender: [email protected]
Message-ID: <[email protected]>
X-Priority: 3
List-Unsubscribe: <http://ie8qrshyns.zarabotokfm8.ru/uns/tFRyGZzisv/58dhKEk2im53c/DBetz>
Content-Type: multipart/alternative;
boundary="291e4fd846a7aa548d279e9eb1f199e9_1"
--291e4fd846a7aa548d279e9eb1f199e9_1
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
....encoded....body....
--291e4fd846a7aa548d279e9eb1f199e9_1
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64
....2nd(?)....encoded....body....
--291e4fd846a7aa548d279e9eb1f199e9_1--
我谷歌了一下,只找到了一种有用的信息:http://shallowsky.com/blog/programming/decoding-email-headers.html
因此,这subject
使用RFC2047
:=?UTF-8?B?msg_subject?= =?UTF-8?B?msg_subject2?= [...]
。这一行告诉我们,subject
使用utf-8
字符集和base64
编码(比较http://www.ietf.org/rfc/rfc2047.txt)。
显然,spamassassin
没有正确解码。我找不到任何方法可以让它工作。我还找到了这个网站:https://dropbear.xyz/2007/08/07/filtering-base64-encoded-spam/
但这对我没什么帮助,因为它只是描述了如何过滤足够长的 base64 编码字符串。由于我正在寻找单个字符,因此无法使用这种方法。
我是否遗漏了什么?感谢您的帮助!
编辑:我也尝试了rawbody
搜索,因为这应该解码 base64 编码,如文档:
rawbody CYRILLIC_LETTER_PRESENT /(д|ж|з|и|й)/i
对我来说也没有用,尽管它也应该搜索整个身体,而且它充满了西里尔字母。
编辑2:我尝试进一步调查该问题。如果我尝试使用 测试 textcat spamassassin -D textcat -t spamtest
,它会告诉我它“ can't determine language uniquely enough
”。
而且我最终得到了以下结果:
X-Spam-Flag: YES
X-Spam-Level: *******
X-Spam-Status: Yes, score=7.3 required=3.0 tests=HTML_FONT_LOW_CONTRAST,
HTML_MESSAGE,LOCAL_CYRILLIC,RDNS_NONE,SPF_SOFTFAIL,T_DKIM_INVALID
autolearn=no autolearn_force=no version=3.4.0
看起来它起作用了。一切都很好。我的规则(此处称为LOCAL_CYRILLIC
)按预期工作。但是,问题是,这封邮件通过了,但没有被识别为垃圾邮件,因为配置文件中存在相同的规则。我尝试再次将同一封邮件转发给我,然后,电子邮件源如下所示:
X-Spam-Level: **
X-Spam-Status: No, score=2.7 required=3.0 tests=LOCAL_CYRILLIC,
RCVD_IN_DNSWL_MED autolearn=no autolearn_force=no version=3.4.0
因此,在本地文件上运行该测试和实际收到的电子邮件之间似乎存在差异。为什么?我总是用 重新启动 spamassassin systemctl restart spamassassin
。我用 检查了它systemctl status spamassassin
,一切看起来都很好,spamd
也重新启动了,这是应该的。在那里我还可以找到转发电子邮件的以下信息:
spamd: clean message (2.7/3.0) for spamd:5555 in 6.0 seconds, 8371 bytes.
spamd: result: . 2 - LOCAL_CYRILLIC,RCVD_IN_DNSWL_MED scantime=6.0,size=8371,user=spamd,uid=5555,required_score=3.0,[...]
答案1
显然,spamassassin 没有正确解码。我找不到任何方法可以解决这个问题
它适用于,,,Ubuntu 14.04
区域设置:。spamassassin 3.4
Perl 5.18.2
fr_FR.UTF-8
规则~/.spamassassin/user_prefs
:
header RUSSIAN_CHARS Subject =~ /(д|ж|з|и|й)/i
describe RUSSIAN_CHARS Russian characters in header
score RUSSIAN_CHARS 10
当获取邮件文件并替换原始主题按照你问题中的那一行:
主题:=?UTF-8?B?0KLQtdCx0LUg0L/QvtC90YDQsNCy0LjRgtGM0YHRjyEg0J/QvtC60LDQt9GL?= =?UTF-8?B?0LLQsNGOINC+0YLQu9C40YfQvdGL0Lkg0LLQsNGA0LjQsNC90YIg0L/QvtC7?= =?UTF-8?B?0YPRh9C10L3QuNGPINC00L7RhdC+0LTQsCEg0J/RgNC+0YHRgtC+0Lkg0Lgg?= =?UTF-8?B?0YDQtdC30YPQu9GM0YLQsNGC0LjQstC90YvQueKAiyE=?=
结果:
$ spamc -R < 邮件测试 10.0/5.0 垃圾邮件检测软件,运行在系统**已删除**上...... 内容预览:**已删除** [...] 内容分析详情:(10.0分,5.0必答) pts 规则名称 描述 ---- ---------------------------------- -------------------------------------------------- 10 RUSSIAN_CHARS 标题中的俄语字符 0.0 DKIM_ADSP_CUSTOM_MED 没有有效的作者签名,adsp_override 是 自定义_MED 0.0 FREEMAIL_FROM 发件人电子邮件是经常被滥用的最终用户邮件提供商 (**已删除**[at]gmail.com) -0.0 NO_RELAYS 信息:消息未通过 SMTP 中继
它还rawbody RUSSIAN_CHARS /(д|ж|з|и|й)/i