垃圾邮件过滤方案
喜欢创造事物吗? 试试 Hacker News。
2002年8月
(本文介绍了我们为测试 Arc 而构建的防垃圾邮件网页邮件阅读器中使用的垃圾邮件过滤技术。改进算法在《更好的贝叶斯过滤》中有所描述。)
我认为阻止垃圾邮件是可能的,而基于内容的过滤器是实现这一目标的方法。垃圾邮件发送者的阿喀琉斯之踵是他们的邮件内容。他们可以绕过你设置的任何其他障碍。至少到目前为止是这样。但无论如何,他们都必须发送他们的信息。如果我们能编写识别这些信息的软件,他们就无法绕过这一点。
对收件人来说,垃圾邮件很容易识别。如果你雇人阅读你的邮件并丢弃垃圾邮件,他们几乎不会遇到麻烦。在不涉及人工智能的情况下,我们还需要做多少工作才能自动化这个过程?
我认为我们可以用相当简单的算法来解决这个问题。事实上,我发现仅使用单个单词的垃圾邮件概率的贝叶斯组合,就能很好地过滤当前的垃圾邮件。使用稍作调整(如下所述)的贝叶斯过滤器,我们现在每1000封垃圾邮件中漏掉的不到5封,且误报率为0。
统计方法通常不是人们在编写垃圾邮件过滤器时首先尝试的方法。大多数黑客的第一直觉是尝试编写识别垃圾邮件个别特征的软件。你看着垃圾邮件会想,这些人竟然敢给我发以“亲爱的朋友”开头或主题行全大写并以八个感叹号结尾的邮件。我可以用大约一行代码过滤掉这些东西。
你确实这样做了,而且一开始它很有效。一些简单的规则就能大大减少你收到的垃圾邮件。仅仅查找“click”这个词,就能捕获我垃圾邮件语料库中79.7%的邮件,而误报率仅为1.2%。
在尝试统计方法之前,我花了大约六个月的时间编写寻找垃圾邮件个别特征的软件。我发现识别最后那几个百分点的垃圾邮件变得非常困难,而且随着我将过滤器设置得更严格,误报也越来越多。
误报是指无辜的邮件被错误地识别为垃圾邮件。对大多数用户来说,错过合法邮件比收到垃圾邮件糟糕一个数量级,所以一个会产生误报的过滤器就像一种治疗痤疮的药物,却可能导致患者死亡。
用户收到的垃圾邮件越多,他就越不可能注意到一封无辜的邮件躺在他的垃圾邮件文件夹里。奇怪的是,你的垃圾邮件过滤器越好,误报就越危险,因为当过滤器真的很好时,用户就越有可能忽略它们捕获的所有内容。
我不知道为什么我这么久才尝试统计方法。我想那是因为我沉迷于自己识别垃圾邮件特征,就好像我在和垃圾邮件发送者玩某种竞争游戏一样。(非黑客通常不会意识到这一点,但大多数黑客都非常有竞争力。)当我尝试统计分析时,我立刻发现它比我聪明得多。它当然发现,“virtumundo”和“teens”之类的词是垃圾邮件的良好指标。但它也发现“per”、“FL”和“ff0000”是垃圾邮件的良好指标。事实上,“ff0000”(HTML中的亮红色)被证明是与任何色情词汇一样好的垃圾邮件指标。
以下是我进行统计过滤的草图。我从一个垃圾邮件语料库和一个非垃圾邮件语料库开始。目前每个语料库大约有4000封邮件。我扫描每个语料库中每封邮件的全部文本,包括邮件头、嵌入的HTML和JavaScript。我目前将字母数字字符、破折号、撇号和美元符号视为词元(token)的一部分,其他所有字符都视为词元分隔符。(这里可能还有改进空间。)我忽略所有数字的词元,也忽略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,我就将其视为垃圾邮件。但在实践中,我将这个阈值设置在哪里并不重要,因为很少有概率最终落在中间范围。
统计方法的一个巨大优势是你不必阅读那么多垃圾邮件。在过去的六个月里,我确实阅读了数千封垃圾邮件,这真的很令人沮丧。诺伯特·维纳(Norbert Wiener)说过,如果你与奴隶竞争,你就会成为奴隶,与垃圾邮件发送者竞争也有类似令人堕落之处。要识别垃圾邮件的个别特征,你必须尝试进入垃圾邮件发送者的思维,坦率地说,我希望尽可能少地花时间在垃圾邮件发送者的思维中。
但贝叶斯方法的真正优势当然在于,你知道你正在测量什么。像 SpamAssassin 这样的特征识别过滤器会给邮件分配一个垃圾邮件“分数”。贝叶斯方法则分配一个实际的概率。“分数”的问题在于没有人知道它意味着什么。用户不知道它意味着什么,更糟糕的是,过滤器的开发者也不知道。一封邮件中包含“sex”这个词应该得到多少_分_?概率当然可能出错,但它意味着什么,或者如何结合证据来计算它,几乎没有歧义。根据我的语料库,“sex”表示包含该词的邮件有 .97 的概率是垃圾邮件,而“sexy”表示 .99 的概率。而贝叶斯法则,同样明确无误地指出,一封同时包含这两个词的邮件,在(不太可能)没有其他证据的情况下,有 99.97% 的几率是垃圾邮件。
因为它测量的是概率,所以贝叶斯方法会考虑邮件中的所有证据,无论是好的还是坏的。在垃圾邮件中不成比例地_很少_出现的词(如“though”、“tonight”或“apparently”)对降低概率的贡献,与“unsubscribe”和“opt-in”等不良词汇对增加概率的贡献一样大。因此,一封原本无辜但碰巧包含“sex”这个词的邮件不会被标记为垃圾邮件。
当然,理想情况下,概率应该为每个用户单独计算。我收到很多包含“Lisp”这个词的邮件,而(到目前为止)没有垃圾邮件包含它。所以像这样的词实际上是一种向我发送邮件的“密码”。在我早期的垃圾邮件过滤软件中,用户可以设置一个此类词的列表,包含这些词的邮件将自动通过过滤器。我的列表中包含了“Lisp”以及我的邮政编码,这样(否则听起来相当像垃圾邮件的)在线订单收据就能通过。我以为自己很聪明,但我发现贝叶斯过滤器为我做了同样的事情,而且还发现了许多我没有想到的词。
当我一开始说我们的过滤器每1000封垃圾邮件中漏掉的不到5封,且误报率为0时,我指的是根据我的邮件语料库来过滤我的邮件。但这些数字并没有误导性,因为这就是我所倡导的方法:根据每个用户收到的垃圾邮件和非垃圾邮件来过滤他们的邮件。本质上,每个用户都应该有两个删除按钮,普通删除和标记为垃圾邮件删除。任何被标记为垃圾邮件删除的邮件都进入垃圾邮件语料库,而其他所有邮件都进入非垃圾邮件语料库。
你可以为用户提供一个初始过滤器,但最终每个用户都应该根据他们实际收到的邮件拥有自己的词汇概率。这(a)使过滤器更有效,(b)让每个用户决定他们自己对垃圾邮件的精确定义,以及(c)也许最重要的是,这使得垃圾邮件发送者难以调整邮件以通过过滤器。如果过滤器的很大一部分“大脑”在于各个独立的数据库中,那么仅仅调整垃圾邮件以通过初始过滤器,并不能保证它们能很好地通过各个用户不同且训练程度更高的过滤器。
基于内容的垃圾邮件过滤通常与白名单结合使用,白名单是允许邮件无需过滤即可接受的发件人列表。构建此类白名单的一个简单方法是保留用户曾经发送过邮件的所有地址列表。如果邮件阅读器有“标记为垃圾邮件删除”按钮,那么你也可以将用户作为普通垃圾删除的每封邮件的发件人地址添加到其中。
我支持白名单,但更多是将其视为节省计算量的一种方式,而非改进过滤效果的方式。我曾认为白名单会使过滤更容易,因为你只需过滤来自你从未听说过的人的邮件,而第一次给你发邮件的人在措辞上会受到惯例的约束。你认识的人可能会给你发一封谈论性内容的邮件,但第一次给你发邮件的人不太可能这样做。问题是,人们可以有多个电子邮件地址,所以一个新的发件人地址并不能保证发件人是第一次给你写信。老朋友(尤其是黑客)突然用一个新的发件人地址给你发邮件并不少见,所以你不能通过特别严格地过滤来自未知地址的邮件来冒误报的风险。
然而,从某种意义上说,我的过滤器本身就包含了一种白名单(和黑名单),因为它们基于完整的邮件,包括邮件头。因此,它们在一定程度上“知道”可信发件人的电子邮件地址,甚至邮件从他们那里到达我的路径。它们对垃圾邮件也同样了解,包括服务器名称、邮件程序版本和协议。
如果我认为我能保持当前的垃圾邮件过滤率,我就会认为这个问题已经解决了。但能够过滤掉大多数当前的垃圾邮件意义不大,因为垃圾邮件会演变。事实上,迄今为止大多数反垃圾邮件技术都像杀虫剂一样,除了产生新的、抗药性的虫害之外,别无他用。
我对贝叶斯过滤器抱有更大的希望,因为它们会随着垃圾邮件而演变。因此,当垃圾邮件发送者开始使用“c0ck”而不是“cock”来规避基于单个词的简单垃圾邮件过滤器时,贝叶斯过滤器会自动注意到。事实上,“c0ck”是比“cock”更有力的证据,贝叶斯过滤器精确地知道其效力高出多少。
尽管如此,任何提出垃圾邮件过滤方案的人都必须能够回答这个问题:如果垃圾邮件发送者确切地知道你在做什么,他们能多大程度上绕过你?例如,我认为如果基于校验和的垃圾邮件过滤成为一个严重障碍,垃圾邮件发送者就会转而使用“填字游戏”技术来生成邮件正文。
要击败贝叶斯过滤器,垃圾邮件发送者仅仅让他们的邮件独一无二或停止使用单个不雅词汇是不够的。他们必须让他们的邮件与你的普通邮件无法区分。我认为这将严重限制他们。垃圾邮件大多是推销内容,所以除非你的常规邮件都是推销内容,否则垃圾邮件不可避免地会有不同的特征。而且垃圾邮件发送者当然也必须改变(并不断改变)他们的整个基础设施,因为否则无论他们对邮件正文做了什么,邮件头在贝叶斯过滤器看来都会一如既往地糟糕。我对垃圾邮件发送者使用的基础设施了解不多,不知道让邮件头看起来无辜会有多难,但我猜测这甚至比让邮件内容看起来无辜更难。
假设他们能解决邮件头的问题,未来的垃圾邮件可能看起来像这样:嘿。你可能想看看这个:http://www.27meg.com/foo 因为基于内容的过滤只会给垃圾邮件发送者留下这么多推销空间。(事实上,即使是这样也很难通过过滤器,因为如果邮件中的其他一切都是中性的,垃圾邮件概率将取决于URL,而要让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”显然来自以“Dear Sir or 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 或更低。
我之所以没有这样做,是因为基于单个词的过滤已经非常有效。但这确实意味着,如果垃圾邮件变得更难检测,还有收紧过滤器的空间。(奇怪的是,一个基于词对的过滤器实际上是一个反向运行的马尔可夫链文本生成器。)
特定的垃圾邮件特征(例如,在“收件人:”字段中看不到收件人地址)当然在识别垃圾邮件方面有价值。它们可以通过将它们视为虚拟词来纳入此算法。我可能会在未来的版本中这样做,至少对于少数最严重的垃圾邮件指标。特征识别垃圾邮件过滤器在许多细节上是正确的;它们缺乏的是结合证据的整体规范。
识别非垃圾邮件特征可能比识别垃圾邮件特征更重要。误报是一个如此令人担忧的问题,以至于它们需要非同寻常的措施。我可能会在未来的版本中添加第二级测试,专门用于避免误报。如果一封邮件触发了这第二级过滤器,即使其垃圾邮件概率高于阈值,它也将被接受。
我预计这第二级过滤不会是贝叶斯式的。它将不可避免地不仅是临时的,而且是基于猜测的,因为误报的数量通常不足以发现模式。(无论如何,如果备份系统不依赖于与主系统相同的技术,那也很好。)
我将来可能尝试的另一件事是,特别关注电子邮件的特定部分。例如,目前大约95%的垃圾邮件包含他们希望你访问的网站URL。(其余5%希望你打电话,通过电子邮件或美国邮寄地址回复,或者在少数情况下购买某种股票。)在这种情况下,URL本身实际上就足以确定邮件是否是垃圾邮件。
域名与(非德语)电子邮件中的其他文本不同,它们通常由几个词粘在一起组成。虽然在一般情况下计算成本很高,但尝试分解它们可能值得。如果一个过滤器从未见过词元“xxxporn”,它将有一个 .4 的单独垃圾邮件概率,而“xxx”和“porn”在我的语料库中分别有 .9889 和 .99 的概率,组合概率为 .9998。
我预计,随着垃圾邮件发送者逐渐被迫停止在邮件文本中使用有罪词汇,分解域名将变得更加重要。(带有IP地址的URL当然是一个极具犯罪性的标志,少数系统管理员的邮件除外。)
建立一个由垃圾邮件发送者推广的URL合作维护列表可能是一个好主意。我们需要一种由拉夫·列维恩(Raph Levien)研究过的信任度量(trust metric)来防止恶意或不称职的提交,但如果我们有这样的东西,它将为任何过滤软件提供助力。它也将是抵制行动的便利基础。
测试可疑URL的另一种方法是在用户查看提及该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 提供了关于统计学的建议。
你可以在《黑客与画家》中找到这篇以及其他14篇文章。