首页> 中国专利> 基于mbx格式的邮件正文的获取方法及系统

基于mbx格式的邮件正文的获取方法及系统

摘要

本发明提供一种基于mbx格式的邮件正文的获取方法及系统,其中的方法包括,将mbx格式的邮件映射到内存;将映射到内存的mbx格式的邮件的首行转换成模式串,并将模式串的前六个字节作为模式子串;在映射到内存的mbx格式的邮件除了第一行的其余行首部位置添加一个标志;将每行标志后的六个字节形成数据块映射到缓存上,并对多行的数据块进行分组;通过分段hash映射方法筛选出每组数据块中的模式子串,并记录模式子串的位置;再通过查找标志确定及记录空行的位置;最后,通过匹配空行的位置和模式子串的位置确定邮件正文的位置,并获取邮件正文。通过本发明,在获取邮件正文时能够减少频繁访问磁盘带来的损耗,并且能够节省获取邮件正文的时间。

著录项

  • 公开/公告号CN103559244A

    专利类型发明专利

  • 公开/公告日2014-02-05

    原文格式PDF

  • 申请/专利权人 东软集团股份有限公司;

    申请/专利号CN201310521274.0

  • 发明设计人 吴子章;刘申;

    申请日2013-10-28

  • 分类号G06F17/30;

  • 代理机构北京鸿元知识产权代理有限公司;

  • 代理人陈英俊

  • 地址 110179 辽宁省沈阳市浑南新区新秀街2号

  • 入库时间 2024-02-19 22:14:31

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-08-24

    授权

    授权

  • 2014-03-12

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20131028

    实质审查的生效

  • 2014-02-05

    公开

    公开

说明书

技术领域

本发明涉及计算机数据通信技术领域,更为具体地,涉及一种基于mbx 格式的邮件正文的获取方法及系统。

背景技术

随着社会的进步和技术的发展,电子邮件已经成为人们工作中主要的通 信手段。如今互联网上对于邮件正文的获取与过滤,扮演着防止数据泄露与 拦截垃圾邮件等重要角色,越来越受到网络管理者的关注与重视,对于海量 的mbx格式邮件正文的提取,直接为不同操作系统的防止数据泄露与垃圾邮 件过滤等提供重要的原材料,在整个网络防护系统中起到提取关键信息的预 处理作用,同时其性能直接影响到整个防护系统乃至整个网络拓扑的吞吐量。

在当前邮件正文的提取方法中,mbx格式的邮件因存储多封邮件,处理 起来会消耗很多时间,当防火墙或网上的服务器需要处理大量mbx格式的邮 件数据库时,获取邮件正文的时间消耗会与邮件大小成正比例增加,在获取 邮件正文的过程中,需要对邮件的头部特征进行搜索与定位,而传统的特征 搜索算法无论是多模还是单模,都需要对邮件内容进行反复地遍历,以致消 耗很多的时间;同时,频繁地访问磁盘也对系统的性能带来极大的损耗,延 长了海量mbx格式邮件正文提取的时间。

发明内容

鉴于上述问题,本发明的目的是提供一种基于mbx格式的邮件正文的获 取方法及系统,以解决在提取mbx格式邮件正文的过程中,频繁访问磁盘造 成系统性能损耗的问题,提高提取mbx格式邮件正文的效率。

本发明提供一种基于mbx格式的邮件正文的获取方法,包括:

将mbx格式的邮件批量映射到内存;将批量映射到内存的mbx格式的邮 件的首行转换成模式串,并将模式串的前六个字节作为模式子串,在批量映 射到内存的mbx格式的邮件除首行之外的其余行的首部位置添加标志;

将每行标志后的六个字节形成数据块映射到缓存上,然后对数据块进行 分组,筛选出每组数据块中的模式子串,并记录模式子串的位置;并且,通 过查找每行首部位置的标志确定并记录空行的位置;

通过匹配空行的位置和模式子串的位置确定邮件正文的位置;

根据所确定的邮件正文的位置获取邮件正文。

本发明还提供一种基于mbx格式的邮件正文的获取系统,包括:

邮件映射单元,用于将mbx格式的邮件批量映射到内存;

模式串转换单元,用于将批量映射到内存的mbx格式的邮件的首行转换 成模式串;

模式子串生成单元,用于将模式串的前六个字节作为模式子串;

标志添加单元,用于在批量映射到内存的mbx格式的邮件除首行之外的 其余行的首部位置添加标志;

