消除不需要的电子邮件的六种方法DavidMertz博士(mertz@gnosis.cx)分析师,GnosisSoftware,Inc.多年来不请自来的电子邮件问题日渐严重地困扰着人们,但现在有了解决这一问题的办法。在本文中,David讨论并比较了几种主要的方法来自动消除不需要的电子邮件,同时,还介绍和测试了一些采用这些方法的流行的工具。不道德的电子邮件发送者可以不费多大成本或根本不费成本地分发大量消息,而正常用户却被迫花费一些时间和精力从他们的邮箱中清除这些欺诈性的或不需要的邮件。在本文中,我描述了几种方法,这些方法用计算机代码来帮助消除不请自来的商业性电子邮件、病毒、特洛伊木马和蠕虫病毒以及怀有恶意的欺诈性电子邮件与其它一些不希望收到的和令人烦恼的电子邮件。在某种意义上,消除垃圾邮件最好的终极解决方案可能是通过立法来制止这种行为。然而,在此期间,即在法律的进步(如果有过的话)还未解决公众不断所受到的困扰之前,可以用代码开发一些工具作为过渡性的解决方案来处理这类问题。从技术角度考虑—但也是常识—我们所说的“垃圾邮件”的含义通常比“不请自来的商业性电子邮件”的范畴要广;垃圾邮件包含了所有我们不需要的以及没有明确表明要发送给我们的电子邮件。这样的消息其本身并不总是具有商业性,而对于有些消息,很难说是我们所需要的。例如,我们不想感染上病毒(即使来自不谨慎的朋友);通常也不想收到连锁电子邮件(chainletter),即使这些邮件不是来要钱的;既不想收到来自陌生人的诱劝性的消息;也不想收到完全是欺骗性的邮件。在任何一种情况中,都能很清楚地确定邮件是否为垃圾邮件,许许多多人都曾收到过这样的邮件。垃圾邮件的问题是,它会将正常的电子邮件淹没。以我的经历为例,几年前,我偶尔会收到了一封不请自来的消息,大概每天有一封或两封。与此相对照,在这个月中的每一天,我所收到垃圾邮件的数目是合法邮件的很多倍。平均大概每收到1封正常的邮件就会得到10封垃圾邮件。从某些方面讲,我与一般人不同—作为一名公众撰稿人,我的电子邮件地址是公布给大家的;而且,我欢迎那些未曾谋面之人就我所发表的文章以及我的软件库给我发电子邮件,并且也确实经常收到这方面的电子邮件。遗憾的是,来自陌生人的电子邮件—谁也不知道这些邮件使用的是什么电子邮件应用程序、哪种OS以及本地自然语言等—不会马上明显地显示出它的目的;垃圾邮件发送者设法在这种含糊状态之下来发送他们的消息。对我来讲,我的时间是宝贵的,特别是每时每刻都有许多工作要做。隐藏联系人信息对于一些电子邮件用户,避免垃圾邮件的非常简单且合理的方法(而且这种方法也足够应付这个问题)是,只要牢牢地保护好电子邮件地址,不泄漏出去。对于这些人,只将电子邮件地址告诉给那些经过挑选的、可信的对方。另外需要注意的是,挑选电子邮件地址时,避免选用那些容易被猜出的名字以及选用字典里的单词,在将地址张贴到公共场合时,可以伪装地址,我们都见过巧妙地编码成以下形式的电子邮件地址:“mertzHIDDEN@NOSPAM.gnosis.cx”或“echozregm@tabfvf.pk|trA-Za-zN-ZA-Mn-za-m”。除了隐藏地址之外,隐蔽的电子邮件使用者还常常使用一个或多个免费的电子邮件服务,他们将这些地址作为“用完即弃”的地址。如果自己对对方半信半疑但需要与之进行电子邮件通信,则可以将一个临时的电子邮件地址用上几天,然后,只要有垃圾邮件出现(自此之后,可能会有垃圾邮件源源不断地发送到此地址),就废弃这个地址。要保护好“只有心腹知己”才能知道的真正地址。我做过一次非正式的调查,在Web公告板(Web-board)、邮件列表、Usenet等上讨论了垃圾邮件问题,我发现,有了这些基本的预防性措施,就足以保护这类电子邮件用户。然而,对于我—以及对于其他许多人—这些方法根本不可能完全避免垃圾邮件。我有一个公开的电子邮件地址,出于许多理由,我必须公开这个地址。在我能控制的范围内,确实利用了多个地址来检测“漏网”垃圾邮件的来源;但不幸的事实是,大多数垃圾邮件发送者可以用与合法邮件发送者相同的方法获取到我的电子邮件地址:象这篇文章一样,从文章的顶部获得地址列表,以及其它有关我地址方面的公开信息。过滤软件一瞥本文从特定的角度来研究过滤软件。对于正确识别垃圾邮件和合法消息这方面,我想了解这些不同的方法做得如何。为了回答这个问题,我没有将注意力特别放在配置过滤器应用程序,使之能使用各种“邮件传送代理(MailTransferAgents(MTA))”的细节上。在MTA(譬如,Sendmail、QMail、Procmail、Fetchmail以及其它邮件程序)的最佳配置方面,确实存在着许多奥妙。而且,许多电子邮件客户机都有自己的过滤选项和插件API。幸运的是,我研究的大多数过滤器都带有相当出色的文档,里面讲述了如何配置它们以与各种MTA协同工作。为了测试,我开发了两组消息集:垃圾邮件和合法邮件。实际上这是我从前几个月收到的邮件中抽取出的两组消息,但我又向其中添加了一个重要的消息子集,在这些消息中,有的来自几年前,这就扩大了测试范围。我不能确切地知道,在下个月的电子邮件中会包含什么,但过去的邮件已为以后的趋势提供了极好的线索。这听上去似乎很神秘,但我的意思是,我不希望把这些模式只限制于一些单词、短语和正则表达式等,这些也许能描述出最近电子邮件的特征,但却不能概括成这两种类型。除了这两组电子邮件,我为那些工具开发了培训(training)消息集,以“了解”什么是垃圾邮件,什么不是垃圾邮件消息。这些培训消息集比较大,而且有一部分是与测试集不相交的。测试集中包含略少于2000条的垃圾邮件消息,合法消息的数目与此大致相同。而培训集中的消息是它们的两倍。关于测试,这里有必要强调一下一般性的注意事项。在垃圾邮件过滤器中的“误否认”(Falsenegatives)仅意味着一些不需要的消息进入了邮箱。这不是一件好事,但其本身没有多可怕。“误承认”(Falsepositive)是指合法消息被误判为垃圾邮件。这可能非常糟糕,因为一些合法邮件实际上很重要,甚至非常紧急,有时尽管这些消息是一些聊天性质的邮件,但我们也不希望丢失它们。大多数过滤软件能让您将受拒的消息保存在临时文件夹中,等待您去查看—但如果需要查看的文件夹中充斥着大量的垃圾邮件,那么这个软件的实用性会因此而削弱。1.基本的结构化文本过滤器我所使用的电子邮件客户机能够根据特定邮件头域、一般性邮件头和/或正文中的简单字符串来对到来的电子邮件进行排序。这个功能非常简单,甚至不包含正则表达式匹配。几乎所有的电子邮件客户机都有这样的过滤能力。在过去几个月中,我开发了少量的文本过滤器。这些少量的简单过滤器能正确捕获我所收到垃圾邮件中的80%。遗憾的是,这些过滤器的“误承认”的发生率比较高—以至于我不时地需要手工来检查垃圾邮件文件夹中的某些邮件。(我将可能的垃圾邮件进行分类,放在几个不同的文件夹中,然后保存它们以形成消息语言资料库(corpora)。)虽然各个用户之间具体的细节会有所不同,但对大多数读者来讲,这个通用的模式是很有用的:集合1:一些人或邮件列表在他们的邮件头上做了一些有趣的手脚,使得它们与众不同。我捕获邮件头中的某些内容(通常是From:),并将其放在“白名单(whitelist)”中(“收件箱”或其它文件夹)。集合2:我执行以下垃圾邮件过滤器(没有按特定的顺序):识别特定的恶意邮件发送者。查找作为From:邮件头的“”。查找邮件头中的“@”(出于许多原因,许多垃圾邮件都有这个标记)。查找“Content-Type:audio”。我不需要这个,只有virii病毒需要(具体情况因人而异)。在邮件头中查找“euc-kr”和“ks_c_5601-1987”,我不懂这种语言,但出于某些原因,我收到了大量韩国垃圾邮件(当然,对于真正的韩国读者,这条规则恐怕不太适合他)。集合3:存储那些已知是合法地址的消息。我有几条这样的规则,但它们都仅仅与文字To:域相匹配。集合4:查找那些在邮件头中具有合法地址,但通过上一个To:过滤器没有捕获到的消息。我发现,只要我的邮件地址出现在Bcc:域,其中有一串按字母顺序排列的地址(譬如,mertz1@……、mertz37@……等)时,那这封邮件肯定是不请自来的邮件。集合5:到此,所剩下的可能就是垃圾邮件(它可能有伪造的邮件头以避免被识别出发送者的身份)。2.“白名单”/验证过滤器对于垃圾邮件的过滤,有一种主动性相当强的技术,我想称之为“白名单加自动验证”方法。这里有几种工具可以实现带验证的“白名单”:TDMA是一个深受大家喜爱的多平台开放源码工具;ChoiceMail是一个针对Windows的商业性工具;其它大多数似乎都比较初级。(请参阅本文后面的参考资料,那里有一些链接。)“白名单”过滤器连接到MTA,只有当接收者显式地同意接收,才会将邮件传到收件箱。其它消息会产生一个特殊的质询(challenge)响应给发送者。“白名单”过滤器的响应包含某种唯一的可以识别原始消息的代码,譬如,一个散列或序列标识。这个质询消息包含让发送者答复的指示,以便将其加到“白名单”中(这个响应消息必须包含由“白名单”过滤器生成的代码)。几乎所有的垃圾邮件信息中的回复地址信息都是伪造的,所以这个质询通常没有人会收到;但即便那些垃圾邮件发送者提供了有用的回复地址,但他们往往不会响应这个质询。当合法的发送者答复了这个质询之后,会将她/他的地址添加到“白名单”中,以便将来来自同一地址的消息会自动地通过检查。虽然我没有用过这些工具,而只是自己做了些实验,但我认为,“白名单”/验证过滤器几乎可以100%地将垃圾邮件消息阻挡在外面。可以想象,垃圾邮件发送者会开始在他们的系统中加一个质询响应,但只要稍微使质询消息变得复杂些,就可以解决这个问题(例如,要求对代码做一点小小的人为改动)。而且,如果垃圾邮件发送者响应了质询,那么就会使那些寻求合法地抵御垃圾邮件的人们可以更容易地跟踪到他们。“白名单”/验证过滤器这种做法给合法的发送者带来了额外的负担。由于有些通信者可能出于各种原因而无法响应质询,所以会带来“误承认”这种情况。在最好的情形下,合法发送者只需花费一点点精力即可。但在以下情况,发送者可能无法发送他们合法的消息:发送者具有不可靠的ISP,防火墙的要求过于严格,发送者具有多个电子邮件地址,不能够理解英语(或者质询所使用的语言),或者发送者只是忽略了质询以及不想被质询所干扰。而且,有时合法的“通信者”根本不是人,而是不能够响应质询的自动响应系统。“白名单”/验证过滤器可能需要额外花精力来处理邮件列表注册、在线购买、网站注册以及其它“自动通信”。3.分布式适应性黑名单垃圾邮件往往被定义为发送给大量接收方的邮件。实际上,几乎很少有垃圾邮件被定制为发送给个别接收方。然而,在缺少预先过滤的情况下,每个垃圾邮件的接收者必须按自己的“Delete”按钮来删除垃圾消息。分布式黑名单过滤器会让一个用户的“Delete”操作去警告其他许多用户,注意这个垃圾邮件消息。象Razor和Pyzor(请参阅参考资料)这样的工具运行在服务器一端,服务器上存储了一些已知垃圾邮件的摘要。当MTA收到一条消息时,会调用分布式黑名单过滤器来确定这条消息是否是已知的垃圾邮件。这些工具运用一些智能化的统计技术来创建摘要,使得在垃圾邮件作了微小的变动或自动的变化(或仅仅是由于传输路由的变化而导致邮件头的更改)时,也不会防止识别消息的身份。此外,分布式黑名单服务器的维护者经常会专门创建一些“蜜罐”地址,以引诱垃圾邮件(但从不针对合法的通信)。在我的测试中,发现用Pyzor,从没有出现“误承认”这类情况。我认为用其它类似的工具(如Razor)也不会出现这样的情况。对此有些常识。即使那些有不良企图的发送者可以篡改合法消息,他们也不可能让我的好消息样本向服务器报告—通常只有垃圾邮件是广泛分发的。可以想象,被大量发送但又是合法的消息(譬如,developerWorks时事通讯)可能会