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 ;
    }
}

 

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

转载于:https://www.cnblogs.com/alronzhang/archive/2010/11/09/1872594.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值