zp7412 发表于 2015-9-10 12:25:35

WebDAV方式访问Exchange 2003收件箱程序

  

public DataTable GetUnReadMail()
{
    string url = "http://ip/exchange/"; //指定Exchange服务器地址
    System.Net.HttpWebRequest Request;
    System.Net.WebResponse Response;
    System.Net.CredentialCache MyCredentialCache;
    string strUserName = "administrator"; //指定登录的用户名
    string strRootURI = url + strUserName.Trim() + "/收件箱/"; //得到要访问邮箱的WebDAV地址
    string strPassword = "test"; //指定该用户的密码
    string strDomain = "test"; //指定域名
    string strQuery = "";
    byte[] bytes = null;
    System.IO.Stream RequestStream = null;
    System.IO.Stream ResponseStream = null;
    XmlDocument ResponseXmlDoc = null;
    XmlNodeList HrefNodes = null;
    XmlNodeList SizeNodes = null;
    int count = 0;
    try
    {
      // 用SQL查询WebDAV返回结果中的unreadcount节点.
      //strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
      // + "<D:sql>SELECT \"DAV:displayname\",\"urn:schemas:httpmail:subject\",\"urn:schemas:httpmail:unreadcount\" FROM \"" + strRootURI + "\""
      // + "</D:sql></D:searchrequest>";
      strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
            + "<D:sql>SELECT \"urn:schemas:httpmail:importance\",\"urn:schemas:httpmail:from\",\"urn:schemas:httpmail:read\",\"urn:schemas:httpmail:datereceived\",\"urn:schemas:httpmail:subject\",\"urn:schemas:httpmail:hasattachment\","
            + "\"urn:schemas:httpmail:date\","
    + "\"DAV:contentclass\",\"DAV:getcontentlength\",\"DAV:displayname\""
            + "FROM \"" + strRootURI + "\""
            + "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false"
            + "</D:sql></D:searchrequest>";

      // 创建新的CredentialCache对象,构建身份凭据
      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);
      // 指定HttpWebRequest的身份凭据,此处为关键所在。如果使用之前
      // 创建的MyCredentialCache,则这个身份凭据是可以从Web服务器传递
      // 到Exchange服务器的,但是这样带来的问题也很明显,就是不能够自
      // 动获取当前登录到域的用户的身份。即便已经成功登录到域,那也只
      // 能通过form再次输入用户名密码。因此,我在这里用的是
      // Request.Credentials = CredentialCache.DefaultCredentials,
      // 这样便可以获得当前用户的凭据,但是这样带来的问题便是上面提到的
      // 身份凭据无法传递的问题,解决方法请关注下篇文章。
      Request.Credentials = MyCredentialCache;
      // 指定WebDAV的SEARCH方法
      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();
      // 创建XmlDocument对象,并获取收件箱的unreadcount节点的值
      ResponseXmlDoc = new XmlDocument();
      ResponseXmlDoc.Load(ResponseStream);
      //HrefNodes = ResponseXmlDoc.GetElementsByTagName("a:displayname");
      //SizeNodes = ResponseXmlDoc.GetElementsByTagName("d:unreadcount");
      //for (int i = 0; i < HrefNodes.Count; i++)
      //{
      //    if (HrefNodes.InnerText == "收件箱")
      //      count = int.Parse(SizeNodes.InnerText);
      //}
      //ResponseStream.Close();
      //Response.Close();
      XmlNodeList idNodes = ResponseXmlDoc.GetElementsByTagName("a:displayname");
      XmlNodeList SenderNodes = ResponseXmlDoc.GetElementsByTagName("d:from");
      XmlNodeList importanceNodes = ResponseXmlDoc.GetElementsByTagName("d:importance");
      XmlNodeList contextclassNodes = ResponseXmlDoc.GetElementsByTagName("a:contentclass");
      XmlNodeList readNodes = ResponseXmlDoc.GetElementsByTagName("d:read");
      XmlNodeList datareceiveNodes = ResponseXmlDoc.GetElementsByTagName("d:datereceived");
      XmlNodeList subjectNodes = ResponseXmlDoc.GetElementsByTagName("d:subject");
      XmlNodeList getcontentlengthNodes = ResponseXmlDoc.GetElementsByTagName("a:getcontentlength");
      XmlNodeList hasattachmentNodes = ResponseXmlDoc.GetElementsByTagName("d:hasattachment");
      XmlNodeList hrefNodes = ResponseXmlDoc.GetElementsByTagName("a:href");
      XmlNodeList dateNodes = ResponseXmlDoc.GetElementsByTagName("d:date");
      DataTable dt = new DataTable();
      dt.Columns.Add("Subject");
      dt.Columns.Add("Href");
      dt.Columns.Add("Time");
      dt.Columns["Time"].DataType = Type.GetType("System.DateTime");
      for (int j = 0; j < readNodes.Count; j++)
      {
            //if (readNodes.InnerText == "1")continue;//只取未读邮件

            dt.Rows.Add(subjectNodes.InnerText, hrefNodes.InnerText, DateTime.Parse(datareceiveNodes.InnerText));
      }
      ResponseStream.Close();
      Response.Close();

      return dt;
    }
    catch
    {
      return null;
    }
}  

  该方法来源于网络,近日用到收藏于此。
页: [1]
查看完整版本: WebDAV方式访问Exchange 2003收件箱程序