垃圾邮件计划
Original2002 年 8 月
(本文介绍了我们在构建的防垃圾邮件的基于 Web 的邮件阅读器中使用的垃圾邮件过滤技术,该阅读器用于练习 Arc。更好的贝叶斯过滤 中描述了一种改进的算法。)
我认为阻止垃圾邮件是可能的,基于内容的过滤器是实现这一目标的方法。垃圾邮件发送者的致命弱点是他们的信息。他们可以绕过你设置的任何其他障碍。至少到目前为止,他们已经做到了。但他们必须传递他们的信息,无论是什么。如果我们可以编写识别他们信息的软件,他们就无法绕过它。
对于收件人来说,垃圾邮件很容易识别。如果你雇佣某人阅读你的邮件并丢弃垃圾邮件,他们很容易做到。除了人工智能,我们还需要做多少才能自动化这个过程?
我认为我们可以用相当简单的算法解决这个问题。事实上,我发现你甚至可以使用单个单词的垃圾邮件概率的贝叶斯组合来很好地过滤掉当今的垃圾邮件。使用稍微调整过的(如下所述)贝叶斯过滤器,我们现在每 1000 封垃圾邮件中漏掉不到 5 封,并且没有误报。
统计方法通常不是人们在编写垃圾邮件过滤器时首先尝试的方法。大多数黑客的第一个本能是尝试编写识别垃圾邮件的个别属性的软件。你查看垃圾邮件,你会想,这些家伙胆敢给我发送以“亲爱的朋友”开头的邮件,或者主题行全部大写并以八个感叹号结尾。我可以使用大约一行代码过滤掉这些东西。
于是你就这么做了,一开始它确实有效。一些简单的规则会从你的收件垃圾邮件中剔除一大块。仅仅查找“点击”这个词就会捕获我垃圾邮件语料库中 79.7% 的电子邮件,误报率仅为 1.2%。
在尝试统计方法之前,我花了大约六个月的时间编写识别单个垃圾邮件特征的软件。我发现识别最后那几百分比的垃圾邮件变得非常困难,而且随着我使过滤器更严格,我得到了更多的误报。
误报是指被错误地识别为垃圾邮件的无辜电子邮件。对于大多数用户来说,错过合法电子邮件比收到垃圾邮件糟糕一个数量级,因此产生误报的过滤器就像一种可能导致患者死亡的治疗痤疮的药物。
用户收到的垃圾邮件越多,他越不可能注意到他垃圾邮件文件夹中的一封无辜邮件。奇怪的是,你的垃圾邮件过滤器越好,误报就越危险,因为当过滤器真正好的时候,用户更有可能忽略他们捕获的所有内容。
我不知道为什么我这么长时间才尝试统计方法。我认为是因为我沉迷于尝试自己识别垃圾邮件特征,就好像我在和垃圾邮件发送者玩某种竞争游戏一样。(非黑客通常没有意识到这一点,但大多数黑客都非常有竞争力。)当我尝试统计分析时,我立即发现它比我聪明得多。它当然发现了诸如“virtumundo”和“teens”之类的词语是垃圾邮件的良好指标。但它还发现“per”和“FL”和“ff0000”是垃圾邮件的良好指标。事实上,“ff0000”(亮红色的 html 代码)被证明是垃圾邮件的指标,与任何色情词语一样好。
以下是我进行统计过滤的简要说明。我从一个垃圾邮件语料库和一个非垃圾邮件邮件语料库开始。目前,每个语料库都有大约 4000 封邮件。我扫描每个语料库中每封邮件的整个文本,包括标题和嵌入的 html 和 javascript。我目前认为字母数字字符、连字符、撇号和美元符号是标记的一部分,其他所有内容都是标记分隔符。(这里可能还有改进的空间。)我忽略所有数字的标记,并且还忽略 html 注释,甚至不将其视为标记分隔符。
我统计每个标记(目前忽略大小写)在每个语料库中出现的次数。在这个阶段,我最终得到了两个大型哈希表,每个语料库一个,将标记映射到出现次数。
接下来,我创建第三个哈希表,这次将每个标记映射到包含它的电子邮件是垃圾邮件的概率,我按如下方式计算 [1]:
(let ((g (* 2 (or (gethash word good) 0))) (b (or (gethash word bad) 0))) (unless (< (+ g b) 5) (max .01 (min .99 (float (/ (min 1 (/ b nbad)) (+
(min 1 (/ g ngood)) (min 1 (/ b nbad)))))))))
其中 word 是我们要计算概率的标记,good 和 bad 是我在第一步中创建的哈希表,ngood 和 nbad 分别是非垃圾邮件和垃圾邮件的数量。
我将此解释为代码是为了展示几个重要的细节。我想稍微偏向概率以避免误报,通过反复试验,我发现一个好的方法是将 good 中的所有数字加倍。这有助于区分偶尔出现在合法电子邮件中的单词和几乎从未出现的单词。我只考虑在总共出现超过五次的单词(实际上,由于加倍,在非垃圾邮件邮件中出现三次就足够了)。然后是为在一个语料库中出现但在另一个语料库中未出现的单词分配什么概率的问题。同样通过反复试验,我选择了 .01 和 .99。这里可能还有调整的空间,但随着语料库的增长,这种调整会自动发生。
特别细心的人会注意到,虽然我认为每个语料库都是一个用于统计出现次数的单个长文本流,但我使用每个语料库中的电子邮件数量,而不是它们的总长度,作为计算垃圾邮件概率的除数。这增加了另一个轻微的偏差,以防止误报。
当收到新邮件时,它会被扫描成标记,并且最有趣的十五个标记(有趣是指它们的垃圾邮件概率与中性的 .5 相差多少)被用来计算邮件是垃圾邮件的概率。如果 probs 是一个包含十五个单独概率的列表,你就可以计算出 组合 概率,如下所示:
(let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs)))))
在实践中出现的一个问题是,应该为从未见过的单词分配什么概率,即在单词概率哈希表中不存在的单词。我发现,同样通过反复试验,.4 是一个很好的数字。如果你以前从未见过一个词,它可能相当无辜;垃圾邮件词语往往过于熟悉。
在文章末尾的附录中,有一些将此算法应用于实际电子邮件的示例。
如果上述算法给出的邮件是垃圾邮件的概率超过 .9,我就会将邮件视为垃圾邮件。但在实践中,我将此阈值设置在哪里并不重要,因为很少有概率最终落在范围的中间。
统计方法的一个巨大优势是,你不必阅读那么多垃圾邮件。在过去的六个月里,我读过数千封垃圾邮件,这真的让人很沮丧。诺伯特·维纳说,如果你和奴隶竞争,你就会成为奴隶,与垃圾邮件发送者竞争也有一些类似的贬低意义。为了识别单个垃圾邮件特征,你必须试图进入垃圾邮件发送者的思维,坦率地说,我想要尽可能少地花时间在垃圾邮件发送者的思维中。
但贝叶斯方法的真正优势,当然,是你知道你在测量什么。像 SpamAssassin 这样的特征识别过滤器会为电子邮件分配一个垃圾邮件“分数”。贝叶斯方法分配一个实际的概率。使用“分数”的问题是,没有人知道它的含义。用户不知道它的含义,但更糟糕的是,过滤器的开发人员也不知道。一封电子邮件包含“sex”这个词应该得到多少 分?概率当然可能会出错,但关于它的含义或如何将证据组合起来计算它,几乎没有歧义。根据我的语料库,“sex”表明包含它的电子邮件是垃圾邮件的概率为 .97,而“sexy”表明概率为 .99。贝叶斯定理同样明确无误,它表明包含这两个词的电子邮件,在(不太可能)没有其他证据的情况下,有 99.97% 的可能性是垃圾邮件。
由于它正在测量概率,因此贝叶斯方法会考虑电子邮件中的所有证据,包括好的和坏的。在垃圾邮件中 很少 出现的词语(如“though”或“tonight”或“apparently”)在降低概率方面与“unsubscribe”和“opt-in”等不良词语在提高概率方面一样重要。因此,包含“sex”这个词的原本无辜的电子邮件不会被标记为垃圾邮件。
当然,理想情况下,应该为每个用户单独计算概率。我收到很多包含“Lisp”这个词的电子邮件,而且(到目前为止)没有垃圾邮件包含这个词。因此,像这样的词语实际上是向我发送邮件的一种密码。在我早期的垃圾邮件过滤软件中,用户可以设置一个包含这些词语的列表,包含这些词语的邮件会自动通过过滤器。在我的列表中,我添加了诸如“Lisp”之类的词语,以及我的邮政编码,这样(否则听起来很像垃圾邮件的)在线订单收据就可以通过。我认为我非常聪明,但我发现贝叶斯过滤器为我做了同样的事情,而且还发现了许多我没有想到的词语。
当我在开头说我们的过滤器每 1000 封邮件中漏掉不到 5 封垃圾邮件,并且没有误报时,我指的是根据我的邮件语料库过滤我的邮件。但这些数字并不具有误导性,因为这就是我所倡导的方法:根据每个用户收到的垃圾邮件和非垃圾邮件邮件过滤每个用户的邮件。本质上,每个用户应该有两个删除按钮,普通删除和删除为垃圾邮件。任何被删除为垃圾邮件的内容都进入垃圾邮件语料库,其他所有内容都进入非垃圾邮件语料库。
你可以为用户提供一个种子过滤器,但最终每个用户都应该根据他们收到的实际邮件拥有自己的每个单词的概率。这 (a) 使过滤器更有效,(b) 让每个用户决定他们自己对垃圾邮件的精确定义,以及 (c) 也许最重要的是,让垃圾邮件发送者难以调整邮件以通过过滤器。如果过滤器的很大一部分大脑都在各个数据库中,那么仅仅调整垃圾邮件以通过种子过滤器并不能保证它们能够很好地通过各个用户不断变化且经过更多训练的过滤器。
基于内容的垃圾邮件过滤通常与白名单结合使用,白名单是允许无过滤接受邮件的发送者列表。构建此类白名单的一种简单方法是保留用户曾经发送过邮件的所有地址的列表。如果邮件阅读器有一个删除为垃圾邮件按钮,那么你也可以添加用户已删除为普通垃圾邮件的每封电子邮件的发送地址。
我支持白名单,但更多地是作为一种节省计算量的方法,而不是作为一种改进过滤的方法。我曾经认为白名单会使过滤更容易,因为你只需要过滤来自你从未听说过的人的电子邮件,而第一次给你发送邮件的人在他们可以对你说的话方面受到惯例的约束。你认识的人可能会给你发送一封谈论性别的电子邮件,但第一次给你发送邮件的人不太可能这样做。问题是,人们可以拥有多个电子邮件地址,因此新的发送地址并不能保证发送者是第一次给你写信。老朋友(尤其是如果他是黑客)突然用新的发送地址给你发送电子邮件并不罕见,因此你不能冒着误报的风险,通过特别严格地过滤来自未知地址的邮件。
从某种意义上说,我的过滤器本身体现了一种白名单(和黑名单),因为它们基于整个邮件,包括标题。因此,在某种程度上,它们“知道”可信发送者的电子邮件地址,甚至知道邮件从他们那里传到我的路线。他们也知道垃圾邮件的情况,包括服务器名称、邮件程序版本和协议。
如果我认为我可以保持当前的垃圾邮件过滤率,我会认为这个问题已经解决了。但能够过滤掉大多数当今的垃圾邮件并不意味着什么,因为垃圾邮件在不断发展。事实上,大多数 反垃圾邮件技术 到目前为止就像杀虫剂一样,除了产生新的抗药性虫株之外,没有做任何事情。
我对贝叶斯过滤器更有希望,因为它们随着垃圾邮件一起发展。因此,当垃圾邮件发送者开始使用“c0ck”而不是“cock”来逃避基于单个单词的简单垃圾邮件过滤器时,贝叶斯过滤器会自动注意到。事实上,“c0ck”比“cock”更有力地证明了这一点,贝叶斯过滤器确切地知道它有多么有力。
尽管如此,任何提出垃圾邮件过滤计划的人都需要能够回答这个问题:如果垃圾邮件发送者确切地知道你在做什么,他们能多好地绕过你?例如,我认为如果基于校验和的垃圾邮件过滤成为一个严重的障碍,垃圾邮件发送者只会切换到疯狂的填字游戏技术来生成邮件正文。
为了击败贝叶斯过滤器,垃圾邮件发送者仅仅使他们的电子邮件变得独特或停止使用单个不雅词语是不够的。他们必须使他们的邮件与你的普通邮件无法区分。我认为这会严重限制他们。垃圾邮件主要是销售推销,因此,除非你的普通邮件都是销售推销,否则垃圾邮件不可避免地会具有不同的特征。当然,垃圾邮件发送者还必须改变(并不断改变)他们的整个基础设施,否则标题在贝叶斯过滤器中看起来和以前一样糟糕,无论他们对邮件正文做了什么。我对垃圾邮件发送者使用的基础设施了解不够,无法知道使标题看起来无辜有多难,但我猜想这比使邮件看起来无辜更难。
假设他们能够解决标题问题,未来的垃圾邮件可能看起来像这样:
嘿,伙计。认为你应该看看以下内容:http://www.27meg.com/foo
因为这是基于内容的过滤会留给垃圾邮件发送者用来进行销售推销的空间。 (事实上,即使要通过过滤器也很难,因为如果电子邮件中的其他所有内容都是中性的,垃圾邮件概率将取决于 url,并且需要一些努力才能使它看起来中性。)
垃圾邮件发送者从经营所谓的选择加入列表的企业(他们甚至没有试图隐藏自己的身份)到劫持邮件服务器以发送推广色情网站的垃圾邮件的人不等。如果我们使用过滤来将他们的选择范围缩小到像上面那样的邮件,那么这应该会让那些处于“合法”范围内的垃圾邮件发送者破产;他们觉得有义务根据各种州法律包含关于为什么他们的垃圾邮件不是垃圾邮件以及如何取消你的“订阅”的样板文本,而这种文本很容易识别。
(我曾经认为相信更严格的法律会减少垃圾邮件是天真的。现在我认为,虽然更严格的法律可能不会减少垃圾邮件发送者 发送 的垃圾邮件数量,但它们肯定可以帮助过滤器减少收件人实际看到的垃圾邮件数量。)
在整个范围内,如果你限制了垃圾邮件发送者可以进行的销售推销,你不可避免地会倾向于让他们破产。商业 这个词很重要。垃圾邮件发送者是商人。他们发送垃圾邮件是因为它有效。它有效是因为虽然响应率低得令人发指(最多每百万封邮件 15 封,而目录邮件的响应率为每百万封邮件 3000 封),但对他们来说,成本几乎为零。对收件人来说,成本是巨大的,大约每百万收件人花费一秒钟删除垃圾邮件,就会花费 5 个工人的时间,但垃圾邮件发送者不必为此付费。
不过,发送垃圾邮件确实会让垃圾邮件发送者付出一些代价。[2] 因此,我们可以将响应率降低到什么程度——无论是通过过滤,还是通过使用过滤器迫使垃圾邮件发送者稀释他们的推销——越少的企业会发现发送垃圾邮件值得。
垃圾邮件发送者使用 销售推销 的原因是提高响应率。这可能比进入垃圾邮件发送者的思维更令人厌恶,但让我们快速了解一下 回复 垃圾邮件的人的思维。这个人要么是令人难以置信的轻信,要么是对自己的性兴趣深陷否认。无论哪种情况,无论垃圾邮件对我们来说多么令人反感或愚蠢,它对他们来说都是令人兴奋的。如果垃圾邮件发送者没有说这些话,它们就不会听起来令人兴奋。而“认为你应该看看以下内容”对垃圾邮件收件人来说,远没有垃圾邮件发送者现在所说的那些东西有吸引力。结果:如果它不能包含令人兴奋的销售推销,垃圾邮件作为营销工具的有效性就会降低,更少的企业愿意使用它。
这才是最终的重大胜利。我开始编写垃圾邮件过滤软件,因为我不想再看那些东西了。但如果我们能够很好地过滤掉垃圾邮件,它将不再有效,垃圾邮件发送者实际上会停止发送它。
在所有对抗垃圾邮件的方法中,从软件到法律,我相信贝叶斯过滤将是最有效的。但我认为,我们采取的反垃圾邮件措施越多越好,因为任何限制垃圾邮件发送者的措施都会使过滤更容易。即使在基于内容的过滤领域,我认为如果同时使用许多不同类型的软件,那也是一件好事。过滤器种类越多,垃圾邮件发送者就越难调整垃圾邮件以通过它们。
附录:过滤示例
这里 是一封在我写这篇文章时收到的垃圾邮件示例。这封垃圾邮件中最有趣的十五个词是:
qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg unsecured platinum 3d0 qves 7c5 7c266675
这些词语混合了来自标题和邮件正文的内容,这在垃圾邮件中很常见。同样常见的是,在我的数据库中,这些词语的垃圾邮件概率都是 .99。事实上,还有超过十五个词语的概率为 .99,而这些只是前十五个。
不幸的是,这使得这封电子邮件成为使用贝叶斯定理的无聊示例。为了看到各种有趣的概率,我们必须查看 这封 实际上相当不典型的垃圾邮件。
这封垃圾邮件中最有趣的十五个词语及其概率如下:
madam 0.99 promotion 0.99 republic 0.99 shortest 0.047225013 mandatory 0.047225013 standardization 0.07347802 sorry 0.08221981 supported 0.09019077
people's 0.09019077 enter 0.9075001 quality 0.8921298 organization 0.12454646 investment 0.8568143 very 0.14758544 valuable 0.82347786
这次证据是好坏参半的。像“shortest”这样的词语几乎与像“madam”或“promotion”这样的词语一样有力地证明了无辜。但对有罪的证据仍然更强。如果你根据贝叶斯定理将这些数字组合起来,得到的概率是 .9027。
“Madam”显然来自以“尊敬的先生或女士”开头的垃圾邮件。它们并不常见,但“madam”这个词 从未 出现在我的合法电子邮件中,而这正是比例问题。
“Republic”得分很高,因为它经常出现在尼日利亚诈骗邮件中,并且在提及韩国和南非的垃圾邮件中也出现过一两次。你可能会说,它因此帮助识别这封垃圾邮件是一个意外。但我发现,在检查垃圾邮件概率时,有很多这样的意外,而且它们往往会将事情推向正确的方向,而不是错误的方向。在这种情况下,这个词“Republic”出现在尼日利亚诈骗邮件和这封垃圾邮件中并非完全是巧合。有一类涉及欠发达国家的可疑商业提案,而这些提案更有可能包含明确说明(因为它们不是)它们是共和国的名称。[3]
另一方面,“enter”是一个真正的错误。它主要出现在取消订阅说明中,但在这里以完全无辜的方式使用。幸运的是,统计方法相当稳健,并且可以容忍相当多的错误,然后结果才会开始被扭曲。
为了比较, 这里 是一个罕见的例子,一封通过过滤器的垃圾邮件。为什么?因为纯粹是偶然,它恰好包含了许多出现在我的实际电子邮件中的词语:
perl 0.01 python 0.01 tcl 0.01 scripting 0.01 morris 0.01 graham 0.01491078 guarantee 0.9762507 cgi 0.9734398 paul 0.027040077 quite 0.030676773 pop3
0.042199217 various 0.06080265 prices 0.9359873 managed 0.06451222 difficult 0.071706355
这里有两个好消息。首先,这封邮件可能不会通过那些没有专门研究编程语言并且没有一个叫 Morris 的好朋友的人的过滤器。对于普通用户来说,这里的前五个词语都是中性的,不会影响垃圾邮件概率。
其次,我认为基于词语对(见下文)的过滤可能会捕获这封邮件:“cost effective”、“setup fee”、“money back”——非常令人不齿的东西。当然,如果他们继续给我(或我所在的网络)发送垃圾邮件,“Hostex”本身将被识别为垃圾邮件词语。
最后, 这里 是一封无辜的电子邮件。它最有趣的十五个词语如下:
continuation 0.01 describe 0.01 continuations 0.01 example 0.033600237 programming 0.05214485 i'm 0.055427782 examples 0.07972858 color 0.9189189
localhost 0.09883721 hi 0.116539136 california 0.84421706 same 0.15981844 spot 0.1654587 us-ascii 0.16804294 what 0.19212411
这里的大多数词语表明这封邮件是无辜的。有两个词语闻起来很糟糕,“color”(垃圾邮件发送者喜欢彩色字体)和“California”(它出现在推荐信中,也出现在表单菜单中),但它们不足以抵消像“continuation”和“example”这样的明显无辜的词语。
有趣的是,“describe”被评为如此彻底的无辜。它在我的 4000 封垃圾邮件中没有出现过一封。数据结果充满了这样的惊喜。当你分析垃圾邮件文本时,你会学到的一件事是,垃圾邮件发送者使用的语言子集是多么狭窄。正是这个事实,以及任何单个用户的邮件的同样特征词汇,使得贝叶斯过滤成为一个好选择。
附录:更多想法
我还没有尝试过的一个想法是,根据词语对,甚至三元组,而不是单个词语进行过滤。这应该会产生一个更精确的概率估计。例如,在我的当前数据库中,“offers”这个词的概率为 .96。如果你根据词语对来计算概率,你最终会得到“special offers”和“valuable offers”的概率为 .99,而“approach offers”(如“this approach offers”)的概率为 .1 或更低。
我还没有这样做是因为基于单个词语的过滤已经非常有效。但这确实意味着,如果垃圾邮件变得更难检测,还有空间收紧过滤器。(奇怪的是,基于词语对的过滤器实际上是一个反向运行的马尔可夫链文本生成器。)
特定的垃圾邮件特征(例如,在 to: 字段中没有看到收件人的地址)当然在识别垃圾邮件方面具有价值。可以通过将它们视为虚拟词语来考虑它们在这个算法中。我可能会在未来的版本中这样做,至少对于最严重的垃圾邮件指标中的少数几个。特征识别垃圾邮件过滤器在许多细节上都是正确的;它们缺乏的是组合证据的整体纪律。
识别非垃圾邮件特征可能比识别垃圾邮件特征更重要。误报是一个如此令人担忧的问题,以至于需要采取非同寻常的措施。我可能会在未来的版本中添加一个专门用于避免误报的第二级测试。如果一封邮件触发了这第二级过滤器,即使它的垃圾邮件概率超过了阈值,它也会被接受。
我不希望这第二级过滤是贝叶斯式的。它不可避免地不仅是临时性的,而且是基于猜测的,因为误报的数量往往不足以注意到模式。(无论如何,如果备份系统不依赖于与主系统相同的技术,那也是件好事。)
我将来可能还会尝试的另一件事是,将更多注意力集中在电子邮件的特定部分。例如,大约 95% 的当前垃圾邮件包含他们希望你访问的网站的 url。(剩下的 5% 希望你拨打电话号码、通过电子邮件或邮寄地址回复,或者在少数情况下购买某种股票。)在这种情况下,url 本身几乎足以确定电子邮件是否是垃圾邮件。
域名与(非德语)电子邮件中的其他文本不同,因为它们通常由几个连在一起的词语组成。虽然在一般情况下计算量很大,但尝试分解它们可能值得。如果过滤器以前从未见过“xxxporn”这个标记,它将具有 .4 的单个垃圾邮件概率,而“xxx”和“porn”分别具有(在我的语料库中).9889 和 .99 的概率,以及 .9998 的组合概率。
我预计,随着垃圾邮件发送者逐渐被迫停止在邮件正文中使用令人不齿的词语,分解域名将变得越来越重要。(具有 ip 地址的 url 当然是一个非常令人不齿的迹象,除非在少数系统管理员的邮件中。)
拥有一个由垃圾邮件发送者推广的 url 的合作维护列表可能是一个好主意。我们需要一种由 Raph Levien 研究的信任度指标来防止恶意或不合格的提交,但如果我们拥有这样的东西,它将为任何过滤软件提供帮助。它也将成为抵制的便利基础。
测试可疑 url 的另一种方法是,在用户查看提及它的电子邮件之前,发送一个爬虫来查看该网站。你可以使用贝叶斯过滤器来对网站进行评分,就像你对电子邮件一样,并且在网站上发现的任何内容都可以包含在计算电子邮件是垃圾邮件的概率中。导致重定向的 url 当然会特别可疑。
我认为真正是一个好主意的一项合作项目是积累一个巨大的垃圾邮件语料库。一个大型、干净的语料库是使贝叶斯过滤有效工作的关键。贝叶斯过滤器实际上可以使用语料库作为输入。但这样的语料库对于其他类型的过滤器也很有用,因为它可以用来测试它们。
创建这样的语料库会带来一些技术问题。当然,我们需要信任度指标来防止恶意或不合格的提交。我们还需要 方法来从语料库中的邮件中删除个人信息(不仅仅是收件人和抄送地址,还包括例如取消订阅 url 的参数,这些参数通常会对收件人地址进行编码)。如果有人想承担这个项目,这将是造福世界的一件好事。
附录:定义垃圾邮件
我认为人们对什么是垃圾邮件有一个大致的共识,但有一个明确的定义会很有用。如果我们想 建立一个中央垃圾邮件语料库,甚至有意义地比较垃圾邮件过滤率,我们就需要这样做。
首先,垃圾邮件不是未经请求的商业电子邮件。如果我附近的人听说我在寻找一辆状况良好的老式 Raleigh 三速自行车,并且给我发送了一封电子邮件,提供出售给我一辆,我会很高兴,但即使这封电子邮件既是商业性的,又是未经请求的。垃圾邮件的决定性特征(事实上,它的 存在理由)不是它未经请求,而是它被自动化了。
垃圾邮件通常是商业性的,这也仅仅是附带的。例如,如果有人开始发送大量电子邮件来支持某种政治事业,它与推广色情网站的电子邮件一样是垃圾邮件。
我建议我们将垃圾邮件定义为 未经请求的自动电子邮件。因此,这个定义包括许多法律定义的垃圾邮件中没有包含的一些电子邮件。 法律定义的垃圾邮件,可能是受到游说者的影响,往往会排除由与 收件人有“现有关系”的公司发送的邮件。但例如,从一家公司购买东西并不意味着你已经请求他们持续发送电子邮件。如果我从一家在线商店订购东西,然后他们给我发送了一连串的垃圾邮件,它仍然是垃圾邮件。
发送垃圾邮件的公司通常会给你一个“取消订阅”的方式,或者要求你访问他们的网站并更改你的“帐户偏好设置”,如果你想停止 接收垃圾邮件。这不足以阻止邮件成为垃圾邮件。不选择退出与选择加入不同。除非收件人明确选中了一个 清晰标记的框(默认情况下为否),要求接收电子邮件,否则它就是垃圾邮件。
在某些商业关系中,你确实会隐式地请求某些类型的邮件。当你在线订购时,我认为你隐式地请求收据,以及 订单发货时的通知。我不介意 Verisign 发送邮件警告我某个域名即将过期(至少,如果他们是 实际注册商)。但当 Verisign 发送电子邮件给我,提供一个免费的构建我的电子商务网站指南时,那就是垃圾邮件。
注释:
[1] 本文中的示例被翻译成 Common Lisp,令人难以置信的是,为了提高可访问性。本文中描述的应用程序是我们为了测试一个名为 Arc 的新 Lisp 方言而编写的,该方言尚未发布。
[2] 目前,最低价格似乎是发送一百万封垃圾邮件大约 200 美元。这非常便宜,每封垃圾邮件 1/50 美分。但例如,过滤掉 95% 的垃圾邮件会使垃圾邮件发送者接触到特定受众的成本增加 20 倍。很少有人能有足够的利润率来吸收这种成本。
[3] 作为经验法则,在一个国家名称之前出现的限定词越多,统治者就越腐败。一个名为 X 社会主义人民共和国的国家可能是世界上你最不想居住的地方。
感谢 Sarah Harlin 阅读本文的草稿;Daniel Giffin(他也在编写生产 Arc 解释器)为过滤提供了几个好主意,并创建了我们的邮件基础设施;Robert Morris、Trevor Blackwell 和 Erann Gat 就垃圾邮件进行了多次讨论;Raph Levien 就信任度指标提供了建议;以及 Chip Coldwell 和 Sam Steingold 就统计学提供了建议。
你将在 [
黑客与画家
](http://www.amazon.com/gp/product/0596006624) 中找到这篇文章和其他 14 篇文章。
更多信息: