首页> 中国专利> 一种对Outlook客户端数据做备份及还原的方法

一种对Outlook客户端数据做备份及还原的方法

摘要

本发明公开了一种对Outlook客户端数据做备份及还原的方法,包括以下步骤:步骤S1,获取office的安装位数,并生成备份程序;步骤S2,启动备份程序;步骤S3,获取邮箱数据的根目录信息,步骤S4,通过遍历根目录表;步骤S5,创建一个自定义的业务文件夹对象Mfolder;步骤S6,开始遍历步骤S4中得到的邮箱数据;步骤S7,获取业务文件夹对象Mfolder的数据;步骤S8,将邮件信息备份到本地。通过本发明中的方法,能够有效的对邮箱数据进行备份,防止数据丢失,并且通过本申请中的数据还原方法,能够从Outlook客户端正确的导出Outlook账户下的所有数据,并且导出的数据是能够方便用户查看的格式,并且能够将导出的数据还原到Outlook客户端。

著录项

  • 公开/公告号CN115934421A

    专利类型发明专利

  • 公开/公告日2023-04-07

    原文格式PDF

  • 申请/专利权人 成都傲梅科技有限公司;

    申请/专利号CN202211553188.3

  • 发明设计人 张绍;

    申请日2022-12-06

  • 分类号G06F11/14(2006.01);

  • 代理机构成都嘉企源知识产权代理有限公司 51246;

  • 代理人何朝友

  • 地址 610000 四川省成都市锦江区下沙河铺街59号1栋2单元6层601号、602号、605号、606号、607号及608号

  • 入库时间 2023-06-19 19:14:59

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-04-25

    实质审查的生效 IPC(主分类):G06F11/14 专利申请号:2022115531883 申请日:20221206

    实质审查的生效

  • 2023-04-07

    公开

    发明专利申请公布

说明书

技术领域

本发明属于计算机数据安全技术领域,具体为一种对Outlook客户端数据做备份及还原的方法。

背景技术

Outlook作为个人、企业的重要沟通工具,许多重要的数据都存储在Outlook当中,为了避免邮箱账户因为一些外部安全因素,或者来自自身的一些操作不当导致的数据丢失的情况,本发明解决了Outlook邮件客户端的数据安全问题,为客户端提供一种通过导出客户端邮件的方式备份客户端邮件办法。

发明内容

本发明的目的在于提供一种对Outlook客户端数据做备份及还原的方法,以解决背景技术中提出的现有技术中,邮箱账户因为一些外部安全因素,或者自身的一些操作不当导致的数据丢失,存在恢复困难的问题。

为解决上述技术问题,本发明所采用的技术方案是:

一种对Outlook客户端数据做备份的方法,包括以下步骤:

步骤S1,通过查询注册表信息,获取office的安装位数,并生成与office安装位数相同的备份程序,备份程序用于和Outlook源数据进行交互;

步骤S2,启动备份程序,进行MAPI环境初始化,如果初始化成功则通过调用MAPILogonEx函数登录到Outlook系统,获得LPMAPISESSION用于数据通信;如果初始化不成功,则直接结束;

步骤S3,通过步骤S2中登陆时获得的LPMAPISESSION打开msg storage table获取邮箱数据的根目录信息,再通过调用LPMAPISESSION对象的函数GetMsgStoresTable,得到IMAPITable对象;

步骤S4,根据步骤S3中获取的根目录信息,通过调用IMAPITable对象的SetColumns函数设置查询条件,然后再调用QueryRows函数遍历根目录信息来获取所有的邮箱数据;

步骤S5,创建一个业务文件夹对象Mfolder,业务文件夹对象Mfolder用于对Outlook数据进行的业务封装;

步骤S6,开始遍历步骤S4中得到的邮箱数据,通过调用LPMAPISESSION对象的OpenMsgStorage函数打开邮箱对象LPMDB,然后调用邮箱对象LPMDB对象的OpenEntry函数获得邮箱根目录的文件夹对象LPMAPIFLODER,然后把文件夹对象LPMAPIFLODER和邮箱对象LPMDB传递给S5步骤创建的业务文件夹对象Mfolder用于后续进行数据交互操作;

步骤S7,备份程序获取业务文件夹对象Mfolder的数据;

步骤S8,将步骤S7中获取到的邮件信息备份到本地;完成将邮件信息备份到本地。

根据上述技术方案,步骤S2中,MAPI环境初始化具体为:通过调用MAPIInitialize函数,该函数会返回一个返回码,根据返回码是否为S_OK来判断是否初始化成功,如果是则初始化成功,如果不是,则初始化失败。

根据上述技术方案,步骤S4中,遍历根目录信息来获取所有的邮箱数据具体为:

遍历根目录表时,将查询到的邮箱数据通过初始化时MAPI分配的LPMAPISESSION,通过LPMAPISESSION打开查询到的邮箱数据的存储对象,通过查询到的存储对象去获得ENTRY_ID,把ENTRY_ID作为参数去调用LPMAPISESSION对象的OpenMsgStore函数打开ENTRY_ID代表的邮箱存储对象LPMDB,得到所有的邮箱数据。

根据上述技术方案,步骤S7中,备份程序获取业务文件夹对象Mfolder的数据,具体包括:

步骤A1,首先,执行业务文件夹对象Mfolder的初始化操作,通过LPMAPIFOLDER对象的GetHierarchyTable函数打开业务文件夹对象Mfolder的子文件夹对象表,然后通过LPMAPIFOLDER对象的GetContentsTable函数打开业务文件夹对象Mfolder的内容表;

步骤A2,初始化完成后,分别遍历步骤A1中得到的子文件夹对象表和内容表获取邮件信息。

根据上述技术方案,步骤A2中,遍历子文件夹对象表为:

通过S3步骤得到的IMAPITABLE对象的SetColumns函数设置要查询的具体参数,设置PR_ENTRYID参数用来查询EntryID,

通过QueryRows函数进行查询得到EntryID,然后将EntryID作为参数调用LPMDB对象的OpenEntry函数得到子文件夹对象,将得到的子文件夹对象封装成业务文件夹对象Mfolder,完成子文件夹的遍历;

步骤A2中,遍历内容表具体为:

通过调用A1步骤获得的文件夹内容表IMAPITABLE对象的SetColumns函数设置要查询的具体参数,然后调用文件夹内容表IMAPITABLE对象的QueryRows函数查询后得到EntryID,然后将得到EntryID作为参数调用OpenEntry函数得到邮件对象LPMESSAGE。

根据上述技术方案,步骤S7中,子文件夹对象表保存着业务文件夹对象Mfolder的所有子文件夹信息。

根据上述技术方案,步骤S8中,邮件信息备份到本地具体包括以下步骤:

步骤B1,通过CreateILockBytesOnHGlobal函数创建一个ILock Bytes对象;

步骤B2,通过StgCreateDocfileOnILockBytes函数和OpenIMsg OnIStg函数创建以ILockBytes对象为存储底层的LPMESSAGE对象;

步骤B3,调用要读取的邮件对象的COPYTO函数复制给步骤B2创建的LPMESSAGE对象,再调用ILockBytes对象的ReadAt函数得到邮件的字节数据,把读取到的字节数据存入本地磁盘文件里。

根据上述技术方案,步骤B3中,把读取到的字节数据存入以.msg为后缀的本地磁盘文件里,完成将邮件信息备份到本地。

一种对Outlook客户端数据还原的方法,还原包括以下步骤:

步骤C1,创建一个以ILockBytes对象为底层存储机制的LPMESS AGE对象,具体步骤为:通过CreateILockBytesOnHGlobal函数创建一个ILockBytes对象,然后通过StgCreateDocfileOnILockBytes函数创建一个IStorage对象,通过IStorage对象为参数调用OpenIMsg OnIStg函数得到一个LPMESSAGE对象;

步骤C2,通过调用C1步骤得到的ILockBytes对象的WriteAt函数写入本地的邮件字节数据;

步骤C3,写入完毕后找到要恢复的邮件的父文件夹对象,调用父文件夹对象的CreateMessage函数来创建一个新的LPMESSAGE对象,再调用带有本地数据的于步骤C1创建的LPMESSAGE对象的CopyTo函数把数据复制给步骤C3创建的新的LPMESSAG对象;

步骤C4,判断要恢复的邮件是否已经在父文件夹中,完成数据恢复。

根据上述技术方案,判断要恢复的邮件是否已经在父文件夹中的方法具体为:

调用已经写入本地邮件数据的LPMESSAGE对象的HrGetOneProp函数获取PR_SEARCH_KEY参数,此函数会返回一个LPSPropValue对象;

把返回的LPSPropValue对象作为查询参数调用父文件夹对象的FindRow函数,如果得到的返回值为MAPI_E_NOT_FOUND则表示父文件夹中里没有这封邮件,反之,则表示父文件夹中有这份邮件,完成数据还原。

与现有技术相比,本发明具有以下有益效果:

通过本发明中的方法,能够有效的对邮箱数据进行备份,防止数据丢失,并且通过本申请中的数据还原方法,能够从Outlook客户端正确的导出Outlook账户下的所有数据,并且导出的数据是能够方便用户查看的格式,并且能够将导出的数据还原到Outlook客户端。

附图说明

图1为本发明邮箱数据备份流程图;

图2为本发明邮箱数据还原流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

如图1所示,一种对Outlook客户端数据做备份的方法,包括以下步骤:

步骤S1,通过查询注册表信息,获取office的安装位数,并生成与office安装位数相同的备份程序,备份程序用于和Outlook源数据进行交互;

步骤S2,启动备份程序,进行MAPI环境初始化,如果初始化成功则通过调用MAPILogonEx函数登录到Outlook系统,获得LPMAPISESSION用于数据通信;如果初始化不成功,则直接结束;

步骤S3,通过步骤S2中登陆时获得的LPMAPISESSION打开msg storage table获取邮箱数据的根目录信息,再通过调用LPMAPISESSION对象的函数GetMsgStoresTable,得到IMAPITable对象;

步骤S4,根据步骤S3中获取的根目录信息,通过调用IMAPITable对象的SetColumns函数设置查询条件,然后再调用QueryRows函数遍历根目录信息来获取所有的邮箱数据;

步骤S5,创建一个业务文件夹对象Mfolder,业务文件夹对象Mfolder用于对Outlook数据进行的业务封装;

步骤S6,开始遍历步骤S4中得到的邮箱数据,通过调用LPMAPISESSION对象的OpenMsgStorage函数打开邮箱对象LPMDB,然后调用邮箱对象LPMDB对象的OpenEntry函数获得邮箱根目录的文件夹对象LPMAPIFLODER,然后把文件夹对象LPMAPIFLODER和邮箱对象LPMDB传递给S5步骤创建的业务文件夹对象Mfolder用于后续进行数据交互操作;

步骤S7,备份程序获取业务文件夹对象Mfolder的数据;

步骤S8,将步骤S7中获取到的邮件信息备份到本地;完成将邮件信息备份到本地。

通过本发明中的方法,能够有效的对邮箱数据进行备份,防止数据丢失,并且通过本申请中的数据还原方法,能够从Outlook客户端正确的导出Outlook账户下的所有数据,并且导出的数据是能够方便用户查看的格式,并且能够将导出的数据还原到Outlook客户端。

实施例二

本实施例为实施例一的进一步细化。步骤S2中,MAPI环境初始化具体为:通过调用MAPIInitialize函数,该函数会返回一个返回码,根据返回码是否为S_OK来判断是否初始化成功,如果是则初始化成功,如果不是,则初始化失败。

步骤S4中,遍历根目录信息来获取所有的邮箱数据具体为:

遍历根目录表时,将查询到的邮箱数据通过初始化时MAPI分配的LPMAPISESSION,通过LPMAPISESSION打开查询到的邮箱数据的存储对象,通过查询到的存储对象去获得ENTRY_ID,把ENTRY_ID作为参数去调用LPMAPISESSION对象的OpenMsgStore函数打开ENTRY_ID代表的邮箱存储对象LPMDB,得到所有的邮箱数据。

步骤S7中,备份程序获取业务文件夹对象Mfolder的数据,具体包括:

步骤A1,首先,执行业务文件夹对象Mfolder的初始化操作,通过LPMAPIFOLDER对象的GetHierarchyTable函数打开业务文件夹对象Mfolder的子文件夹对象表,然后通过LPMAPIFOLDER对象的GetContentsTable函数打开业务文件夹对象Mfolder的内容表;

步骤A2,初始化完成后,分别遍历步骤A1中得到的子文件夹对象表和内容表获取邮件信息。

步骤A2中,遍历子文件夹对象表为:

通过S3步骤得到的IMAPITABLE对象的SetColumns函数设置要查询的具体参数,设置PR_ENTRYID参数用来查询EntryID,

通过QueryRows函数进行查询得到EntryID,然后将EntryID作为参数调用LPMDB对象的OpenEntry函数得到子文件夹对象,将得到的子文件夹对象封装成业务文件夹对象Mfolder,完成子文件夹的遍历;

步骤A2中,遍历内容表具体为:

通过调用A1步骤获得的文件夹内容表IMAPITABLE对象的SetColumns函数设置要查询的具体参数,然后调用文件夹内容表IMAPITABLE对象的QueryRows函数查询后得到EntryID,然后将得到EntryID作为参数调用OpenEntry函数得到邮件对象LPMESSAGE。

步骤S7中,子文件夹对象表保存着业务文件夹对象Mfolder的所有子文件夹信息。

步骤S8中,邮件信息备份到本地具体包括以下步骤:

步骤B1,通过CreateILockBytesOnHGlobal函数创建一个ILock Bytes对象;

步骤B2,通过StgCreateDocfileOnILockBytes函数和OpenIMsg OnIStg函数创建以ILockBytes对象为存储底层的LPMESSAGE对象;

步骤B3,调用要读取的邮件对象的COPYTO函数复制给步骤B2创建的LPMESSAGE对象,再调用ILockBytes对象的ReadAt函数得到邮件的字节数据,把读取到的字节数据存入本地磁盘文件里。

步骤B3中,把读取到的字节数据存入以.msg为后缀的本地磁盘文件里,完成将邮件信息备份到本地。

实施例三

本实施例为实施例二的进一步细化。如图2所示,还原包括以下步骤:

步骤C1,创建一个以ILockBytes对象为底层存储机制的LPMESS AGE对象,具体步骤为:通过CreateILockBytesOnHGlobal函数创建一个ILockBytes对象,然后通过StgCreateDocfileOnILockBytes函数创建一个IStorage对象,通过IStorage对象为参数调用OpenIMsg OnIStg函数得到一个LPMESSAGE对象;

步骤C2,通过调用C1步骤得到的ILockBytes对象的WriteAt函数写入本地的邮件字节数据,

步骤C3,写入完毕后找到要恢复的邮件的父文件夹对象,调用父文件夹对象的CreateMessage函数来创建一个新的LPMESSAGE对象,再调用带有本地数据的于步骤C1创建的LPMESSAGE对象的CopyTo函数把数据复制给步骤C3创建的新的LPMESSAG对象;

步骤C4,判断要恢复的邮件是否已经在父文件夹中,完成数据恢复。

判断要恢复的邮件是否已经在父文件夹中的方法具体为:

调用已经写入本地邮件数据的LPMESSAGE对象的HrGetOneProp函数获取PR_SEARCH_KEY参数,此函数会返回一个LPSPropValue对象;

把返回的LPSPropValue对象作为查询参数调用父文件夹对象的FindRow函数,如果得到的返回值为MAPI_E_NOT_FOUND则表示父文件夹中里没有这封邮件,反之,则表示父文件夹中有这份邮件,完成数据还原。

实施例四

本发明的发明构思为:

a)如果Office安装版本和客户机系统版本不一致就会出现因为位数不一致无法正常调用Office对外动态库,为了解决版本并不一致问题,首先要做的就是通过查询注册表项信息,获得Office的安装位数,然后生成对应版本的备份程序。

b)备份程序启动后要进行MAPI环境初始化,如果生成的备份程序与Office安装版本不一致就会导致初始化失败,这里主要调用的是MAPIInitialize函数,该函数会返回一个LONG类型的返回码,然后根据函数返回码是否为S_OK来判断是否初始化成功,接着调用MAPILogonEx函数登录到Outlook系统,获得一个LPMAPISESSION用来接下来的数据通信。

c)通过登陆时获得的LPMAPISESSION打开msg storage table获取数据根目录根目录信息,调用LPMAPISESSION对象的函数GetMsgStoresTable,成功后会得到一个LPMAPITABLE实例对象,该对象是一个表结构的数据结构,里面包含了Outlook的所有邮箱信息。

d)获得根目录表后就可以通过遍历这张表来获取所有的邮箱数据,这种数据结构有点类似与数据库表,因此在遍历时调用的也是查询接口,LPMAPITABLE对象的QueryRows函数,也要提前设置查询参数,通过LPMAPITABLE对象的SetColumns函数设置,必要参数是PR_ENTRYID,此参数是Outlook中那些MAPI对象的唯一标识符,必须有此参数才能打开这些对象获得数据,此外,还可以额外添加一些参数用来获取其他需要的数据。通过QueryRows函数可以得到与一个LPSRowSet对象,这个对象是一个unicon类型的数据结构,里面包含了各种MAPI定义的数据类型。

e)开始遍历根目录表,每次查询到数据后就可以通过初始化时MAPI分配给的LPMAPISESSION会话实例对象打开这个邮箱存储对象,通过上一步查询到的LPSRowSet对象去获得ENTRY_ID,然后把这个ENTRY_ID作为参数去调用LPMAPISESSION对象的OpenMsgStore函数打开这个ENTRY_ID代表的邮箱存储对象LPMDB。

f)接下来要创建一个自定义的业务文件夹对象(Mfolder),该对象是对Outlook数据进行的业务封装,把原始数据给二次封装,该对象包含了LPMAPIFOLDER对象,此对象表示在Outlook数据中的源数据文件夹对象,还有两个LPMAPITABLE表示当前文件夹的内容表和子文件夹表,以及一个LPMDB对象,此对象代表该文件夹所在的邮箱。

