使用 WEBDAV 访问远程 Exchange 服务器以读取/删除邮件






4.05/5 (16投票s)
使用 WEBDAV 访问远程 Exchange 服务器以读取/删除邮件
概述
本文介绍如何从远程 Exchange 服务器读取/删除邮件和附件。我遇到这个需求是因为我的客户要求我自动化读取未送达邮件并从其收件箱中在没有人工干预的情况下删除它们,并将关于所有这些邮件的信息记录到数据库中。
访问 Exchange 服务器有很多方法,例如 Outlook 对象、CDO、MAPI、CODEX 和 Webdav。但 Webdav 是唯一一种不需要任何配置的方法。你只需要从 Exchange 服务器授予邮件帐户 Web 访问权限,以便读取或删除邮件。
项目所需引用
Imports System.xml
Imports System.Xml.Xsl
Imports MSXML2
整个项目将依赖于 MSXML2及其方法,例如
.open("PROPFIND", ConnectingURL, False, UserName, PWD)
.open("DELETE", strurl, False, UserName, PWD)
.open("GET", strattachmentUrl, False, UserName, PWD)
.open("X-MS-ENUMATTS", strUrl, False, UserName, PWD)
- 连接 URL:- 是你的 Exchange 服务器路径
- 示例:- http://255.255.255.255/exchange/administrator/inbox
- 用户名:- 是收件箱所有者的名称
- 密码:- 是收件箱所有者的密码。
要实现这个项目,你需要对 XML 有深入的了解,因为这些方法将结果作为 XML 返回。因此,所有操作都只在 XML 上进行。
声明变量
请确保安装了 MSXML2 4.0 版本,你可以从 MSDN 下载它。
Dim oXmlHttp As New MSXML2.ServerXMLHTTP40
Dim xmlDOMParams As New System.Xml.XmlDataDocument
Dim xmlDOMParamsAttachement As New MSXML2.DOMDocument40
Dim xmlNdLstDonation, xmlNdLstDonation1,
xmlNdListHasAttach As XmlNodeList
Dim PropstatNodes As System.Xml.XmlNodeList
Dim HrefNodes As System.Xml.XmlNodeList
Dim StatusNode As System.Xml.XmlNode
Dim PropNode As System.Xml.XmlNode
With oXmlHttp
'''Open and read all the mails of inbox'''
'.open("PROPFIND",
.open("PROPFIND", ConnectingURL, False, UserName, PWD)
.setRequestHeader("Depth", "1")
.setRequestHeader("Content-type", "xml")
.send()
Debug.Write(.responseBody)
Debug.Write(.responseXML)
str = oXmlHttp.responseText
''Load the read mails into XML document'''
xmlDOMParams.LoadXml(str)
'''Get the list of text descriptions of all the mails'''
xmlNdLstDonation = xmlDOMParams.GetElementsByTagName(
"e:textdescription")
'''Get the List of Subjects of all the mails'''
'xmlNdLstDonation1 = xmlDOMParams.GetElementsByTagName("d:subject")
xmlNdLstDonation1 = xmlDOMParams.GetElementsByTagName("a:href")
输出的相关性
e:textdescription:- 提供电子邮件正文
a:href:- 提供每个邮件的路径,因为邮件在 Exchange 服务器中存储为 EML 文件。
例如,Exchange 服务器中的一封电子邮件将存储为:--
http://255.255.255.255/exchange/administrator/inbox/emailsubject.eml
d:subject:- 提供所有电子邮件的主题。
e:hasattachment:- 告诉你电子邮件是否包含附件。
要删除特定的电子邮件
strurl = 传递你想要删除的邮件的 URL。
http://255.255.255.255/exchange/administrator/inbox/emailsubject.eml
你可以从 a:href 标签中提取邮件名称,并将其传递给此方法以删除多个邮件。
.open("DELETE", strurl, False, UserName, PWD)
.setRequestHeader("Depth", "infinity")
.send()
获取邮件的附件列表
Public Function GetAttachmentsListXML(ByVal strUrl As String) As String
Const FOLDERITEM = "Inbox"
Dim HttpWebRequest As MSXML2.XMLHTTP40
Dim strPropReq As String
Dim strOutPutFile As String
Dim xmlAttachUrl As New MSXML2.DOMDocument40
Dim xmlNdLstDonation2 As XmlNodeList
Dim xmlNd As XmlNode
Dim GetAttachmentsListXML1 As String
Dim strURL1 As String
HttpWebRequest = New MSXML2.XMLHTTP40
With HttpWebRequest
.open("X-MS-ENUMATTS", strUrl, False, UserName, PWD)
.setRequestHeader("Depth", "1")
.setRequestHeader("Content-type", "xml")
.send()
GetAttachmentsListXML1 = HttpWebRequest.responseText
End With
HttpWebRequest = Nothing
End Function
你可以解析此 GetAttachmentsListXML1 (XML)
以获取附件路径,一旦获得附件路径,就可以将其传递给 open("GET", strattachmentUrl, False, UserName, PWD)
ReadAnAttatchment as string
Dim HttpWebRequest As MSXML2.XMLHTTP40
HttpWebRequest = New MSXML2.XMLHTTP40
HttpWebRequest.open("GET", strattachmentUrl, False, UserName, PWD)
HttpWebRequest.send()
ReadAnAttatchment = HttpWebRequest.responseText
希望这段代码能帮助到大家。祝你编码愉快。