使用WebDAV和C#阅读电子邮件的主题和正文

我使用Microsoft的这个示例来阅读使用WebDAV的电子邮件主题。 我也想读一下身体,但我不确定如何处理这个问题。 我相信这段代码需要修改:

strQuery = "" + "SELECT \"DAV:displayname\" FROM \"" + strRootURI + "\"" + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false" + ""; 

如您所见,此代码仅返回对象的显示名称。 如何修改以恢复身体?

对于任何有兴趣的人,我发现了如何引用电子邮件的正文。

首先将查询修改为以下内容:

 strQuery = "" + "SELECT \"DAV:displayname\", \"http://schemas.microsoft.com/mapi/proptag/x1000001e\" FROM \"" + strRootURI + "\"" + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false" + ""; 

然后,使用了一些额外的代码来引用响应中的正文:

 XmlNodeList BodyNodes = null; BodyNodes = ResponseXmlDoc.GetElementsByTagName("d:x1000001e"); 

这是完整的代码:

 // Variables. System.Net.HttpWebRequest Request; System.Net.WebResponse Response; System.Net.CredentialCache MyCredentialCache; string strRootURI = "http://servername/Exchange/email@test.com/Inbox/"; string strUserName = "userName"; string strPassword = "password"; string strDomain = "domain"; string strQuery = ""; byte[] bytes = null; System.IO.Stream RequestStream = null; System.IO.Stream ResponseStream = null; XmlDocument ResponseXmlDoc = null; XmlNodeList DisplayNameNodes = null; XmlNodeList BodyNodes = null; try { //Build the SQL query. strQuery = "" + "SELECT \"DAV:displayname\", \"http://schemas.microsoft.com/mapi/proptag/x1000001e\" FROM \"" + strRootURI + "\"" + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false" + ""; // Create a new CredentialCache object and fill it with the network // credentials required to access the server. MyCredentialCache = new System.Net.CredentialCache(); MyCredentialCache.Add(new System.Uri(strRootURI), "NTLM", new System.Net.NetworkCredential(strUserName, strPassword, strDomain) ); // Create the HttpWebRequest object. Request = (System.Net.HttpWebRequest)HttpWebRequest.Create(strRootURI); // Add the network credentials to the request. Request.Credentials = MyCredentialCache; // Specify the method. Request.Method = "SEARCH"; // Encode the body using UTF-8. bytes = Encoding.UTF8.GetBytes((string)strQuery); // Set the content header length. This must be // done before writing data to the request stream. Request.ContentLength = bytes.Length; // Get a reference to the request stream. RequestStream = Request.GetRequestStream(); // Write the SQL query to the request stream. RequestStream.Write(bytes, 0, bytes.Length); // Close the Stream object to release the connection // for further use. RequestStream.Close(); // Set the content type header. Request.ContentType = "text/xml"; // Send the SEARCH method request and get the // response from the server. Response = (HttpWebResponse)Request.GetResponse(); // Get the XML response stream. ResponseStream = Response.GetResponseStream(); // Create the XmlDocument object from the XML response stream. ResponseXmlDoc = new XmlDocument(); ResponseXmlDoc.Load(ResponseStream); // Build a list of the DAV:href XML nodes, corresponding to the folders // in the mailbox. The DAV: namespace is typically assgigned the a: // prefix in the XML response body. DisplayNameNodes = ResponseXmlDoc.GetElementsByTagName("a:displayname"); BodyNodes = ResponseXmlDoc.GetElementsByTagName("d:x1000001e"); DataTable emails = new DataTable(); emails.Columns.Add("Subject"); emails.Columns.Add("Body"); if (DisplayNameNodes.Count > 0) { Console.WriteLine("Non-folder item display names..."); // Loop through the display name nodes. for (int i = 0; i < DisplayNameNodes.Count; i++) { DataRow row = emails.NewRow(); row[0] = DisplayNameNodes[i].InnerText.ToString().Trim(); row[1] = BodyNodes[i].InnerText.ToString().Trim(); emails.Rows.Add(row); } } else { Console.WriteLine("No non-folder items found..."); } foreach (DataRow row in emails.Rows) { Console.WriteLine("Subject: {0}", row["Subject"]); Console.WriteLine("Body: {0}", row["Body"]); Console.WriteLine("-------------------------------------------------------------------"); } // Clean up. ResponseStream.Close(); Response.Close(); } catch (Exception ex) { // Catch any exceptions. Any error codes from the SEARCH // method request on the server will be caught here, also. Console.WriteLine(ex.Message); } 

我希望这可以帮助别人!