一种邮件传输方法及其系统与流程

文档序号:17757510发布日期:2019-05-24 21:25阅读:271来源:国知局
一种邮件传输方法及其系统与流程

本发明涉及计算机网络技术,为一种邮件传输方法及其系统。



背景技术:

目前很多企业为了信息安全的需要,安装了邮件安全管理系统,用于对员工邮件的监控和审查。一个基本的邮件安全管理系统通常包括邮件监控模块和邮件审查模块。当员工发送或接收邮件时,邮件监控模块会对邮件进行截取,下载到本地后再发送到邮件审查模块,由邮件审查模块对邮件内容进行安全检查,防止公司敏感信息泄露。

由于监控模块需要发送大量的邮件到审查模块,如何提高邮件的发送效率,就成为整个邮件管理系统性能优化需要考虑的重要因素。由于一份邮件既包括文本信息,也可能包括二进制数据,如附件、图形等信息,因此邮件数据的传输就无法采用xml(extensiblemarkuplanguage)和json(avascriptobjectnotation)等文本编码方式,只能采用二进制编码的方式。另外,一份邮件会包含众多的信息,但对于安全监控系统而言,只关心和安全有关的信息,如发件人、收件人、抄送人、邮件正文、标题和附件等信息,不相关的信息无需传输。

目前大多数邮件的格式都遵循rfc822(《(standardfortheformatofarpainternettextmessages)》)的规定。rfc822规定了一封信包括一个必须的头部(head)和一个可选的体部(body)组成。头部和体部之间用一个空行来分割。头部定义了一个邮件的各项基本要素。邮件的头部由多个头部域(headerfields)组成,每一个头部域都包括域名(field-name)和域体(field-body),它们之间以":"分隔。每一个头部域都可以看作由ascii码字符组成的独立的文本。常见的头部域包括"return-path"、"received"、"date"、"from"、"subject"、"sender"、"to"、"cc"、"mime-version"、“content-type”等字段,各头部域之间没有规定的顺序。邮件的体部(body)既可以包括邮件正文和附件,也可以只包括邮件正文。如果邮件体部(body)包含邮件正文和附件,则content-type域的值为“multipart/mixed”,此时通过boundary标识将附件内容同邮件正文分割开来。

现有的邮件发送方式是由监控模块对完整的邮件内容的文本数据编码为二进制数据,然后通过tcp协议将二进制数据发送到审查模块,由于发件人、收件人、抄送人、标题等信息为固定字段,这些字段转换为二进制数据时会占用大量的带宽。



技术实现要素:

本发明要解决的问题是:现有的邮件发送方式是由监控模块对完整的邮件内容的文本数据编码为二进制数据,然后通过tcp协议将二进制数据发送到审查模块,由于发件人、收件人、抄送人、标题等信息为固定字段,这些字段转换为二进制数据时会占用大量的带宽,需要降低邮件传输带宽。

本发明的技术方案为:一种邮件传输方法,在邮件监控模块和邮件审查模块之间建立tcp连接,邮件监控模块向邮件审查模块发起tcp请求,建立tcp连接后,按照自定义的报文格式将邮件内容发送到邮件审查模块,邮件传输过程如下:

步骤一、邮件监控模块解析邮件头和正文,邮件监控模块读取邮件文件获得邮件内容,解析邮件头,获得发件人、收件人、抄送人、邮件标题等字段,然后解析邮件正文,最后将邮件头字段和邮件正文字段转换为keyvalue对象,一个keyvalue对象由多个条目构成,每个条目都是一个键值对<字段名称,字段内容>,键值对的字段名称和字段内容都为文本类型;

步骤二、邮件监控模块解析邮件附件,在步骤一的基础上,邮件监控模块继续解析邮件文件内容,如果邮件内容中有附件,邮件监控模块跳过boundary标识,然后依次解析出附件的内容、附件的文件名称,其中附件的内容为二进制数据,附件的文件名称为文本数据;

