发明内容
本发明的目的在于提供一种邮件附件还原方法、系统、计算机设备及可读存储介质,用于解决现有技术中通过缓存整个邮件并解析整个MIME格式的邮件附件还原方法需要耗费大量的缓存,浪费内存的使用,并且降低邮件附件的还原效率的缺陷。
根据本发明的一个方面,提供了一种邮件附件还原方法,该方法包括如下步骤:
采用预设大小的缓存区接收目标邮件中的第一邮件数据,所述第一邮件数据包括所述目标邮件的附件中的数据;
查找所述第一邮件数据中是否存在预设的头部标识,以根据查找结果确定是否存在邮件附件的头部;
若查找到所述第一邮件数据中存在所述头部标识,查找所述第一邮件数据中是否存在预设的尾部标识;
若查找到所述第一邮件数据中存在所述尾部标识,则对所述第一邮件数据进行解码,得到还原后的所述目标邮件的附件。
可选地,所述方法还包括:
若查找到所述第一邮件数据中不存在所述头部标识,则清空所述缓存区中的所述第一邮件数据。
可选地,所述方法还包括:
若查找到所述第一邮件数据中存在所述头部标识,且不存在所述尾部标识,确定所述第一邮件数据中第一个头部标识的位置;
根据确定的所述第一个头部标识的位置,将所述第一邮件数据中第一个头部标识之后的邮件数据内容切割为至少一个数据块,所述至少一个数据块包括第一数据块,所述第一数据块的数据长度不大于所述第一头部标识之后的邮件数据内容的数据长度,且为预设数值的倍数的最大值;
对所述第一数据块进行解码,得到第一目标数据块;
将所述第一目标数据块发送至落盘程序,以保存所述第一目标数据块;
清空所述缓存区中的所述第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容。
可选地,所述第一数据块的数据长度小于所述第一头部标识之后的邮件数据内容的数据长度时,所述至少一个数据块还包括第二数据块,所述第二数据块为所述第一邮件数据减去所述第一数据块及所述第一个头部标识之前的邮件数据内容后剩余的邮件数据内容,所述清空所述缓存区中的所述第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容之后,还包括:
采用所述缓存区接收第二邮件数据,所述第二邮件数据包括所述目标邮件的附件中的数据,所述第二邮件数据的长度不大于所述第一数据块的长度与所述第一个头部标识之前的邮件数据内容的长度之和;
将所述第二数据块与所述第二邮件数据进行拼接,得到邮件拼接数据,并查找所述邮件拼接数据中是否存在所述尾部标识。
可选地,所述当所述邮件拼接数据中不存在所述尾部标识时,循环执行以下步骤:
将所述邮件拼接数据从前至后切割为第三数据块和第四数据块,所述第三数据块的数据长度等于所述第二邮件数据的长度,所述第四数据块为所述邮件拼接数据减去所述第三数据块后剩余的邮件数据内容;
对所述第三数据块进行解码,并将解码后的邮件数据内容发送至所述落盘程序;
清空所述缓存区中的所述第三数据块,并采用所述缓存区接收下一个邮件数据,所述下一个邮件数据的长度不大于所述第三数据块的数据长度,所述下一个邮件数据包括所述目标邮件的附件中的数据;
将所述第四数据块与所述下一个邮件数据进行拼接,得到下一个邮件拼接数据;
查找所述下一个邮件拼接数据中是否存在所述尾部标识;
直到查找到所述尾部标识时,停止执行以上步骤。
可选地,所述方法还包括:
当查找到所述邮件拼接数据中存在所述尾部标识时,对所述邮件拼接数据的邮件数据内容进行解码,得到第二目标数据块;
将所述第二目标数据块发送至所述落盘程序,以保存所述第二目标数据块;
将所述第一目标数据块及所述第二目标数据块进行合并,得到还原后的所述目标邮件的附件。
可选地,所述对所述第一邮件数据进行解码,得到还原后的所述目标邮件的附件,包括:
对所述第一邮件数据中所述头部标识及所述尾部标识之间的邮件数据内容进行解码,得到目标邮件附件数据块;
将所述目标邮件附件数据块发送至所述落盘程序,得到所述还原后的所述目标邮件的附件。
可选地,所述方法还包括:
当所述目标邮件的附件中的数据存在一个所述头部标识时,所述还原后的所述目标邮件包括一个附件,所述一个附件的邮件数据内容为所述头部标识及所述尾部标识之间的邮件数据内容;
当所述目标邮件的附件中的数据存在多个所述头部标识时,所述还原后的所述目标邮件包括多个附件,其中,每相邻两个所述头部标识之间的邮件数据内容对应所述多个附件的其中一个附件的邮件数据内容,且最后一个所述头部标识与所述尾部标识之间的邮件数据内容对应所述多个附件中最后一个附件的邮件数据内容。
为了实现上述目的,本发明还提供一种邮件附件还原系统,该系统具体包括以下组成部分:
接收模块,用于采用预设大小的缓存区接收目标邮件中的第一邮件数据,所述第一邮件数据包括所述目标邮件的附件中的数据;
第一查找模块,用于查找所述第一邮件数据中是否存在预设的头部标识,以根据查找结果确定是否存在邮件附件的头部;
第二查找模块,用于若查找到所述第一邮件数据中存在所述头部标识,查找所述第一邮件数据中是否存在预设的尾部标识;
还原模块,用于若查找到所述第一邮件数据中存在所述尾部标识,则对所述第一邮件数据进行解码,得到还原后的所述目标邮件的附件。
为了实现上述目的,本发明还提供一种计算机设备,该计算机设备具体包括:存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述介绍的邮件附件还原方法的步骤。
为了实现上述目的,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述介绍的邮件附件还原方法的步骤。
本发明提供的邮件附件还原方法,通过采用预设大小的缓存区接收目标邮件中的第一邮件数据,第一邮件数据包括所述目标邮件的附件中的数据;查找第一邮件数据中是否存在预设的头部标识,以根据查找结果确定是否存在邮件附件的头部;若查找到第一邮件数据中存在头部标识,查找第一邮件数据中是否存在预设的尾部标识;若查找到第一邮件数据中存在尾部标识,则对第一邮件数据进行解码,得到还原后的目标邮件的附件。。本发明实施例通过查找邮件附件的头部标识和尾部标识确定邮件附件,然后将邮件附件直接还原出来,而不需要缓存整个MIME格式的邮件内容,不仅节省了内存,而且提高了邮件附件的还原效率。
具体实施方式
这里将详细地对示例性发明实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性发明实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的系统和方法的例子。
在本发明使用的术语是仅仅出于描述特定发明实施例的目的,而非旨在限制本发明。在本发明和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本发明可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本发明范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
在本发明的描述中,需要理解的是,步骤前的数字标号并不标识执行步骤的前后顺序,仅用于方便描述本发明及区别每一步骤,因此不能理解为对本发明的限制。基于本发明中的发明实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他发明实施例,都属于本发明保护的范围。
下面结合附图对本发明实施例进行说明。
参阅图1,示出了本发明实施例提供的邮件附件还原方法的一种可选的应用环境示意图,用户使用计算机设备2通过网络6连接至服务器4,实现与服务器4的通信。计算机设备2接收来自服务器4的邮件数据,通过缓存预设大小的邮件数据,查找所述预设大小的邮件数据中的邮件附件头部标识及尾部标识,实现对邮件附件的还原。
实施例一
参阅图2,示出了本发明实施例提供的一种邮件附件还原方法的步骤流程示意图。可以理解,本发明实施例中的流程图不用于对执行步骤的顺序进行限定。本发明实施例以图1中所述计算机设备2为执行主体进行示例性描述,所述计算机设备可以包括诸如智能手机、平板个人计算机(tablet personal computer)、膝上型计算机(laptop computer)等移动终端,以及诸如台式计算机等固定终端。具体如下:
步骤S100,采用预设大小的缓存区接收目标邮件中的第一邮件数据,所述第一邮件数据包括所述目标邮件的附件中的数据。
具体地,在实际应用中,经常会遇到大邮件或者大邮件附件的情况,此时可以采用预设大小的缓存区接收目标邮件中的第一邮件数据,所述预设大小可以根据需要进行自由设置。
示例性的,假设需要对4M的邮件数据进行邮件附件的还原,在接收邮件数据之前,用户设置预设大小的缓存区,例如:设置一个大小为2M的缓存区。当开始接收邮件数据时,先接收前2M的邮件数据。
步骤S200,查找所述第一邮件数据中是否存在预设的头部标识,以根据查找结果确定是否存在邮件附件的头部。
具体地,若查找到所述第一邮件数据中存在所述预设的头部标识,则确定存在所述邮件附件的头部,也即存在所述邮件附件,否则不存在。所述头部标识可以为头部关键字,比如“Content-Disposition:attachment”。
在示例性的实施例中,所述方法还可以包括:
若查找到所述第一邮件数据中不存在所述头部标识,则清空所述缓存区中的所述第一邮件数据。
示例性的,假设缓存区中的邮件数据查找不到预设的头部标识“Content-Disposition:attachment”,则表示所述缓存区中的邮件数据中不存在邮件附件,此时将所述缓存区中的邮件数据进行清空。需要说明的是,在将所述缓存区中的邮件数据清空后,若还存在剩余的邮件数据,则继续接收下一预设大小的邮件数据。例如:总的邮件数据为4M,将缓存区中的前2M邮件数据清空后,继续接收剩余的2M邮件数据。
步骤S300,若查找到所述第一邮件数据中存在所述头部标识,查找所述第一邮件数据中是否存在预设的尾部标识。
具体地,若查找到所述第一邮件数据中存在所述头部标识,则表示所述第一邮件数据中存在邮件附件,此时查找所述第一邮件数据中是否存在预设的尾部标识。所述尾部标识可以为附件尾部结束符,比如“\r\n.\r\n”。
在示例性的实施例中,如图3所示,所述方法可以包括:
步骤S301,若查找到所述第一邮件数据中存在所述头部标识,且不存在所述尾部标识,确定所述第一邮件数据中第一个头部标识的位置;
步骤S302,根据确定的所述第一个头部标识的位置,将所述第一邮件数据中第一个头部标识之后的邮件数据内容切割为至少一个数据块,所述至少一个数据块包括第一数据块,所述第一数据块的数据长度不大于所述第一头部标识之后的邮件数据内容的数据长度,且为预设数值的倍数的最大值;
步骤S303,对所述第一数据块进行解码,得到第一目标数据块;
步骤S304,将所述第一目标数据块发送至落盘程序,以保存所述第一目标数据块;
步骤S305,清空所述缓存区中的所述第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容。
示例性的,假设接收邮件数据中查找到预设的头部标识“Content-Disposition:attachment”,则查找缓存区中邮件数据是否存在尾部标识“\r\n.\r\n”。如果缓存区中的邮件数据找不到尾部标识“\r\n.\r\n”,将所述第一邮件数据中第一个头部标识之后的邮件数据内容切割至少一个数据块,且所述至少一个数据块包括第一数据块,其中,第一数据块的数据长度可以小于或者等于第一头部标识之后的邮件数据内容的数据长度,且为预设数值的倍数的最大值,例如,Base64解码时,预设数值可以为4。将第一数据块进行Base64解码,得到目标数据块并将目标数据块发送至落盘程序进行保存,最后清空缓存区中的第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容。本发明实施例通过将超过所述预设大小的邮件数据进行切割,并将切割后的邮件数据进行解码进行邮件附件的还原,实现了任意大小的邮件附件的还原。
在示例性的实施例中,如图4所示,所述第一数据块的数据长度小于所述第一头部标识之后的邮件数据内容的数据长度时,所述至少一个数据块还包括第二数据块,所述第二数据块为所述第一邮件数据减去所述第一数据块及所述第一个头部标识之前的邮件数据内容后剩余的邮件数据内容,所述清空所述缓存区中的所述第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容之后,还包括:
步骤S311,采用所述缓存区接收第二邮件数据,所述第二邮件数据包括所述目标邮件的附件中的数据,所述第二邮件数据的长度不大于所述第一数据块的长度与所述第一个头部标识之前的邮件数据内容的长度之和;
示例性的,假设缓存区中的数据长度为200,所述第一邮件数据中所述第一个头部标识之前的邮件数据内容的数据长度为103,则所述第一数据块及所述第二数据块的数据长度之和L为97=200-103,所述第一数据块的数据长度L1为不大于L且为预设数值的倍数的最大值,所述预设数值可以为4,则96=4*24,且96<97,则L1为96,即所述第一数据块的数据长度为96,所述第二数据块数据长度为1。
步骤S312,将所述第二数据块与所述第二邮件数据进行拼接,得到邮件拼接数据,并查找所述邮件拼接数据中是否存在所述尾部标识。
示例性的,采用所述缓存区接收第二邮件数据,例如,缓存区中的最大数据长度为200,第二数据块的数据长度为1,在清空缓存区中第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容之后,能继续接收数据长度为199的邮件数据,然后将第二数据块与继续接收的第二邮件数据进行拼接,并继续查找拼接后的邮件数据中是否存在预设的尾部标识操作“\r\n.\r\n”。
在示例性的实施例中,如图5所示,当所述邮件拼接数据中不存在所述尾部标识时,循环执行以下步骤:
步骤S321,将所述邮件拼接数据从前至后切割为第三数据块和第四数据块,所述第三数据块的数据长度等于所述第二邮件数据的长度,所述第四数据块为所述邮件拼接数据减去所述第三数据块后剩余的邮件数据内容;
步骤S322,对所述第三数据块进行解码,并将解码后的邮件数据内容发送至所述落盘程序;
步骤S323,清空所述缓存区中的所述第三数据块,并采用所述缓存区接收下一个邮件数据,所述下一个邮件数据的长度不大于所述第三数据块的数据长度,所述下一个邮件数据包括所述目标邮件的附件中的数据;
步骤S324,将所述第四数据块与所述下一个邮件数据进行拼接,得到下一个邮件拼接数据;
步骤S325,查找所述下一个邮件拼接数据中是否存在所述尾部标识;
步骤S326,直到查找到所述尾部标识时,停止执行以上步骤。
示例性的,当所述邮件拼接数据中不存在所述尾部标识时,将所述邮件拼接数据切割成第三数据块和第四数据块,并将第三数据块进行解码,将解码后的数据块发送至落盘程序中并继续接收下一个邮件数据,将第四数据块与下一个邮件数据进行拼接并继续查找拼接后的邮件数据中是否存在预设的尾部标识操作“\r\n.\r\n”,如此循环,直至查找到目标邮件数据中存在所述预设的尾部标识退出。本发明实施例通过将缓存区中第一邮件数据解码后,清空所述缓存区,并继续接收第二邮件数据并缓存,实现了缓存区的重复利用,使得在整个邮件附件的还原过程中,仅仅使用预设大小的缓存区进行邮件数据的缓存,而无需一次性缓存整个邮件数据,提高了缓存区的利用率,节约内存。
在示例性的实施例中,如图6所示,所述步骤S312还包括:
步骤S331,当查找到所述邮件拼接数据中存在所述尾部标识时,对所述邮件拼接数据的邮件数据内容进行解码,得到第二目标数据块;
步骤S332,将所述第二目标数据块发送至所述落盘程序,以保存所述第二目标数据块;
步骤S333,将所述第一目标数据块及所述第二目标数据块进行合并,得到还原后的所述目标邮件的附件。
示例性的,若查找拼接后的邮件数据中存在预设的尾部标识“\r\n.\r\n”,则对所述邮件拼接数据的邮件数据内容进行解码,得到第二目标数据块,并将第二目标数据块发送到落盘程序中进行保存,最后将第二目标数据块与之前解码完成的第一目标数据块进行合并,得到还原后的第二邮件附件,并清空所述缓冲区中所述第二数据块及所述第二邮件数据中所述尾部标识之前的邮件数据内容。
步骤S400,若查找到所述第一邮件数据中存在所述尾部标识,则对所述第一邮件数据进行解码,得到还原后的所述目标邮件的附件。
具体地,当查找到所述第一邮件数据中存在所述尾部标识时,表示所述邮件附件已缓存完成,此时通过对所述第一邮件数据进行解码,即可得到还原后的第一邮件附件。示例性的,若查找到所述第一邮件数据中存在所述尾部标识“\r\n.\r\n”,则对所述第一邮件数据进行Base64解码,并将解码后的数据发送至落盘程序进行保存,得到还原后的邮件附件。需要说明的是,本发明可应用于简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)、邮局协议的第3个版本(Post Office Protocol 3,POP3)以及因特网消息访问协议(Internet Message Access Protocol,IMAP)等邮件协议进行邮件附件的还原。
在示例性的实施例中,如图7所示,所述对所述第一邮件数据进行解码,得到还原后的所述目标邮件的附件,包括:
步骤S401,对所述第一邮件数据中所述头部标识及所述尾部标识之间的邮件数据内容进行解码,得到目标邮件附件数据块;
步骤S402,将所述目标邮件附件数据块发送至所述落盘程序,得到所述还原后的所述目标邮件的附件。
示例性的,对所述第一邮件数据中所述头部标识及所述尾部标识之间的邮件数据内容进行解码,得到目标邮件附件数据块,将所述目标邮件附件数据块发送至所述落盘程序,得到所述还原后的所述目标邮件的附件。并在得到还原后的所述目标邮件的附件之后,清空缓存区中的邮件数据,以便重复利用所述缓存区进行邮件数据的缓存,从而提高了缓存利用率,节省内存。
在示例性的实施例中,当所述目标邮件的附件中的数据存在一个所述头部标识时,所述还原后的所述目标邮件包括一个附件,所述一个附件的邮件数据内容为所述头部标识及所述尾部标识之间的邮件数据内容;
当所述目标邮件的附件中的数据存在多个所述头部标识时,所述还原后的所述目标邮件包括多个附件,其中,每相邻两个所述头部标识之间的邮件数据内容对应所述多个附件的其中一个附件的邮件数据内容,且最后一个所述头部标识与所述尾部标识之间的邮件数据内容对应所述多个附件中最后一个附件的邮件数据内容。
示例性的,当所述目标邮件中的邮件数据只存在一个所述头部标识时,还原后的所述目标邮件的附件只有一个,所述头部标识及所述尾部标识之间的邮件数据内容即为所述附件的邮件数据内容。当所述目标邮件中的邮件数据存在两个所述头部标识时,还原后的所述目标邮件的附件有两个,第一个所述头部标识与第二个所述头部标识之间的邮件数据内容为所述目标邮件的第一个附件的邮件数据内容,第二个所述头部标识与所述尾部标识之间的邮件数据内容为所述目标邮件的第二个附件的邮件数据内容。
本发明提供的邮件附件还原方法通过接收预设大小的邮件数据并缓存,并根据预设的头部标识及预设的尾部标识的查找结果对所述邮件数据进行解码,实现对邮件附件的还原。本发明实施例通过查找邮件附件的头部标识和尾部标识确定邮件附件,然后将邮件附件直接还原出来,而不需要缓存整个MIME格式的邮件内容,不仅节省了内存,而且提高了邮件附件的还原效率。
需要说明的是,由于邮件数据中存在多个邮件附件,所述多个邮件附件间均通过所述预设的头部标识进行区分,并在最后一个邮件附件的最后以所述预设的尾部标识进行标记,当查找到所述尾部标识时,则代表所有的邮件附件均已查找到,此时进行邮件数据的解码,解码后即可得到所有的邮件附件。通过本发明实施例,便可还原出任意个数的邮件附件。
参阅图8,示出了本发明实施例提供的邮件附件还原方法的一种可选的流程示意图。用户设置2M的缓存区并接收邮件数据,然后查找所述邮件数据的附件头部。若查找不到所述附件头部,则清空所述缓存。若查找到所述附件头部,则继续查找附件尾部。若查找到所述附件头部,但查找不到所述附件尾部,则将所述邮件数据切割成多个数据块并将小于所述邮件数据长度且为4的倍数的最大值的数据块进行Base64解码,然后,清空所述缓存中已解码的数据块,继续接收邮件数据直至查找到所述附件尾部。若查找到所述附件头部,并查找到所述附件尾部,则直接对所述邮件数据进行Base64解码并将还原好的数据块发送至落盘程序进行保存,完成对所述邮件数据中邮件附件的还原。
实施例二
参阅图9,示出了本发明实施例之一种邮件附件还原系统700的程序模块示意图。所述邮件附件还原系统700可以应用于计算机设备中,所述计算机设备可以是手机、平板个人计算机(tablet personal computer)、膝上型计算机(laptop computer)、等具有数据传输功能的设备。在本发明实施例中,所述邮件附件还原系统700可以包括或被分割成一个或多个程序模块,一个或者多个程序模块被存储于可读存储介质中,并由一个或多个处理器所执行,以完成本发明实施例,并可实现上述邮件附件还原系统700。本发明实施例所称的程序模块是指能够完成特定功能的一系列计算机程序指令段,比程序本身更适合于描述所述邮件附件还原系统700在可读存储介质中的执行过程。在示例性的实施例中,该邮件附件还原系统700包括接收模块701、第一查找模块702、第二查找模块703以及还原模块704。以下描述将具体介绍本发明实施例各程序模块的功能:
接收模块701,用于采用预设大小的缓存区接收目标邮件中的第一邮件数据,所述第一邮件数据包括所述目标邮件的附件中的数据。
具体地,在实际应用中,经常会遇到大邮件或者大邮件附件的情况,此时可以采用预设大小的缓存区接收目标邮件中的第一邮件数据,所述预设大小可以根据需要进行自由设置。
示例性的,假设需要对4M的邮件数据进行邮件附件的还原,所述接收模块701在接收邮件数据之前,用户设置预设大小的缓存区,例如:设置一个大小为2M的缓存区。当开始接收邮件数据时,先接收前2M的邮件数据。
第一查找模块702,用于查找所述第一邮件数据中是否存在预设的头部标识,以根据查找结果确定是否存在邮件附件的头部。
具体地,若查找到所述第一邮件数据中存在所述预设的头部标识,则确定存在所述邮件附件的头部,也即存在所述邮件附件,否则不存在。所述头部标识可以为头部关键字,比如“Content-Disposition:attachment”。
在示例性的实施例中,所述第一查找模块702具体用于:
若查找到所述第一邮件数据中不存在所述头部标识,则清空所述缓存区中的所述第一邮件数据。
示例性的,假设缓存区中的邮件数据查找不到预设的头部标识“Content-Disposition:attachment”,则表示所述缓存区中的邮件数据中不存在邮件附件,此时将所述缓存区中的邮件数据进行清空。需要说明的是,在将所述缓存区中的邮件数据清空后,若还存在剩余的邮件数据,则继续接收下一预设大小的邮件数据。例如:总的邮件数据为4M,将缓存区中的前2M邮件数据清空后,继续接收剩余的2M邮件数据。
第二查找模块703,用于若查找到所述第一邮件数据中存在所述头部标识,查找所述第一邮件数据中是否存在预设的尾部标识。
具体地,若查找到所述第一邮件数据中存在所述头部标识,则表示所述第一邮件数据中存在邮件附件,此时查找所述第一邮件数据中是否存在预设的尾部标识。所述尾部标识可以为附件尾部结束符,比如“\r\n.\r\n”。
在示例性的实施例中,所述第二查找模块703具体用于:
若查找到所述第一邮件数据中存在所述头部标识,且不存在所述尾部标识,确定所述第一邮件数据中第一个头部标识的位置;
根据确定的所述第一个头部标识的位置,将所述第一邮件数据中第一个头部标识之后的邮件数据内容切割为至少一个数据块,所述至少一个数据块包括第一数据块,所述第一数据块的数据长度不大于所述第一头部标识之后的邮件数据内容的数据长度,且为预设数值的倍数的最大值;
对所述第一数据块进行解码,得到第一目标数据块;
将所述第一目标数据块发送至落盘程序,以保存所述第一目标数据块;
清空所述缓存区中的所述第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容。
示例性的,假设接收邮件数据中查找到预设的头部标识“Content-Disposition:attachment”,则查找缓存区中邮件数据是否存在尾部标识“\r\n.\r\n”。如果缓存区中的邮件数据找不到尾部标识“\r\n.\r\n”,将所述第一邮件数据中第一个头部标识之后的邮件数据内容切割至少一个数据块,且所述至少一个数据块包括第一数据块,其中,第一数据块的数据长度可以小于或者等于第一头部标识之后的邮件数据内容的数据长度,且为预设数值的倍数的最大值,例如,Base64解码时,预设数值可以为4。将第一数据块进行Base64解码,得到目标数据块并将目标数据块发送至落盘程序进行保存,最后清空缓存区中的第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容。本发明实施例通过将超过所述预设大小的邮件数据进行切割,并将切割后的邮件数据进行解码进行邮件附件的还原,实现了任意大小的邮件附件的还原。
在一个实施例中,第一数据块的数据长度小于第一头部标识之后的邮件数据内容的数据长度时,至少一个数据块还包括第二数据块,第二数据块为第一邮件数据减去第一数据块及第一个头部标识之前的邮件数据内容后剩余的邮件数据内容。
示例性的,假设缓存区中的数据长度为200,所述第一邮件数据中所述第一个头部标识之前的邮件数据内容的数据长度为103,则所述第一数据块及所述第二数据块的数据长度之和L为97=200-103,所述第一数据块的数据长度L1为小于L且为预设数值的倍数的最大值,所述预设数值可以为4,则96=4*24,且96<97,则L1为96,即所述第一数据块的数据长度为96,所述第二数据块的数据长度为1。
在示例性的实施例中,所述第二查找模块703具体还用于:
采用所述缓存区接收第二邮件数据,所述第二邮件数据包括所述目标邮件的附件中的数据,所述第二邮件数据的长度不大于所述第一数据块的长度与所述第一个头部标识之前的邮件数据内容的长度之和;
示例性的,假设缓存区中的数据长度为200,所述第一邮件数据中所述第一个头部标识之前的邮件数据内容的数据长度为103,则所述第一数据块及所述第二数据块的数据长度之和L为97=200-103,所述第一数据块的数据长度L1为不大于L且为预设数值的倍数的最大值,所述预设数值可以为4,则96=4*24,且96<97,则L1为96,即所述第一数据块的数据长度为96,所述第二数据块数据长度为1。
将所述第二数据块与所述第二邮件数据进行拼接,得到邮件拼接数据,并查找所述邮件拼接数据中是否存在所述尾部标识。
示例性的,采用所述缓存区接收第二邮件数据,例如,缓存区中的最大数据长度为200,第二数据块的数据长度为1,在清空缓存区中第一数据块及所述第一邮件数据中所述第一个头部标识之前的邮件数据内容之后,能继续接收数据长度为199的邮件数据,然后将第二数据块与继续接收的第二邮件数据进行拼接,并继续查找拼接后的邮件数据中是否存在预设的尾部标识操作“\r\n.\r\n”。
在示例性的实施例中,所述第二查找模块703具体还用于:
将所述邮件拼接数据从前至后切割为第三数据块和第四数据块,所述第三数据块的数据长度等于所述第二邮件数据的长度,所述第四数据块为所述邮件拼接数据减去所述第三数据块后剩余的邮件数据内容;
对所述第三数据块进行解码,并将解码后的邮件数据内容发送至所述落盘程序;
清空所述缓存区中的所述第三数据块,并采用所述缓存区接收下一个邮件数据,所述下一个邮件数据的长度不大于所述第三数据块的数据长度,所述下一个邮件数据包括所述目标邮件的附件中的数据;
将所述第四数据块与所述下一个邮件数据进行拼接,得到下一个邮件拼接数据;
查找所述下一个邮件拼接数据中是否存在所述尾部标识;
直到查找到所述尾部标识时,停止执行以上步骤。
示例性的,当所述邮件拼接数据中不存在所述尾部标识时,将所述邮件拼接数据切割成第三数据块和第四数据块,并将第三数据块进行解码,将解码后的数据块发送至落盘程序中并继续接收下一个邮件数据,将第四数据块与下一个邮件数据进行拼接并继续查找拼接后的邮件数据中是否存在预设的尾部标识操作“\r\n.\r\n”,如此循环,直至查找到目标邮件数据中存在所述预设的尾部标识退出。本发明实施例通过将缓存区中第一邮件数据解码后,清空所述缓存区,并继续接收第二邮件数据并缓存,实现了缓存区的重复利用,使得在整个邮件附件的还原过程中,仅仅使用预设大小的缓存区进行邮件数据的缓存,而无需一次性缓存整个邮件数据,提高了缓存区的利用率,节约内存。
在示例性的实施例中,所述第二查找模块703具体还用于:
当查找到所述邮件拼接数据中存在所述尾部标识时,对所述邮件拼接数据的邮件数据内容进行解码,得到第二目标数据块;
将所述第二目标数据块发送至所述落盘程序,以保存所述第二目标数据块;
将所述第一目标数据块及所述第二目标数据块进行合并,得到还原后的所述目标邮件的附件。
示例性的,若查找拼接后的邮件数据中存在预设的尾部标识“\r\n.\r\n”,则对所述邮件拼接数据的邮件数据内容进行解码,得到第二目标数据块,并将第二目标数据块发送到落盘程序中进行保存,最后将第二目标数据块与之前解码完成的第一目标数据块进行合并,得到还原后的第二邮件附件,并清空所述缓冲区中所述第二数据块及所述第二邮件数据中所述尾部标识之前的邮件数据内容。
还原模块704,用于若查找到所述第一邮件数据中存在所述尾部标识,则对所述第一邮件数据进行解码,得到还原后的所述目标邮件的附件。
具体地,当查找到所述第一邮件数据中存在所述尾部标识时,表示所述邮件附件已缓存完成,此时通过对所述第一邮件数据进行解码,即可得到还原后的第一邮件附件。示例性的,若查找到所述第一邮件数据中存在所述尾部标识“\r\n.\r\n”,则对所述第一邮件数据进行Base64解码,并将解码后的数据发送至落盘程序进行保存,得到还原后的邮件附件。需要说明的是,本发明可应用于简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)、邮局协议的第3个版本(Post Office Protocol 3,POP3)以及因特网消息访问协议(Internet Message Access Protocol,IMAP)等邮件协议进行邮件附件的还原。
在示例性的实施例中,所述还原模块704具体用于:
对所述第一邮件数据中所述头部标识及所述尾部标识之间的邮件数据内容进行解码,得到目标邮件附件数据块;
将所述目标邮件附件数据块发送至所述落盘程序,得到所述还原后的所述目标邮件的附件。
示例性的,对所述第一邮件数据中所述头部标识及所述尾部标识之间的邮件数据内容进行解码,得到目标邮件附件数据块,将所述目标邮件附件数据块发送至所述落盘程序,得到所述还原后的所述目标邮件的附件。并在得到还原后的所述目标邮件的附件之后,清空缓存区中的邮件数据,以便重复利用所述缓存区进行邮件数据的缓存,从而提高了缓存利用率,节省内存。
在示例性的实施例中,所述邮件附件还原系统700具体还用于:
当所述目标邮件的附件中的数据存在一个所述头部标识时,所述还原后的所述目标邮件包括一个附件,所述一个附件的邮件数据内容为所述头部标识及所述尾部标识之间的邮件数据内容;
当所述目标邮件的附件中的数据存在多个所述头部标识时,所述还原后的所述目标邮件包括多个附件,其中,每相邻两个所述头部标识之间的邮件数据内容对应所述多个附件的其中一个附件的邮件数据内容,且最后一个所述头部标识与所述尾部标识之间的邮件数据内容对应所述多个附件中最后一个附件的邮件数据内容。
示例性的,当所述目标邮件中的邮件数据只存在一个所述头部标识时,还原后的所述目标邮件的附件只有一个,所述头部标识及所述尾部标识之间的邮件数据内容即为所述附件的邮件数据内容。当所述目标邮件中的邮件数据存在两个所述头部标识时,还原后的所述目标邮件的附件有两个,第一个所述头部标识与第二个所述头部标识之间的邮件数据内容为所述目标邮件的第一个附件的邮件数据内容,第二个所述头部标识与所述尾部标识之间的邮件数据内容为所述目标邮件的第二个附件的邮件数据内容。
本发明提供的邮件附件还原系统700通过接收预设大小的邮件数据并缓存,并根据预设的头部标识及预设的尾部标识的查找结果对所述邮件数据进行解码,实现对邮件附件的还原。本发明实施例通过查找邮件附件的头部标识和尾部标识确定邮件附件,然后将邮件附件直接还原出来,而不需要缓存整个MIME格式的邮件内容,不仅节省了内存,而且提高了邮件附件的还原效率。
需要说明的是,由于邮件数据中存在多个邮件附件,所述多个邮件附件间均通过所述预设的头部标识进行区分,并在最后一个邮件附件的最后以所述预设的尾部标识进行标记,当查找到所述尾部标识时,则代表所有的邮件附件均已查找到,此时进行邮件数据的解码,解码后即可得到所有的邮件附件。通过本发明实施例,便可还原出任意个数的邮件附件。
实施例三
参阅图10,本发明实施例还提供一种计算机设备800的硬件架构示意图。如可以执行程序的智能手机、平板电脑、笔记本电脑、台式计算机、机架式服务器、刀片式服务器、塔式服务器或机柜式服务器(包括独立的服务器,或者多个服务器所组成的服务器集群)等。在本发明实施例中,所述计算机设备800是一种能够按照事先设定或者存储的指令,自动进行数值计算和/或信息处理的设备。如图所示,所述计算机设备800至少包括,但不限于,可通过装置总线相互通信连接存储器801、处理器802、网络接口803。其中:
本发明实施例中,存储器801至少包括一种类型的计算机可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘等。在一些发明实施例中,存储器801可以是计算机设备800的内部存储单元,例如所述计算机设备800的硬盘或内存。在另一些发明实施例中,存储器801也可以是计算机设备800的外部存储设备,例如所述计算机设备800上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(SecureDigital,SD)卡,闪存卡(Flash Card)等。当然,存储器801还可以既包括计算机设备800的内部存储单元也包括其外部存储设备。本发明实施例中,存储器801通常用于存储安装于计算机设备800的操作装置和各类应用软件,例如所述邮件附件还原系统700的程序代码等。此外,存储器801还可以用于暂时地存储已经输出或者将要输出的各类数据。
处理器802在一些发明实施例中可以是中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器、或其他语音处理芯片。所述处理器802通常用于控制计算机设备800的总体操作。本发明实施例中,处理器802用于运行存储器801中存储的程序代码或者处理数据,例如运行所述邮件附件还原系统700的程序代码,以实现上述各个发明实施例中的所述邮件附件还原方法。
所述网络接口803可包括无线网络接口或有线网络接口,所述网络接口803通常用于在所述计算机设备800与其他电子装置之间建立通信连接。例如,所述网络接口803用于通过网络将所述计算机设备800与外部终端相连,在所述计算机设备800与外部终端之间的建立数据传输通道和通信连接等。所述网络可以是企业内部网(Intranet)、互联网(Internet)、全球移动通讯装置(Global System of Mobile communication,GSM)、宽带码分多址(Wideband Code Division Multiple Access,WCDMA)、4G网络、5G网络、蓝牙(Bluetooth)、Wi-Fi等无线或有线网络。
需要指出的是,图10仅示出了具有部件801-803的计算机设备800,但是应理解的是,并不要求实施所有示出的部件,可以替代的实施更多或者更少的部件。
在本发明实施例中,存储于存储器801中的所述邮件附件还原系统700还可以被分割为一个或者多个程序模块,所述一个或者多个程序模块被存储于存储器801中,并由一个或多个处理器(本发明实施例为处理器802)所执行,以完成本发明之邮件附件还原方法。
实施例四
本发明实施例还提供一种计算机可读存储介质,如闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、随机访问存储器(RAM)、静态随机访问存储器(SRAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、可编程只读存储器(PROM)、磁性存储器、磁盘、光盘、服务器、App应用商城等等,其上存储有计算机程序,程序被处理器执行时实现相应功能。本发明实施例的计算机可读存储介质用于存储所述邮件附件还原系统700,以被处理器执行时实现本发明之邮件附件还原方法。
上述本发明实施例序号仅仅为了描述,不代表发明实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述发明实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。
以上仅为本发明的优选发明实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。