如何使用 procmail 和命令行工具对非英语电子邮件进行分类?

How do I categorise non-english email using procmail and command line tools?

我订阅了一个邮件列表,其中一些消息是非英语的,我无法理解。

如何使用 procmail and/or 命令行工具将非英语消息过滤到 /dev/null

我使用 procmail 来过滤我的电子邮件,因此理想情况下任何替代工具也需要 procmail 配方。

我宁愿不必训练自己的语言模型。

一种方法是使用 perl TextCat package from Gertjan van Noord.

text_cat 脚本输出最可能的邮件语言。此配方假定 text_cat 已安装在 /usr/local/bin.

这是调用 text_cat 脚本的简单 procmail 方法:

:0
* ^Subject.*Jobs.*Board
{
    LANG_=`/usr/local/bin/text_cat`

    :0
    * ! LANG ?? ^english$
    /dev/null

    :0
    jobs/
}

我已经 运行 text_cat 几年了。没有 non-english 条分类为英语的消息,即没有 false-positives。我没有严格检查 false-negatives.


第二种方法,如tripleee in a comment, is to use the language categorisation provided by spamassassin所述,它也使用text_cat脚本。 Spamassassin 将解开任何 MIME 传输编码,而上面的 text_cat 版本不会。

这里有一个未完全测试 procmail 过滤 spamassassin X-Spam-Languages header:

的方法
:0
* ^Subject.*Jobs.*Board
{    
    # Delete non-english language emails using spamassassin header
    # Test for not X-Spam-Languages: en
    :0
    * !^X-Spam-Languages: en$
    foreign/

    # Save english language mails in folder
    :0
    jobs/
}

警告:spamassassin 偶尔会像这样提供多种语言分类:

X-Spam-Languages: en da ro

上面的食谱没有考虑到。

Spamassassin 语言分类配置

编辑 /etc/spamassassin/v310.pre 并取消注释以下行:

loadplugin Mail::SpamAssassin::Plugin::TextCat

/etc/spamassassin/local.cf配置插件:

ok_languages en       # I understand english
inactive_languages '' # Enable all languages
add_header all Languages _LANGUAGES_
# score UNWANTED_LANGUAGE_BODY 5 # Increase score - not necessary and not recommended 

此食谱未通过 spamassassin 3.4.2 版进行完整测试。


要调整这些答案以排除不同的语言,将涉及在第一种情况下用另一种语言替换 english,在第二种情况下用其他 2 个字符的语言代码替换 en

许多现代电子邮件客户端识别电子邮件的字符集,但通常不是其语言。如果你想丢弃日文、中文、韩文和俄文消息,你可以尝试类似

:0HB
* ^Content-type:[  ]*text/[/;]*;[  ]*charset="?(iso-2022|ks-c|gb|koi|cp-1251)
foreign

因为有些客户在写英文的时候忘记更改字符集,这很可能会产生一些误报,所以我建议保存到一个文件夹中并定期查看。相反的问题更难;许多外语使用与英语相同的字符集,因此无法可靠地识别。