My Space

导航

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[i].InnerText == "收件箱")
        
//        count = int.Parse(SizeNodes[i].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[j].InnerText == "1")continue;//只取未读邮件

            dt.Rows.Add(subjectNodes[j].InnerText, hrefNodes[j].InnerText, DateTime.Parse(datareceiveNodes[j].InnerText));

        }
        ResponseStream.Close();
        Response.Close();


        
return dt;
    }
    
catch
    {
        
return null;
    }
}

 

 该方法来源于网络,近日用到收藏于此。

posted on 2010-11-09 13:43  alronzhang  阅读(737)  评论(1编辑  收藏  举报