g)接下来遍历每个邮箱数据,通过OpenEntry函数打开邮箱根目录,获得根目录的文件夹对象LPMAPIFLODER,然后把该对象连同邮箱对象LPMDB一起初始化一个自定义的业务文件夹对象Mfolder。

h)继续遍历业务文件夹对象Mfolder,首先执行业务文件夹对象Mfolder对象的初始化操作,通过LPMAPIFOLDER对象的GetHierarchyTable函数打开业务文件夹对象Mfolder的子文件夹对象表,该表保存着业务文件夹对象Mfolder的所有子文件夹信息,然后通过LPMAPIFOLDER对象的GetContentsTable函数打开业务文件夹对象Mfolder的内容表,也就是邮件信息。

i)当业务文件夹对象Mfolder初始化完成后便可以通过子文件夹表和邮件内容表获取该文件夹里的数据。

遍历子文件夹:

通过LPMAPITABLE对象的SetColumns函数设置要查询的具体参数,这里同样必须要设置PR_ENTRYID参数,同时也可以设置PR_DISPLAY_NAME参数获得文件夹名字方便操作,然后通过QueryRows函数进行查询,得到EntryID后通过LPMDB对象的OpenEntry函数就可以得到子文件夹对象,然后便可以封装成业务文件夹对象。

遍历邮件内容表:

同样通过LPMAPITABLE对象的SetColumns函数设置要查询的具体参数,这里同样必须要设置PR_ENTRYID参数,通过QueryRows函数查询后得到EntryID就可以使用OpenEntry函数得到邮件对象LPMESSAGE。

j)重复上述步骤便可以得到整个Outlook客户端的邮箱文件夹数据,接下来将描述如何恢复文件夹,直接找到要恢复的文件夹的父文件夹对象,然后调用父文件夹对象的CreateFolder函数即可。

k)接下来将详细描述邮件的备份和恢复:

获取邮件数据:

想要获得LPMESSAGE对象的邮件数据需要创建一个以ILockBytes对象为底层存储机制的新的LPMESSAGE对象,首先通过CreateILockBytesOnHGlobal函数创建一个ILockBytes对象,然后通过StgCreateDocfileOnILockBytes函数和OpenIMsgOnIStg函数创建一个以ILockBytes对象为存储底层的LPMESSAGE对象,接着通过调用要读取的邮件对象LPMESSAGE的COPYTO函数复制给新的LPMESSAGE对象,然后调用ILockBytes对象的ReadAt函数便可得到邮件的字节数据,把读取到的字节数据存入以.msg为后缀的本地磁盘文件里即可实现邮件备份到本地的操作。

写入邮件数据:

当需要恢复某封邮件时就需要把数据写入到Outlook客户端的源数据中,首先仍需要和读取邮件数据时一样创建一个以ILockBytes对象为底层存储机制的LPMESSAGE对象,然后通过同样的操作创建这个LPMESSAGE对象,创建完成后通过调用ILockBytes对象的WriteAt函数写入本地的邮件字节数据,写入完毕后找到要恢复这封邮件的父文件夹对象,然后调用该对象的CreateMessage函数来创建一个新的LPMESSAGE对象,然后调用带有本地数据的那个LPMESSAGE对象的CopyTo函数把数据复制给新的LPMESSAG对象即可,但是只是这样的话会造成邮件的重复,因此需要判断要恢复的邮件是否已经在父文件夹中。

判断要恢复的数据是否已经存在与文件夹里:

首先调用已经写入本地邮件数据的LPMESSAGE对象的HrGetOneProp函数获取PR_SEARCH_KEY参数,然后用得到的结果作为参数调用父文件夹对象的FindRow函数,如果得到的返回值为MAPI_E_NOT_FOUND则表示该文件夹里没有这封邮件,那么就可以按照上述步骤执行邮件恢复操作。

专业术语解释:

session:MAPI分配的与Outlook客户端交互的会话对象;

MAPI:Office邮件对外接口;

为了解决以上问题,本发明包含的主要功能模块:

MAPI初始化模块:该模块负责MAPI初始化时需要做的工作,判断Office安装位数,获取MAPI会话对象等;

自定义文件夹模块:该功能模块主要负责对Outlook源数据进行解析,并将起转换为业务模型,同时对一些操作进行二次封装以更加贴近业务;

邮件数据IO模块:该功能模块主要负责读取源邮件数据,然后将其转换成字节数据实现数据备份操作,以及把本地字节数据转换成源邮件数据实现数据恢复操作。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。

最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号