步骤三、邮件监控模块将解析出的邮件头、正文和附件进行编码,先将字段名称转换为二进制的编码,记为a,然后将字段内容转换为byte类型的数组,记为b,最后计算数组b的长度,记为c;

步骤四、邮件监控模块端将编码a、数组b和长度c组装成数据单元,即自定义的报文,其中编码a对应数据单元的“字段编码”,长度c对应数据单元的“字段长度”,数组b对应数据单元的“字段内容”,重复以上操作形成数据体,记为t,然后计算数据体的的长度,记为l,最后将数据头、数据长度l和数据体t组装成一个二进制数组;

步骤五、邮件监控模块向邮件审查模块发起tcp连接,然后将二进制数组发送到邮件审查模块;

步骤六、邮件审查模块收到二进制数组后,对该数组进行解析,分别解析出数据头、数据长度和数据体;

步骤七、邮件审查模块对数据体进行解析,解析出字段编码、字段长度和字段内容;

步骤八、邮件审查模块将字段编码转换为字段名称,如果该字段为邮件头和邮件正文,则将该内容导出到本地指定的文件中;如果该字段为附件,则将字段内容的数据附加到之前指定文件的尾部。

所述报文包括数据头、数据体长度和数据体三部分,数据头为定位标志、数据体长度记录了数据体占用空间的字节数;数据体由若干数据单元构成,每个数据单元由{字段编码,字段长度,字段内容}构成;报文中的所有数据都为二进制格式,其中数据头、数据长度、数据单元的“字段编码”均为固定长度的二进制数。

本发明还提出一种邮件传输系统,包括邮件监控模块和邮件审查模块,邮件监控模块和邮件审查模块之间通过tcp连接,邮件监控模块和邮件审查模块上存储有计算机程序,所述计算机程序被执行时实现权利要求1所述的邮件传输方法。

为了降低邮件传输的带宽,本发明提出一种基于tcp协议的邮件数据传输的方法和系统,该方法通过自定义报文的方式将邮件内容由邮件监控模块发送到邮件审查模块,由于采用了自定义报文的方式,因此本发明不仅可以对占用大量带宽的固定字段进行单独编码,以减少这些字段占用的空间,还可以根据需要定制发送邮件的字段,只传输和安全监控有关的数据,无需传输完整的邮件内容,使本发明方法更具有灵活性。

附图说明

图1为本发明中定义的报文格式示意图。

图2为本发明系统的结构示意图。

具体实施方式

为了传输邮件的内容,本发明定义了报文格式,如图1所示。该报文包括数据头、数据体长度和数据体三部分,数据头为定位标志、数据体长度记录了数据体占用空间的字节数。数据体由若干数据单元构成,每个数据单元由{字段编码,字段长度,字段内容}构成。报文中的所有数据都为二进制格式,其中数据头、数据长度、数据单元的“字段编码”均为固定长度的二进制数。其中,定位标志其实就是“同步标志”,这是tcp自定义协议的一个公知的方法:通过这个同步标志,接收端在持续不断地接收数据时,看到这个标志,就知道现在要传输数据了。

本发明在邮件监控模块和邮件审查模块之间建立tcp连接,邮件监控模块向邮件审查模块发起tcp请求,建立tcp连接后,按照上述的报文格式将邮件内容发送到邮件审查模块,本发明所述的邮件传输过程如下:

步骤一、邮件监控模块解析邮件头和正文。邮件监控模块读取邮件文件获得邮件内容,解析邮件头,获得发件人、收件人、抄送人、邮件标题等字段,然后解析邮件正文,最后将邮件头字段和邮件正文字段转换为keyvalue对象,一个keyvalue对象由多个条目构成,每个条目都是一个键值对<字段名称,字段内容>,键值对的字段名称和字段内容都为文本类型。

步骤二、邮件监控模块解析邮件附件。在步骤一的基础上,邮件监控模块继续解析邮件文件内容,如果邮件内容中有附件,邮件监控模块跳过boundary标识,然后依次解析出附件的内容、附件的文件名称,其中附件的内容为二进制数据,附件的文件名称为文本数据。附件的内容,是指发邮件时带的附件,如果带的是图片,那这个附件就是一个图片文件,这个图片的文件名称为a.jpg,如果是一个文档,那文件名称可能是dd.doc。

步骤三、邮件监控模块将解析出的邮件头、正文和附件进行编码。首先将字段名称转换为二进制的编码,记为a,然后将字段内容转换为byte类型的数组,记为b,最后计算数组b的长度,记为c。

步骤四、邮件监控模块端将编码a、数组b和长度c组装成数据单元,其中编码a对应数据单元的“字段编码”,长度c对应数据单元的“字段长度”,数组b对应数据单元的“字段内容”。重复以上操作形成数据体,记为t,然后计算数据体的的长度,记为l,最后将数据头、数据长度l和数据体t组装成一个二进制数组。一个数据单元对应邮件头+正文+附件的编码。

步骤五、邮件监控模块向邮件审查模块发起tcp连接,然后将二进制数组发送到邮件审查模块。

步骤六、邮件审查模块收到二进制数组后,对该数组进行解析,分别解析出数据头、数据长度和数据体。

步骤七、邮件审查模块对数据体进行解析,解析出字段编码、字段长度、字段内容。

步骤八、邮件审查模块将字段编码转换为字段名称。如果该字段为邮件头和邮件正文,则将该内容导出到本地指定的文件中;如果该字段为附件,则将字段内容的数据附加到之前指定文件的尾部。

以上所述即为一封邮件的传输过程。本方法由于采用二进制方式传输数据,传输效率高,另外对邮件头字段建立了字段名称和字段编码的对应关系,在传输过程中用字段编码代替了字段名称,减少了传输的数据量,是一种简单高效的邮件传输方法。

下面对本发明的效果进行说明。

假设有如下一封邮件,该邮件的格式符合rfc822的格式:

其中【1】~【6】是我给每一行加的编号,不是邮件内容的一部分。

【1】from:a@sina.com

【2】to:b@sohu.com

【3】subject:test

【4】

【5】helloworld

这个邮件的【1】~【5】行信息为头部(head),【4】行为一个空格行,【5】行为邮件体(body)。传统的方式是对以上内容这么编码的:

<“from”,“a@sina.com”>,<“to”,“b@sohu.com”>,<“subject”,“test”>

<“body”,“hellowworld”>

本发明方案是这么编码的:

<0x10,a@sina.com,10>,

<0x11,“b@sohu.com”,10>,<0x12,“test”,4>

<0x13,“helloworld”,11>

这里的<0x10,a@sina.com,10>就是上面步骤四说的数据单元,a为0x10,b为“a@sina.com”,c为10表示a@sina.com的长度。

也就是本发明在传统方案的基础上,把from字段用二进制数据0x10、to字段用二进制数据0x11进行了编码。这个编码规则是本发明提出的设计,在邮件监控模块和邮件审查模块各留一份,这样当邮件审查模块看到0x10就知道这是from字段,看到0x11就知道这是to字段了。

这样做的好处是节省了传输的数据量:传统方式对“from”进行二进制编码,占用4个字节,而我们的方式只需要传递0x10,只占用一个字节。数据量节省了,传输效率就提高了。

另外,本发明在编码过程中增加了c字段,这样在tcp协议的数据传输过程中,可以迅速地根据这个字段的内容,切割出数据单元,提高了数据解析的效率。

下面以一个具体实施例来说明本发明的具体实施。

1)为邮件内容建立字段名称和字段编码的对应关系。邮件头部通常包括“from”、“to”、“subject”等字段,分别表示邮件的发送方、接收方、邮件主题,本步骤通过哈希表建立字段名称和字段编码的对应关系,哈希表h为{<from,0x01>,<to,0x02>,<subject,0x03>}。此外哈希表h还为邮件正文、邮件附件等字段建立对应关系{<content,0x11>、<appendnum,0x12>,<appenddata,0x13>},其中content表示邮件正文,appendnum表示附件数量,appenddata表示附件数据。

2)邮件监控模块读取邮件文件,首先读取邮件头部,假设邮件头部包含数据“from:a@a.comto:xcl@xxx.comsubject:hello”,则将该数据转换为keyvalue对象,keyvalue对象也是一个哈希表,其内容包括{<from,a@a.com>,<to,xcl@xxx.com>,<subject,hello>}。keyvalue对象既包括文本数据,也包括二进制数据。

3)如果邮件包含邮件正文,邮件监控模块将正文解析出来,在keyvalue对象中插入条目<content,邮件正文>。如果邮件包含附件,邮件监控模块将附件解析出来,在keyvalue对象中插入条目<appendnum,附件数量>和<appenddata,附件的二进制数据>。

4)邮件监控模块对keyvalue中的每个条目进行编码。首先取出条目<from,a@a.com>,查找哈希表h获得字段名称“from”对应的字段编码0x01,然后将字符串“a@a.com”通过utf8编码的规则转换为二进制数组,接着计算出字符串“a@a.com”的长度值7。重复本步骤完成对keyvalue对象所有条目的处理。

5)邮件监控模块将每个条目编码后的二进制数据组装成数据单元。首先创建数据单元的的内存,然后将步骤四对条目<from,a@a.com>计算出的编码01、长度值7、二进制数组分别填写到数据单元的字段编码、字段长度、字段内容等地方,形成的数据单元值为[0x01,0x07,0x61,0x40,0x61,0x2e,0x6f,0x6d]。重复以上操作,对keyvalue中的所有编码后的条目都做同样的处理。

6)邮件监控模块组建发送数据报文。首先将步骤五创建的数据单元合并为数据体,然后计算出数据体的长度,假设数据头为二个字节的固定值[0xff,0xee],则对数据头、数据长度、数据体进行组装,形成发送数据报文[0xff,0xee,数据体长度,数据体]。

7)邮件监控模块向邮件审查模块端发起tcp连接,然后将二进制数组发送到邮件审查模块。

8)邮件审查模块接收邮件数据。为了完整地接收邮件数据,邮件审查模块首先创建接收缓冲区。当缓冲区中接收到两个字节的数据后,将接收到的数据和[0xff,0xee]进行比较,如果不相符,则丢弃数据;如果相符,则继续接收第三个字节的数据,并根据第三个字节的数据创建第二个缓冲区,第二个缓冲区的大小由第三字节的数据确定。当第二个缓冲区已满,表示数据体数据已接收完整。

9)邮件审查模块从数据体的数据中解析出数据单元。根据[字段编码,字段长度,字段内容]的编码规则,解析出第一个数据单元的数据[0x01,0x07,0x61,0x40,0x61,0x2e,0x6f,0x6d],根据字段编码0x01查找哈希表h的数据{<from,0x01>,......},获得对应的字段名称“from”,然后通过utf8对[0x61,0x40,0x61,0x2e,0x6f,0x6d]进行解码,获得字段值“a@a.com”,最后将<from,a@a.com>插入到keyvalue对象中。重复以上操作,将数据单元的所有数据都做相应的处理,并将解析出的数据插入到keyvalue对象。

10)邮件审查模块遍历keyvalue中的所有条目,首先从每个条目中提取出key值和value值,然后在本地创建文件,如果keyvalue中的条目是邮件头类型,则将字段的key和value值写到指定文件中。当所有邮件头的条目处理完成,再判断keyvalue中的条目是否包含正文类型,如果包含正文类型,则将正文条目的key和value值继续写到指定文件中,并把数据贴到邮件头数据的尾部。最后再判断keyvalue中的条目是否包含附件,如果包含附件类型,则将附件的key和value值继续写到指定文件中,并把数据贴到邮件正文数据的尾部。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1