如何通过Sieve将含中日韩字符集的垃圾邮件移至指定文件夹?
用Sieve过滤中日韩字符集垃圾邮件的可行方案
我太懂这种头疼了——那种无正文、主题随机跳的中日韩垃圾邮件,SpamAssassin确实很难抓准,毕竟它更依赖传统的垃圾邮件特征。不过用Sieve实现拦截绝对可行,大概率是你之前的规则没踩对关键点。下面给你几个经过验证的方案,一步步来解决:
核心思路:抓准中日韩字符的本质特征
这类垃圾邮件要么直接包含中日韩字符,要么会在邮件头里声明对应的字符集,我们从这两个方向入手:
1. 直接匹配邮件主题/正文中的中日韩字符
利用Unicode字符属性匹配,不管邮件用什么编码,只要出现汉字、假名、韩文就触发规则。这是最精准的方式,因为它直接识别字符本身:
require ["fileinto", "regex", "subject", "body"]; # 匹配主题或正文中的中日韩核心字符 if anyof( regex :subject "[\p{Han}\p{Hiragana}\p{Katakana}\p{Hangul}]", regex :body "[\p{Han}\p{Hiragana}\p{Katakana}\p{Hangul}]" ) { fileinto "Junk/CJK-Spam"; # 替换成你实际要移动的文件夹名称 stop; }
\p{Han}覆盖简体/繁体汉字\p{Hiragana}/\p{Katakana}覆盖日文假名\p{Hangul}覆盖韩文
2. 匹配邮件头中的中日韩字符集声明
有些垃圾邮件正文为空,但会在Content-Type头里明确标注中日韩编码(比如GB2312、Shift_JIS),针对这种情况可以单独写规则:
require ["fileinto", "regex", "header"]; # 匹配常见的中日韩字符集编码 if regex :header "Content-Type" "(gb2312|gbk|gb18030|shift_jis|euc-kr|utf-16)" { fileinto "Junk/CJK-Spam"; stop; }
这个规则能抓到那些刻意隐藏正文但漏了字符集声明的垃圾邮件。
3. 结合「无正文」特征强化规则(推荐)
既然你提到这类邮件无正文,我们可以把这个特征和中日韩字符结合,大幅降低误判率:
require ["fileinto", "regex", "subject", "body", "header"]; # 先筛选出正文内容极少的邮件(小于10个字符,可根据需求调整) if body :content "text/plain" :count "lt" 10 { # 再检查是否含中日韩特征 if anyof( regex :subject "[\p{Han}\p{Hiragana}\p{Katakana}\p{Hangul}]", regex :header "Content-Type" "(gb2312|gbk|shift_jis|euc-kr)" ) { fileinto "Junk/CJK-Spam"; stop; } }
这样既不会误拦正常的短内容中日韩邮件,又能精准命中目标垃圾邮件。
关键注意事项
- 确保你的邮件服务器(比如Dovecot)启用了Sieve的
regex扩展,大部分主流服务器默认支持,但如果规则无效,可以检查服务器配置。 - 测试阶段建议先把
fileinto替换成keep,或者移动到临时文件夹观察3-5天,确认没有误判再正式启用。 - 如果还有漏网之鱼,可以补充检查邮件头的其他异常特征,比如缺少
Message-ID、发件人域名无MX记录等,进一步强化规则。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

