Overview
The article is about reading /deleting the mails,
attachments from a remote exchange server, I faced this requirement when my
client told me to automate the reading the undeliverable mails and deleting
them after reading from his inbox without any intervention. And making an
entry into the database about all these mails.
There are many ways of accessing the exchange server like
outlook objects, CDO, MAPI, CODEX And Webdav. But webdav is only one which doesn�t
requires any configurations as such. You have to just give the webaccess to the
mail account from exchange server from which you want to read or delete mails.
References required for the project
Imports System.xml
Imports System.Xml.Xsl
Imports MSXML2
The whole project will be dependent on the MSXML2 and its methods like
.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)
- ConnectingURL:- Is the Path of your Exchange server
- Example:- http://255.255.255.255/exchange/administrator/inbox
- UserName:- Is the name of inbox owner
- Pwd:- Is the password of the inbox owner.
And
to implement this project you need to have sound knowledge of XML,
as the methods return results as XML. So all the manipulations is done on XML
only.
Declaring the variables
Please
ensure that MSXML2 with version of 4.0,you can download it from 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("PROPFIND", ConnectingURL, False, UserName, PWD)
.setRequestHeader("Depth", "1")
.setRequestHeader("Content-type", "xml")
.send()
Debug.Write(.responseBody)
Debug.Write(.responseXML)
str = oXmlHttp.responseText
xmlDOMParams.LoadXml(str)
xmlNdLstDonation = xmlDOMParams.GetElementsByTagName(
"e:textdescription")
xmlNdLstDonation1 = xmlDOMParams.GetElementsByTagName("a:href")
Relevance of the output
e:textdescription:- Gives you the body of Email
a:href:- Gives
you the path of each mail as emails are stored as EML files in exchange server.
For
example a email in your exchange server will be stored as :--
http://255.255.255.255/exchange/administrator/inbox/emailsubject.eml
d:subject:- Gives you the subject all the emails.
e:hasattachment:- Tells you whether the email contains attachment or
not.
To delete the specific email
strurl = Pass the URL of mail which
you want to delete.
http://255.255.255.255/exchange/administrator/inbox/emailsubject.eml
You can extract the names of mail
from a:href tag and pass it to this method to delete more than one mail.
.open("DELETE", strurl, False, UserName, PWD)
.setRequestHeader("Depth", "infinity")
.send()
Get the list of attachments of a mail
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
You can parse this GetAttachmentsListXML1 (XML)
to get the
path of attachment once you get the path of attachment you can pass that path
to. 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
Hope
this code will help you people. Happy coding.