Spamassassin 将非垃圾邮件标记为垃圾邮件。我怎么这么说?

Nic*_*ngs 14 email email-server spamassassin

这是一个关于训练 spamassassin 的普遍问题。我有一个新设置的邮件服务器,它通过 spamassassin 过滤传入的邮件。我最近收到了一个标记为垃圾邮件的航班预订(得分 5),我想告诉 spamassassin 这不是垃圾邮件。(也许这样做也会在没有修改 spamassassin 标头的情况下重新发送邮件?)

我试过四处搜索,但只找到了关于让 spamassassin 将邮件标记为垃圾邮件(而不是关于修复误报)或为写电子邮件的人 - 如何不被标记为垃圾邮件的内容。

因此,关于对错误呼叫提供 spamassassin 反馈:

  1. 有没有办法从电子邮件客户端中执行此操作(例如:Thunderbird)

  2. 有没有办法通过邮件服务器上的命令行来做到这一点?

我想让这个过程尽可能流畅,但无论如何都能完成工作。

SpamAssassin 提供的有关电子邮件的详细信息:

 0.0 FSL_HELO_NON_FQDN_1    No description available.
 0.6 HK_RANDOM_ENVFROM      Envelope sender username looks random
-0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at http://www.dnswl.org/, no trust [82.150.225.129 listed in list.dnswl.org]
-0.0 RCVD_IN_MSPIKE_H3      RBL: Good reputation (+3) [82.150.225.129 listed in wl.mailspike.net]
 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different
 1.0 SPF_SOFTFAIL           SPF: sender does not match SPF record (softfail)
 1.6 SUBJ_ALL_CAPS          Subject is all capitals
 1.1 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts
 0.7 HTML_IMAGE_ONLY_20     BODY: HTML: images with 1600-2000 bytes of words
 0.0 HTML_MESSAGE           BODY: HTML included in message
-0.0 RCVD_IN_MSPIKE_WL      Mailspike good senders
 0.0 UNPARSEABLE_RELAY      Informational: message has unparseable relay lines
 0.0 T_REMOTE_IMAGE         Message contains an external image
Run Code Online (Sandbox Code Playgroud)

显然,罪魁祸首是全大写的主题行 SUBJ_ALL_CAPS 和 MIME_HTML_ONLY(我猜,没有替代文本)。

这封电子邮件用于确认航班预订,主题如下:

 Subject: JENNINGS/NICHOLAS KOSSOW MR 24 JAN MOF DPS
Run Code Online (Sandbox Code Playgroud)

标题:

X-Envelope-From: <tdsfndprd@amadeus.com>
X-Envelope-To: <nick@xxx.xxx>
Received: from mail1.amadeus.net (unknown)
    by 147-49-15-51.rev.cloud.scaleway.com(Postfix 3.1.0/8.13.0) with SMTP id unknown
    Fri, 20 Jan 2017 07:55:10 +0000
    (envelope-from <tdsfndprd@amadeus.com>
Received: from obeap115 (nat-dns-mnp.amadeus.net [82.150.225.129])
    by mail1.amadeus.net (Postfix) with ESMTP id 3F7A9200042
    for <nick@xxx.xxx>; Fri, 20 Jan 2017 07:55:10 +0000 (GMT)
From: eticket@garuda-indonesia.com
TO: NICK@XXX.XXXX
Message-ID: <CTS/GA/C50D54421A07/1@tds.amadeus.com>
FND-Request-ID: <CTS/GA/C50D54421A07/1@tds.amadeus.com>
Job-ID: 1
Subject: JENNINGS/NICHOLAS KOSSOW MR 24 JAN MOF DPS
Date: Fri, 20 Jan 2017 07:55:09 +0000
Content-Type: multipart/mixed; 
    boundary="----=_Part_191904_1900935199.1484898909762"
MIME-Version: 1.0
Run Code Online (Sandbox Code Playgroud)

Mad*_*ter 22

在这种情况下,有可能有用的具体建议和一般建议。

具体的

这里的潜在问题是,嘉鲁达航空公司,保佑他们的小棉袜,正在发送带有许多垃圾邮件标志的确认电子邮件。主题行非常谨慎,他们发送包含大量图像和很少文本的纯 HTML 电子邮件,信封发件人 ( tdsfndprd@amadeus.com) 显然是一个机器构建的随机数,以及他们(外包)确认系统的电子邮件提供商(amadeus.com) 有一个无用的 SPF 记录(尽管我们的所有建议都与此相反,但有些人错误地认为列出其某些发送系统和结束的记录是有价值的~all)。

对于大多数情况,您无能为力。如果您想确保这些消息能够通过,您~/.spamassassin/user_prefs可以在您的一行中写明whitelist_from *@amadeus.com将这些消息传递给您。更进一步并篡改触发的规则的权重可能是一个坏主意。SpamAssassin (SA) 规则集是通过过滤大量垃圾邮件并找出适用于大多数垃圾邮件的特征而创建的;通过关闭这些规则,您可能会打开您的收件箱,而不仅仅是 Garuda 确认电子邮件。

一般的

这正是贝叶斯引擎能够很好处理的情况。它旨在过滤掉不会触发其他规则但包含您不想阅读的内容的电子邮件,同时帮助通过触发这些规则但包含您确实想阅读的内容的电子邮件。

IIRC,如果你不训练它,引擎将不会做任何事情。训练它的最简单方法是维护两个文件夹,称为(比如说)spamham. 到spam你把它发到您的收件箱邮件的副本,但你不想; ham将与 SA 不符但您确实想要的电子邮件副本放入您的邮件中,例如此确认电子邮件。

然后每晚(左右)你有一个 cron 工作,上面写着

sa-learn --spam --mbox mail/spam
sa-learn --ham  --mbox mail/ham
Run Code Online (Sandbox Code Playgroud)

相应地修改路径。随着时间的推移,这将教会引擎您喜欢阅读和不喜欢阅读的内容。由于高贝叶斯评分可以增加+4.0点到电子邮件的SA得分,而低一个可以减去1.9,一个训练有素的引擎可以真正帮助SA分清什么想从读什么书,你没有-但你必须努力去教它


Jon*_*fer 7

你似乎在使用 dovecot。我花了几个星期试图找出一个平滑的集成,它允许用户轻松地训练服务器端垃圾邮件过滤器,而无需复制邮件。

关键部分是Antispam Dovecot 插件。反垃圾邮件插件会触发三个文件夹组之间的移动操作:trashunsurespam。具体来说,当检测到从任何 (but spam) 到的转换spam时,就会触发垃圾邮件学习动作,当检测到从spam到的转换unsure时,会触发火腿学习动作。

它支持不同的训练后端。一个简单的是mailtrain,它只是执行一个命令并将邮件放在标准输入上。其配置可能如下所示:

plugin {
   antispam_backend = mailtrain
   antispam_mail_sendmail = /usr/local/bin/sa-learn-stdin.sh
   antispam_mail_spam = spam
   antispam_mail_notspam = ham
   antispam_mail_sendmail_args = -L
   antispam_spam = Junk;INBOX.Junk
   antispam_trash = Trash;INBOX.Trash
   antispam_allow_append_to_spam = no
}
Run Code Online (Sandbox Code Playgroud)

连同/usr/local/bin/sa-learn-stdin.sh

#!/bin/bash
/usr/bin/spamc "$@" >> /tmp/sa-learn-log
exit 0
Run Code Online (Sandbox Code Playgroud)

配置说“要像垃圾邮件一样学习,请运行/usr/local/bin/sa-learn-stdin.sh -L spam,要像火腿一样学习,请运行” /usr/local/bin/sa-learn-stdin.sh -L ham。参数由antispam_mail_spam,antispam_mail_notspam和配置antispam_mail_sendmail_args

这已经很不错了。如果您可以配置您的客户端将您标记为垃圾邮件的邮件移动到垃圾邮件文件夹中,那么这已经是客户端和服务器之间非常自动的集成。同样,如果您将服务器配置为在投递时将归类为垃圾邮件的邮件存储在垃圾邮件文件夹中(例如使用 Sieve),则当用户将其移出垃圾邮件文件夹时,该邮件将被识别为 ham。


为了改进与 Thunderbird 和 KMail 的集成,我为 antispam写了一个补丁,不幸的是没有得到上游的任何反馈;使用风险自负

它为反垃圾邮件添加了一个配置选项,只需将其添加到plugindovecot 配置中的部分即可:

   antispam_spam_flags = "Junk;$JUNK"
Run Code Online (Sandbox Code Playgroud)

(引号对于防止$做任何有趣的事情很重要。)

随着补丁,防垃圾邮件会,如果消息得到一个垃圾标记,或失去其所有的垃圾标志的触发行动学习。标志是一种 IMAP 功能,客户端使用它来存储服务器端的信息位。事实证明,Thunderbird 和 KMail 使用这些标志来存储邮件的垃圾邮件/垃圾邮件状态。

Junk当您将邮件标记为垃圾邮件时,该标志由 Thunderbird 设置。对于$JUNKKMail 标志也是如此。因此,使用此配置,您可以通过在 KMail 中的 Thunderbird 中将邮件标记为垃圾邮件/非垃圾邮件来触发服务器端学习。

其他客户端,例如 K9-Mail,仍然可以很好地运行,因为默认设置是在垃圾邮件文件夹中移动垃圾,反垃圾邮件也会触发。


我认为,您可以在IMAPSieve 中实现相同的功能。这是我的 TODO,但不幸的是,我目前没有一个带有足够新的 dovecot 的测试就绪环境。