作者:昼夜
关键词:pst文件、outlook
在平时的工作中,我们肯定或多或少的接触过outlook邮箱。outlook邮箱有一个强大的功能,就是可以将某一个邮件文件夹中的邮件全部导出成一个文件进行保存,这一可以备份的特性更好的提升了我们邮件的安全性与共享性。但是由于导出的文件格式是pst,如果我们要再次读取里面的内容的时候只有用outlook指定的软件才能进行打开,那么当里面有许多文件的时候,我们怎么能用影刀做到打开该文件并读取信息的操作呢?我们可以用以下的操作来实现。
在开始之前需要介绍一下,在整体的解决方法中,我们最主要的是使用了一个名为pypff的python包,这个包是C库中libpff在python中的包装器,该库提供了对PST文件的读取和解析功能,使我们能够以编程方式访问和处理PST文件中的数据。不仅可以对邮件内的信息进行提取,也可以处理像outlook自带的那种日历、联系人、任务等模块里面的内容,为我们进行数据分析、迁移、备份等操作提供了。
首先我们需要安装这个包,类似于OpenCV包的安装,这个包名虽然为pypff,但是在安装的时候并不是这样检索的,安装时需要输入libpff-python才能检索到对应的库,具体的安装演示如下。

接下来看一下具体的实现逻辑与代码:
1.建立文件对象并打开
2.获取到根目录进行循环,逐步拆解各个子文件夹,对每个文件夹下面的邮件进行解析。
3.获取到我们的想要的数据并返回。
import pypff
import datetime
def traverse_folder(folder):
res_dict = {}
# 遍历所有子文件夹
for _folder in folder.sub_folders:
for sub in _folder.sub_folders:
_temp_list = []
_sub_name = sub.get_name()
# print("文件夹名称:", _sub_name)
# 获取子项中文件的数量
count = sub.get_number_of_sub_items()
# print("该文件夹中文件的数量:", count)
# 遍历每个文件进行记录
for message in sub.sub_messages:
_res_dict = {}
_res_dict["标题"] = message.get_subject()
_res_dict["正文"] = message.get_plain_text_body().decode('utf-8')
_res_dict["发送人"] = message.get_sender_name()
_res_dict["发送时间"] = message.get_delivery_time().strftime("%Y-%m-%d %H:%M:%S")
if message.get_client_submit_time() is not None:
_res_dict["客户端提交时间"] = message.get_client_submit_time().strftime("%Y-%m-%d %H:%M:%S")
else:
_res_dict["客户端提交时间"] = message.get_client_submit_time()
_temp_list.append(_res_dict)
# print("邮件内容:", res_dict)
# print("")
res_dict[_sub_name] = _temp_list
return res_dict
def read_pst(file_name):
# 创建文件对象并打开
pst_file = pypff.file()
pst_file.open(file_name)
# 获取PST文件的根文件夹
root_folder = pst_file.get_root_folder()
file_content = traverse_folder(root_folder)
# 关闭文件对象
pst_file.close()
return file_content在这里我们已经写好了我们需要获取的一些信息,运行之后我们便可以得到类似于以下类型的数据:


这边可以看到,已经将包含文件的收件箱下面的邮件进行了读取,也可以进一步的对于这些提取出来的邮件信息进行我们其他需要的操作。
由于pypff是C库中的libpff包在python中的版本,虽然我们拿python可以直接调用,但是实际上在安装的时候需要在本地构建C++的编译环境,具体构建的方法可以参考一下如下的文档。