Featured image of post 垃圾邮件的解决方案

垃圾邮件的解决方案

探讨基于内容的贝叶斯过滤技术如何有效识别和过滤垃圾邮件。

📚 返回 Paul Graham 文章目录

垃圾邮件的解决方案

喜欢构建东西?试试 Hacker News

2002年8月

(本文描述了我们在构建基于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,我就将邮件视为垃圾邮件。但在实践中,我把这个阈值放在哪里并不重要,因为很少有概率落在范围的中间。


统计方法的一个巨大优势是你不需要阅读那么多垃圾邮件。在过去六个月里,我实际上阅读了数千封垃圾邮件,这确实有点令人沮丧。Norbert Wiener说如果你与奴隶竞争,你就会变成奴隶,与垃圾邮件发送者竞争也有类似的降级感。要识别个别的垃圾邮件特征,你必须试图进入垃圾邮件发送者的思维,坦白说,我想尽可能少地待在垃圾邮件发送者的思维中。

但贝叶斯方法的真正优势当然是你知道你在测量什么。像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提供了关于统计的建议。

你可以在Hackers & Painters中找到这篇文章和其他14篇文章。

更多信息:

英文版:paulgraham.com/spam.html|中文版:HiJiangChuan.com/paulgraham/018-a-plan-for-spam

📚 返回 Paul Graham 文章目录

更新记录: