![Cyrus 谈 ClearOs 7 - 如何教会它有关垃圾邮件和普通邮件的知识](https://linux22.com/image/716897/Cyrus%20%E8%B0%88%20ClearOs%207%20-%20%E5%A6%82%E4%BD%95%E6%95%99%E4%BC%9A%E5%AE%83%E6%9C%89%E5%85%B3%E5%9E%83%E5%9C%BE%E9%82%AE%E4%BB%B6%E5%92%8C%E6%99%AE%E9%80%9A%E9%82%AE%E4%BB%B6%E7%9A%84%E7%9F%A5%E8%AF%86.png)
我最近在 ClearOs 7 上设置了一个 Cyrus IMAP 电子邮件系统 - 它配置为开箱即用,可以在本地传递邮件,也可以为我的用户从其他地方接收邮件。
收到大量自称是俄罗斯人的垃圾邮件。这些垃圾邮件似乎被检测到了(主题以 为前缀[SPAM]
),但仍然出现在用户的收件箱中。
一些火腿也被归入垃圾邮件文件夹。
我想建立一个系统,让用户将无法识别的垃圾邮件和错误发送的正常垃圾邮件告知 spamassassin。为此,我在每个用户的邮箱中为垃圾邮件和 NotSpam 设置了额外的文件夹。用户将收件箱中发现的所有垃圾邮件移至垃圾邮件,将垃圾邮件中的正常邮件移至 NotSpam。
我现在想编写或找到一个脚本,该脚本将查找垃圾邮件文件夹,将内容发送到sa-learn --spam
,然后将邮件移至常规垃圾邮件文件夹。它还应查找 NotSpam 文件夹,将内容发送到sa-learn --ham
,然后将其移至收件箱。
我曾尝试为此编写 shell 脚本,也曾下载并尝试遵循萨-兰恩-赛勒斯,并查看了我在wiki.apache.org/spamassassin/RemoteImapFolder。
我的脚本成功找到了电子邮件文件,并将它们发送到sa-learn
(尽管我担心在执行此操作之前应该真正撤销垃圾邮件分数和主题更改,但我不知道该怎么做)。我无法将消息移动到正确的文件夹,因为我怀疑普通的 Linux mv 命令只会让 cyrus 感到困惑,因为文件夹中有缓存、标题、索引和蹲伏文件,这些文件可能需要更新。
sa-learn-cyrus 似乎能够成功找到电子邮件,但是(据我在模拟模式下运行所知)它不会尝试将邮件移动到正确的文件夹,只是将其清除。
另一个脚本运行正常(经过对我的设置进行适当修改后),但垃圾邮件不断出现在收件箱中。
我需要回答的具体问题是:
1)为什么主题为[SPAM]的邮件仍然出现在收件箱中?
2)是否存在可以完成我想要的操作的现有脚本?
3) 在 Cyrus 中将电子邮件从一个邮箱文件夹移动到另一个邮箱文件夹的正确方法是什么?理想情况下可以从 shell 脚本调用。
答案1
我已经找到了以下答案,以供后人参考:
1)为什么主题为[SPAM]的邮件仍然出现在收件箱中?
Cyrus 有一个内置的过滤系统,可以根据您提供的规则将邮件重定向到文件夹。我发现在旧服务器上我设置了一些规则,但却完全忘记了。
我需要的规则(针对用户 nikki)是:
# cat spamrule
require
["fileinto","envelope","reject","vacation","imapflags","relational","comparator-i;ascii-numeric","regex","notify"];
if header :contains "x-spam-flag" "YES" {
fileinto "user/nikki/SPAM";
stop;
}
并且,当以用户 nikki 身份登录时,我可以使用 sieveshell 将此规则添加到系统,如下所示(注:sieveshell 提示符为>
):
sieveshell -u nikki localhost:2000
Please enter your password:
> put spamrule
> activate spamrule
> list
spamrule <- active script
> quit
当然,这假设您可以为每个用户打开一个 shell(我以 root 身份登录并使用su -s /bin/bash - nikki
),并且您知道每个用户的密码(我知道)。
Cyrus sieve 有一个很有用的 Web 界面,叫做智能筛分我正在尝试让它工作,但目前遇到了困难。理想情况下,您可以将其添加到服务器 webconfig,然后让用户自己修改脚本。
2)是否存在可以完成我想要的操作的现有脚本?
我使用了Apache Spamassassin RemoteImapFolder,略作修改:
# $u is the user name
/usr/bin/fetchmail -a -s -n -u $u -p IMAP --folder 'INBOX/Junk E-mail' -m 'bash -c "/usr/bin/tee >(/usr/bin/sa-learn --spam --single \
> /dev/null)|/usr/bin/spamc|/usr/lib/cyrus-imapd/deliver -m SPAM '$u'"' localhost 2>/dev/null
/usr/bin/fetchmail -a -s -n -u $u -p IMAP --folder 'INBOX/NotSpam' -m 'bash -c "/usr/bin/tee >(/usr/bin/sa-learn --ham --single \
> /dev/null)|/usr/bin/spamassassin -d|/usr/lib/cyrus-imapd/deliver '$u'"' localhost 2>/dev/null
改进脚本
我从一个不同的、我认为更好的角度来考虑这个想法。SpamAssassin 认为是垃圾邮件的所有邮件都有一个X-Spam-Flag: YES
标题,它认为是正常邮件的邮件也有一个X-Spam-Flag: NO
标题。因此,如果我只告诉用户将任何错误归档的邮件移到正确的文件夹中,那么我就可以查看与文件夹不匹配的标题。
为此,我编写了一个 bash 脚本来完成这项工作,并将其放在 GitHub 上cyrus-mark-ham-垃圾邮件。