数据块映射单元,用于将每行标志后的六个字节形成数据块映射到缓存 上;

数据块分组单元,用于对映射到缓存上的数据块进行分组;

模式子串筛选单元,用于筛选出每组数据块中的模式子串;

模式子串记录单元,用于记录筛选出的模式子串的位置;

空行位置确定单元,用于通过查找标志确定空行的位置;

空行位置记录单元,用于记录确定出的空行的位置;

邮件正文确定单元,用于通过匹配空行的位置和模式子串的位置确定邮 件正文的位置;

邮件正文获取单元,用于根据所确定的邮件正文的位置获取邮件正文。

利用上述根据本发明提供的基于mbx格式的邮件正文的获取方法及系 统,通过批量地将邮件数据映射到内存,来减少频繁访问磁盘带来的损耗, 通过跨行匹配、与在缓存上进行的跨数据块匹配,极大地降低复杂模式串的 匹配几率,根据mbx格式特征实时地调节数据块尺度,从而提升模式子串预 匹配的性能,而且本发明采用的分段hash映射方法,第一段的hash查询与第 二段的精确过滤相结合,将冲突发生的概率降到百万分之一,由于模式匹配 过程的性能提升,带来整体邮件正文提取性能的提升。

为了实现上述以及相关目的,本发明的一个或多个方面包括后面将详细 说明并在权利要求中特别指出的特征。下面的说明以及附图详细说明了本发 明的某些示例性方面。然而,这些方面指示的仅仅是可使用本发明的原理的 各种方式中的一些方式。此外,本发明旨在包括所有这些方面以及它们的等 同物。

附图说明

通过参考以下结合附图的说明及权利要求书的内容,并且随着对本发明 的更全面理解,本发明的其它目的及结果将更加明白及易于理解。在附图中:

图1为mbx格式邮件的结构图;

图2为根据本发明的基于mbx格式的邮件正文的获取方法的流程图;

图3为根据本发明实施例的基于mbx格式的邮件正文的获取方法的流程 图;

图4为根据本发明实施例每次分组的行数调节示意图;

图5为根据本发明实施例的hash表映射示意图;

图6为本发明实施例的跨行匹配示意图;

图7为根据本发明的基于mbx格式的邮件正文的获取系统的结构框图。

在所有附图中相同的标号指示相似或相应的特征或功能。

具体实施方式

在下面的描述中,出于说明的目的,为了提供对一个或多个实施例的全 面理解,阐述了许多具体细节。然而,很明显,也可以在没有这些具体细节 的情况下实现这些实施例。在其它例子中,为了便于描述一个或多个实施例, 公知的结构和设备以方框图的形式示出。

为了详细清楚的描述本发明提供的基于mbx格式的邮件正文的获取方法 及系统,下面首先对mbx格式的邮件结构进行说明。

mbx邮件格式是一种MAC/Unix系统下的邮件存储格式,其内容由消息 分隔符、消息头部、空行、消息正文组成,具有明显特征,图1示出了mbx 格式邮件的结构。

如图1所示,邮件第一行为消息分隔符由“From<>…”组成,邮件第二行 到第十五行为消息头部,消息头部的下面是空行,空行下面是邮件正文,mbx 邮件结构是格式本身定义的,针对mbx格式邮件的结构,首先将消息分隔符 转换成模式串:

^From<*>{Sun,Mon,Tue,Wed,Thur,Fri,Sat}{Jan,Feb,Mar,

Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}\[\d+\]\[\d+\]*\r

由于在非贪婪模式匹配下,可以准确地确定每封邮件的开始,而距离该 模式串最近的空行则可以表示邮件正文的开始;下一封邮件的该模式串不但 可以标识下一封邮件的开始,同时也可以标识上一封邮件正文的结束。因此, 我们在数据流中,通过模式匹配该模式串及空行来确定邮件正文的位置。

然而,执行上述复杂模式串的精确匹配,同时频繁地访问磁盘文件,会 给性能带来极大的损耗。所以,本文通过批量地将邮件数据映射到内存,来 减少频繁访问磁盘带来的损耗。

本发明具体的思路是:先通过批量的内存映射文件降低访问磁盘文件的 性能损耗,根据mbx格式特征设计模式串的跨行搜索匹配方法,通过对比目 标串与待匹配串在缓存中的hash表来实现预过滤,再采用逆向bloom filter思 想实现模式串的跨数据块(本发明将映射到缓存上的多行数据称为数据块) 匹配,从而确定邮件正文的位置,极大地提高邮件正文提取的效率。

