基于黑名单识别垃圾邮件地址模块的设计与实现

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:wj841118
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:为了避免垃圾邮件给电子邮件的使用带来不便,通过对电子邮件地址在垃圾电子邮件黑名单进行对比、过滤便成为一个行之有效的手段。项目从设计思想、具体实现以及性能提升等方面阐述了基于黑名单识别垃圾邮件地址技术。
  关键词:垃圾邮件;黑名单;数据库;java BerkeleyDB
  中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)36-10606-02
  Design and Implementation of Anti-Spam module Based on the Blacklist of Email Address
  LI Qiong
  (Mianyang Normal University, Mianyang 621000, China)
  Abstract: In order to avoid the inconvenience caused by Spam,filtering spam address in the blacklist has become an effective means. In this paper, the design, implementation, performance described blacklist technology to identify spam.
  Key words: spam; blacklist; database; java BerkeleyDB
  电子邮件是最常用的网络应用之一,已经成为网络交流沟通的重要途径。但是,垃圾邮件(spam)随着互联网的不断发展而大量增长,现在包含着商业宣传、色情、政治,以及计算机病毒等不同内容的垃圾邮件可以说是铺天盖地。我校为方便全校教师教学工作而自行开发的邮件服务器受到了垃圾邮件的侵害,给学校的教师的正常教学工作带来极大的烦恼。为了解决这一问题,开发识别垃圾邮件模块的需求迫在眉睫。
  1 需求分析
  设计一个合格的垃圾邮件地址过滤模块,需要对模块需求有个大致的分析:
  1) 数据空间占用估算:目前我们已经拥有一个近百万级的垃圾邮件地址黑名单,为了满足日后需要,我们设计一个拥有5百万个垃圾电子邮件地址的黑名单,如果按照一个邮件地址约为28个字节的估算,则该黑名单约需占用133.51MB存储空间大小(尚未包括附属的空间开销)。如果服务器不仅仅完成黑名单查询工作,出于可靠以及内存消耗考虑,所有垃圾邮件数据是需要通过使用磁盘来存储。
  2) 查询时间占用估算:按照用户收发邮件的习惯,大家希望能在数秒内收到相应的邮件,这就约束了邮件地址过滤时间应该相当短暂,不宜超过1~2秒。
  3) 原来的邮件服务器是使用Java编写的,为了能较好的与原邮件系统进行融合,过滤模块同样采用Java实现。
  2 技术基础
  为了同时满足以上必要条件,从而排除了使用java中Set、Map容器(虽然该容器有很高的查询性能、但由于黑名单太大,这两种容器无法处理这样大量数据)以及常见的关系/对象型数据库(不能在很短的时间内在5百万的记录中查询出相应结果),而号称每秒能完成近百万次查询的高性能Berkeley DB是方案的不二之选。
  Berkeley DB(BDB)是一个高性能的,嵌入数据库编程库,和C语言,C ,Java,Perl,Python,Tcl以及其他很多语言都有应用程序编程界面。Berkeley DB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统包括大多数Unix类操作系统和Windows操作系统以及实时操作系统。数据访问算法可选用B 树算法、HASH算法、Recno算法和Queue算法。
  经过实际测试,Berkeley DB确实能胜任该项任务。
  3 设计及实现
  Berkeley DB作为垃圾邮件地址黑名单的存储、查询引擎,整个模块设计及实现尽可能围绕着提高处理性能展开。垃圾邮件地址作为Key(Data在这里没有存在的意义,但由于数据库的需要,就用1个字节的任意数值代替),记入黑名单数据库中。为了减小存储空间并提高性能,模块里对垃圾邮件地址作了一次反转操作,如将15608111788@sc.com转换为“moc.cs@88711180651”,使得整个黑名单数据的字母顺序非常接近,大大提高了缓存的效率和性能。对于海量数据Berkeley DB支持B Tree以及Hash两种访问算法,通过分析垃圾邮件地址的规律,并且通过实际测试(采用了9百万的数据),最终选择了B Tree算法。Berkeley DB本身还提供三种操作方式:Transactional(事物)、 Concurrent(并发)和Private(私有)。出于目前作为单机系统的考虑,模块采用Private方式,极大提高访问速度。
  整个模块以blacklist类来定义并实现,其他代码直接调用该类的类成员方法即可实现相应功能,以下是blacklist类的定义:
  public class blacklist
  {
  private Environment m_DbEnvironment = null;
  private Database m_Db = null;
  private static final String m_DbFileName = "blacklist.db"; //黑名单库的名称
  private static final File m_EnvDir = new File("/blacklist/env"); //BDB的环境文件目录
  private static final File m_DbDir = new File("/blacklist/db");//BDB的数据库文件目录
  public blacklist() {…}
  public boolean blacklist_open(){…} //打开数据库
  public void blacklist_close(){…} //关闭数据库
  public void blacklist_append(String email){…} //在数据库中追加黑名单
  public boolean blacklist_delete(String email){…} //在数据库中删除黑名单
  public long blacklist_load(String filename){…} //从文件中批量导入黑名单
  public boolean blacklist_search(String email){…} //在数据库中查找是否垃圾邮件
  }
  从以上类的定义中可看出类方法主要由load(从垃圾邮件名单文本文件中批量载入并保存至黑名单数据库中)、search(对任意邮件地址在黑名单数据中查询)、append(添加单个垃圾邮件地址至黑名单数据库中)和delete(从黑名单数据库中删除单个垃圾邮件地址)四个主要功能方法以及open和close两个辅助方法构成。
  下面的例子使用blacklist类的load方法对含有915万个邮件地址进行导入测试:
  (测试计算机配置:CPU为Intel P4 3.00GHz、RAM 512M、硬盘 IDE 7200RPM、WinXP SP2、JDK 1.6、Berkeley DB 4.7.25)
  public class load {
  public load() { }
  public static void main(String[] args) {
  blacklist app = new blacklist();
  app.open();
  long start, end;
  start = System.currentTimeMillis();
  app.load("/blacklist/915.txt");
  end = System.currentTimeMillis();
  System.out.println("load file(ms):" (end - start));
  app.close();
  }
  }
  结果为:load file(ms):1312516
  生成一个文件大小为413M的垃圾邮件地址的黑名单数据库,耗时也不过1313秒。通过以上结果可计算出,模块进行批量导入时每秒可导入5243个邮件地址。
  下面这个简单例子,在相同平台下对先前生成的黑名单进行模拟查询测试(测试的样本为2000个邮件地址,其中1000个在黑名单中,剩余1000个不在黑名单中):
  public class query
  {
  public query() {}
  public static void main(String[] args)
  {
  blacklist app = new blacklist();
  app.open();
  long start = 0, end = 0;
  File file = new File("/blacklist/test.txt");
  BufferedReader reader = null;
  start = System.currentTimeMillis();
  try
  {reader = new BufferedReader(new FileReader(file));
  String line = null;
  while ((line = reader.readLine()) != null)
  {app.search(line);
  }
  reader.close();
  }
  catch (IOException e)
  {
  e.printStackTrace();
  }
  end = System.currentTimeMillis();
  System.out.println((end-start) "ms");
  app.close();
  }
  }
  结果为:156ms(毫秒)
  可见,不论是否在黑名单库中,判别一个邮件地址的速度极快,每秒种可完成约12820次查询)。
  整个模拟测试运行中包括java虚拟机本身整个空间占用约为13M(包含1M缓存),基本满足垃圾邮件地址过滤的功能需求。
  4 性能提高
  如果需要增强垃圾邮件地址过滤处理能力,现有单机系统可以采用号称读取100万数据只需要0.33秒的Tokyo Cabinet数据库,该数据库比Berkeley DB 快3倍左右,并且能过Tokyo Tyrant轻松实现分布式处理。只是由于只能运行于Linux及32位操作系统下存在单个数据库文件不能超过2G的限制,因而本次没有采用该数据库引擎。
  另外还可以采用分布式计算,更可大幅度提高整个模块处理性能,例如采用FastDHT(高性能分布式Hash系统,底层存储仍采用Berkeley DB)、BigTable、HBase以及上面提到的Tokyo Tyrant等等,只是识别正确率可能会随着分布式系统的可能出现的节点故障而有所下降。
  5 结束语
  本文研究了对大批量垃圾邮件地址黑名单的存储、查询处理,在保证了较高的正确率、较少的空间占用的前提下,能够以较快的速度完成查询过滤工作,并且接口方法简单,较好的达到模块要求。
  该模块经过近2个月的运行,工作正常,有效地阻止了垃圾邮件的传播,极大地改善了教学环境,较好的达到防止垃圾邮件的目的。
  参考文献:
  [1] 《嵌入式数据库系统Berkeley DB》.http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html.
  [2] 《Getting Started with Berkeley DB for Java》. http://www.oracle.com/technology/documentation/berkeley-db/db/gsg/JAVA/BerkeleyDB-Core-JAVA-GSG.pdf.
  [3] Bind DLZ. http://bind-dlz.sourceforge.net/bdbhpt_driver.html.
其他文献
猪蓝耳病(PRRS)是由猪繁殖与呼吸综合征病毒(PRRSV)引起的一种繁殖障碍和呼吸道传染病。
笔者在生产实践中,就如何提高养兔经济效益进行了分析和总结,提出了以下技术措施。1 安排适宜繁殖强度一般饲喂全价颗粒料、采用自动饮水、管理措施配套的商品兔场,可安排配种间
目的:观察盐酸吡硫醇治疗多发性神经病(polyneuropathy)的临床疗效方法:将80例多发性神经病病人随机分成2组,治疗组40例,在常规治疗基础上加用注射盐酸吡硫醇剂量0.4/d,对照组40
妊高症是由于全身小动脉痉挛引起孕妇高血压、水肿和蛋白尿,是产科重要并发症,又是双胎妊娠最重要并发症。凡是重度妊高症易导致子痫、心肾功能衰竭及脑血管意外等,直接影响母婴