Exchange Web Service(EWS)开发指南3——SOAP XML Parser
2021-04-21 11:35:00 Author: www.4hou.com(查看原文) 阅读量:162 收藏

导语:本文介绍了一种SOAP XML解析器的实现方法,编写工具实现自动从Exchange SOAP XML message中提取邮件信息,开源Python实现代码,分析代码开发细节。

0x00 前言

在之前的文章《Exchange Web Service(EWS)开发指南2——SOAP XML message》介绍了SOAP XML message的使用,通过Python实现了利用hash对Exchange资源的访问。

当我们通过SOAP XML message读取邮件时,尝尝会遇到以下麻烦:由于每一封邮件对应一份原始的XML文件,原始的XML文件包含完整的邮件信息,人工分析邮件将耗费大量精力。

于是,本文将要介绍一种SOAP XML解析器的实现方法,编写工具实现自动提取有价值的邮件信息,提高阅读效率。

0x01 简介

本文将要介绍以下内容:

· 适用环境

· 设计思路

· 开源Python实现代码

· 代码开发细节

0x02 设计思路

通过SOAP XML message读取收件箱中的所有邮件,需要以下步骤:

1.使用ewsManage.py的listmailofinbox命令获得每一封邮件的ItemId和ChangeKey

2.循环使用ewsManage.py的getmail命令,传入每封邮件对应的ItemId和ChangeKey

3.分别将返回结果保存为XML格式的文件,每一个XML文件对应一封邮件

为了保证SOAP XML解析器的通用性,能够配合不同的工具,所以将SOAP XML解析器设计成了文件管理器的结构,选中XML文件将会自动解析,提取有价值的信息并显示,在设计上遵循以下原则:

· 开发语言选用Python,为了提高便捷性,全部使用Python的标准库

· 文件管理器涉及到Python的界面开发,使用标准GUI库Tkinter

· SOAP(Simple Object Access Protocol)协议在本质上仍为XML协议,在解析上使用标准库xml.dom.minidom

注:如果使用字符串匹配的方式对XML文件解析,还需要考虑转义字符。

0x03 程序实现

1.文件管理器的实现

Tkinter的使用:

https://docs.python.org/3/library/tk.html

这里可以基于开源的file-manager-mask进行二次开发,修改如下部分:

· 去掉图片显示功能

· 去掉编辑文本的功能

· 添加XML文件解析的功能

2.XML文件解析

xml.dom.minidom的使用:

https://docs.python.org/3/library/xml.dom.minidom.html

这里需要提取以下内容:

· 邮件标题

· 发件人

· 收件人

· 抄送

· 接收时间

· 附件名称

· 正文内容

在数据提取上有以下不同的情况:

注:XML标签对大小写敏感。

(1)提取节点属性

响应消息的格式示例:

image.png

提取节点"m:GetItemResponseMessage"的属性"ResponseClass",代码如下:

from xml.dom import minidom
dom = minidom.parse("TestMail.xml")
data_response = dom.getElementsByTagName("m:GetItemResponseMessage")
print(data_response[0].getAttribute("ResponseClass"))

(2)直接提取标签对之间的数据

邮件标题的格式示例:

image.png

正文内容的格式示例:

image.png

接收时间的格式示例:

image.png

提取节点"t:Subject"的内容,代码如下:

image.png

发件人的格式示例:

image.png

这里需要考虑父节点和子节点。

注:发件人通常只有一个,所以不需要考虑循环提取。

提取父节点"t:Sender"的子节点"t:Name"内容,代码如下:

image.png

(3)循环提取标签对之间的数据

收件人的格式示例:

image.png

抄送人的格式示例:

image.png

附件的格式示例:

image.png

这里需要考虑父节点和兄弟节点

提取父节点"t:ToRecipients"的所有子节点"t:Name"的内容,代码如下:

image.png

以上代码跳过了对节点"t:Mailbox"的判断,如果加上判断,代码如下:

image.png

当完成了对XML文件的数据提取后,需要考虑如何将数据显示到文件管理器的窗口上。

这里要用到insert函数。

参数说明:

https://docs.python.org/3.8/library/tkinter.ttk.html?highlight=insert#tkinter.ttk.Notebook.insert

image.png

对于参数pos,END代表从最后一行插入,数字代表从指定行插入(例如第一行为1.0)

完整的代码已上传至Github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_EWS_XML_Parser.py

代码支持以下功能:

· 文件管理器,便于查看多个文件,可以通过键盘方向键实现文件切换

· XML文件解析,能够从Exchange SOAP XML message中自动提取出有价值的信息,标记不符合格式的XML文件

运行界面如下图:

image.png

后续可以结合ewsManage.py开发完整的Exchange界面化客户端程序,实现利用hash读取Exchange邮件。

0x04 小结

本文介绍了一种SOAP XML解析器的实现方法,编写工具实现自动从Exchange SOAP XML message中提取邮件信息,开源Python实现代码,分析代码开发细节。

本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/q6X7
如有侵权请联系:admin#unsafe.sh