图2示出了根据本发明的基于mbx格式的邮件正文的获取方法的流程。

如图2所示,在基于mbx格式的邮件正文的获取过程中,首先,将mbx 格式的邮件批量映射到内存(步骤S200);然后,将批量映射到内存的mbx 格式的邮件的首行转换成模式串,并将模式串的前六个字节作为模式子串, 在批量映射到内存的mbx格式的邮件除首行之外的其余行的首部位置添加标 志;将每行标志后的六个字节形成数据块映射到缓存上,然后对数据块进行 分组,筛选出每组数据块中的模式子串,并记录模式子串的位置;并且,通 过查找每行首部位置的标志确定并记录空行的位置(步骤S201);接着,通过 匹配空行的位置和模式子串的位置确定邮件正文的位置(步骤S202);最后, 根据所确定的邮件正文的位置获取邮件正文(步骤S203)。

为了更为详细地说明本发明提供的基于mbx格式的邮件正文的获取方 法,图3示出了根据本发明实施例的基于mbx格式的邮件正文的获取方法的 流程。

如图3所示,本发明提供的基于mbx格式的邮件正文的获取方法的流程, 包括:

S300:将mbx格式的邮件数据批量映射到内存。

为了减少处理mbx格式的邮件时访问磁盘的次数,先将mbx格式的邮件 数据批量映射到内存中,同时,对每次映射到内存的文件大小进行限制,通 过读取系统的内存占用百分比来确定每次映射到内存的文件大小,然后进行 内存对齐,以提高内存利用率,对于一封邮件分别在两次内存映射上的情况, 将不完整的邮件缓存起来,等待下一次邮件数据映射到内存使邮件完整后, 再获取邮件正文。

S301:添加并查找标志“0A”。

由于能够表征邮件开始的消息分隔符可以被上述模式串表示,且该模式 串都是在每行的开始(除去第一封邮件外,其他邮件的模式串都是在换行符 “0A”之后)。因此,针对这种格式特征,在每个mbx邮件的开始添加一个标志 “0A”,使每个模式串“From<>…”都是在“0A”之后,由于对模式串的定位可以 转换为对模式子串“From<”的定位,因此可以转换为对全文搜索“0A”,对其 位置进行第一轮的筛选,使原来的逐个字节查找匹配转换为逐行且只在每行 的前六个字节查找匹配,这样不但极大地缩小了查找的范围,在海量邮件处 理的时候加快了搜索速度,同时为后面的逐个数据块查找奠定基础。

由于每封邮件首行的模式串只有前六个字节相同即“From<”,而从第七 个字节开始不一定相同了,所以只能将每封邮件首行的模式串的前六个字节 作为模式子串进行筛选,如果每封邮件首行的模式子串不相同则不无法进行 筛选从而无法定位模式子串。

S302:记录“0A”的位置Position[i]。

需要说明的是,将每个“0A”的位置指针保存在Position[i]数组中是为了跨 数据块匹配提供方便。

S303:将“0A”及其后面的六个字节hash形成数据块映射到缓存上。

需要说明的是,对于20K或32K的缓存我们只使用18K就够了,因为每 次hash映射到缓存上的数据行不超过3K。

S304:初始化数据块行数。

由于每次数据hash映射到缓存上的最大行数可以达到3×1024行,本实 施例对这些行数进行分组,图4为根据本发明实施例每次分组的行数调节示 意图。

如图4所示,初始状态可以设定数据块每组的行数n=10行,之后映射到 缓存上预匹配的数据块每组的行数为平均邮件头的长度,且初始计算的位置 尽量定在邮件头部开始的位置,因为这样根据统计来的结果不断调整每次分 组的行数,从而动态地使能够跳过的数据块行数最大。

S305:计算n行“0A”后面六字节的hash值。

S306:查看Hash“From<”是否属于该集合,如果是,执行步骤S307,如 果否,执行步骤S313。

这里运用分段hash的方法,将模式子串“From<”分成四字节的字母模式 串“From”与一个两字节的符号模式串“<”,分别进行hash值的计算,然后, 对前四字节和后两字节依次向左偏移八字节,分别存储在32位的hash值中, 前四字节映射形成相应的hash表1,后两字节映射形成相应的hash表2,映 射公式如公式(2)所示,因此,前四字节偏移后计算出的hash值与前四字节 未偏移计算出的hash值之间就存在着一一对应,其冲突发生概率为0;而对 后两字节的hash计算是非常均匀分布的,且其冲突符合小概率分布。

hash=hash<<8+charAt(i),i[0,3](hash<<8)^charAt(i)*33,i[4,5]---(2)

其中,char At(i)表示的是数据串的第i个元素的ASCII码值。

图5为根据本发明实施例的hash表映射示意图,hash表1和hash表2都 是一维的表,如果想查询Hash“From<”是否属于该集合,首先遍历一维表1, 判断“From”偏移后计算出hash值是否在hash表1中,如果在,遍历表2,判 断“<”偏移后计算出hash值是否在hash表2中,如果在,说明该数据属于这 个集合;如果上述两个步骤有一个判断出否,则说明数据不属于该集合。

其中,集合表示映射到缓存上的数据块,判断“From<”(模式子串)是 否属于该集合就是判断“From<”是否在该数据块内。

S307:精确匹配“From<”。

首先查询前四字节的hash表1,如图5所示,其时间复杂度为O(1),如 果hash表1中的值与前四字节未移动计算出的hash值相等,说明匹配上了字 母模式串“From”,再查询hash表2,如果hash表2中的值与后两字节未移动 计算出的hash值相等,说明匹配上了符号模式串“<”。

上述步骤S305-S307为本发明匹配“From<”优选的方法,还可以采用其它 方法进行“From<”的匹配,列举如下方法:

方法一:

首先,将模式子串“From<”与每个“0A”后面的六个字节分别计算hash 值,hash函数采用三十二位的FNV算法;然后,用模式子串“From<”的 FNVhash值在截取的六字节数据的FNVhash值中进行查找;如果找到,再采 用C语言的字符串比较库函数strcmpu与模式子串“From<”的FNVhash值 进行比较,若相等即为匹配上“From<”,否则继续向前匹配。

方法二:

首先,将模式子串“From<”与每个“0A”后面的六个字节,每个字节 都计算一个hash值,hash函数采用三十二位的FNV算法;然后,在缓存上 将模式子串“From<”的六个hash值,与每个“0A”后面的六个字节的hash 值逐一进行比较;若六个hash值都相等,则认为匹配上“From<”,否则继续 向前匹配。

方法三:

将模式子串“From<”与每个“0A”后面的六个字节,采用单个相互独 立的hash函数分别计算hash值(根据bloom filter理论,三个相互独立的hash 函数可以唯一确定一个值,不会有冲突);先比较“From<”的第一个hash 值与每个“0A”后面的六个字节的第一个hash值,若相等,则依次比较第二 与第三个hash值,如果三个“From<”的第一个hash值与一个“0A”后面的 六个字节的三个hash值都相等,则认为匹配上“From<”否则继续匹配。

方法四:

将模式子串“From<”分为两段“From”与“<”,分别按位计算hash函 数;将每个“0A”后面的六个字节,同比例地分为两段,使用方法三同样的 hash函数计算其hash值;分别将两部分hash值进行比较,若两部分的hash 值都相等,则认为匹配上“From<”,否则继续匹配;

上述例举了几个匹配模式子串的方法,但并不局限于只采用上述几个方 法进行模式子串的匹配。

S308:非贪婪模式匹配消息分隔符的正则表达式,并记录消息分隔符的 位置eposition[j]。

需要说明的是,消息分隔符的正则表达式就是代替成消息分隔符的模式 串,记录消息分隔符的位置就是记录模式串或模式子串的位置。

S309:查看hash“0A”是否属于该集合,如果是,执行步骤S310;如果否, 执行步骤S313。

同理查看hash“From<”是否属于该集合的方法,将“0A”映射到缓存上形 成hash表,如果在hash表中查询到“0A”,说明该“0A”在所述集合中。

S310:在第一列字符中查找“0A”并记录“0A”位置sposition[k]。

需要说明的是,查找并记录“0A”的目的是记录邮件中每一行开始的位置, 因为每一行开始的位置的前面必然是上一行结束的位置(文件的第一行除 外),即“0A”的置,因此找到“0A”的位置后面就是下一行开始的位置。

S311:判断L=min{sposition[k+m]|sposition[k+m]>eposition[j]}和 H=eposition[j+1]是否同时存在,如果是,则执行步骤S312,如果否,则执行 步骤S313。

其中,L表示集合{sposition[k+m]|sposition[k+m]>eposition[j]}中最小的 元素,这里sposition[k+m]记录的是空行的位置,即L表示距离上一次匹配上 的消息分隔符位置最近的空行的位置;

需要说明的是,因为每行的结束符是“0A”,在每行开始的位置添加一个 标志“0A”,所以空行是由两个“0A”连在一起组成,在查找空行的过程中,先 查找每行首部的“0A”,如果在“0A”后找到另一个“0A”,即两个“0A”中间没有 字符串,则将两个“0A”所在的行确定为空行,确定并记录模式串的位置和确 定并记录空行的位置不分先后顺序,可以先确定空行的位置,也可以先确定 模式串的位置。

H表示下一个消息分隔符(相对于eposition[j]来说的下一个就是 eposition[j+1])的位置。

为了更直观的说明本实施例,图6示出了本发明实施例的跨行匹配。

如图6所示,由于将邮件数据每行(除了第一行)的前六个字节映射到 缓存上,使原来的逐个字节查找匹配转换为逐行且只在每行的前六个字节查 找匹配,利用分段hash模式子串的方法筛选出模式子串,将模式串的定位转 换成模式子串的定位,再通过匹配模式子串和空行的位置来确定邮件正文的 位置,所以在查找邮件正文的过程中可以跨过消息头部,从而缩小查找的范 围,加快搜索速度。

S312:提取H与L之间的数据。

在步骤S311中,如果L=min{sposition[k+m]|sposition[k+m]>eposition[j]} 和H=eposition[j+1]同时存在,则与消息分隔符位置最近的空行和消息分隔符 之间的数据为邮件正文,在确定邮件正文的之后提取邮件正文。

S313:调整数据块每组的行数n。

其中,n=min{sposition[k]-eposition[j]}&&n>0,这个集合表示的是消息头 部的最小长度,也就是消息头部的平均长度。

通过计算邮件头的长度来不断调整每次预匹配的数据块长度,实现数据 块最大限度的跨越,降低复杂模式串精确匹配的几率,进而提高整个搜索匹 配的效率。

S314:判断邮件数据是否到结尾,如果是,则执行步骤S315;如果否, 则执行步骤S316。

S315:判断邮件是否完整,如果是,则执行步骤S312,如果否,则执行 步骤S317。

S316:根据position[i]数组中“0A”位置的指针跳过n行数据,再次判断邮 件数据是否结尾,如果是则执行步骤S315;如果否,则执行步骤S305。

S317:缓存不完整的邮件,执行步骤S300。

需要说明的是,缓存不完整的邮件,等待下一次邮件数据映射到内存使 该邮件完整后,再提取邮件正文。

与上述方法相对应,本发明还提供一种基于mbx格式的邮件正文的获取 系统。图7示出了根据本发明的基于mbx格式的邮件正文的获取系统的逻辑 结构。

如图7所示,本发明提供的基于mbx格式的邮件正文的获取系统700包 括邮件映射单元701、模式串转换单元702、模式子串生成单元703、标志添 加单元704、数据块映射单元705、数据块分组单元706、模式子串筛选单元 707、模式子串记录单元708、空行位置确定单元709、空行位置记录单元710、 邮件正文确定单元711、邮件正文获取单元712。

其中,邮件数据映射单元701用于将mbx格式的邮件映射到内存;模式 串转换单元702用于将映射到内存的mbx格式的邮件的首行转换成模式串; 模式子串生成单元703用于将模式串的前六个字节作为模式子串;标志添加 单元704用于在映射到内存的mbx格式的邮件除了首行的其余行首部位置添 加一个标志;数据块映射单元705用于将每行标志后的六个字节形成数据块 映射到缓存上;数据块分组单元706用于对多行的数据块进行分组;模式子 串筛选单元707用于筛选出每组数据块中的模式子串;模式子串记录单元708 用于记录筛选出的模式子串的位置;空行位置确定单元709用于通过查找标 志确定空行的位置;空行位置记录单元710用于记录确定出的空行的位置; 邮件正文确定单元711用于通过匹配空行的位置和模式子串的位置确定邮件 正文的位置;邮件正文获取单元712用于根据所确定的邮件正文的位置获取 邮件正文。

如上参照附图以示例的方式描述了根据本发明的基于mbx格式的邮件正 文的获取方法及系统。但是,本领域技术人员应当理解,对于上述本发明所 提出的基于mbx格式的邮件正文的获取方法及系统,还可以在不脱离本发明 内容的基础上做出各种改进。因此,本发明的保护范围应当由所附的权利要 求书的内容确定。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号