Exchange服务器之利用webdav从exchange读取数据
白羽 2018-07-26 来源 :网络 阅读 1388 评论 0

摘要:本文将带你了解Exchange服务器之利用webdav从exchange读取数据,希望本文对大家学Exchange有所帮助

使用WebDAV读取Exchange服务器中的数据
 
在MOSS开发中,我们往往会集成Exchange服务器中的邮件等数据,采用WebPart或其他方式。
Exchange 2007中提供了一套简易的Web Service。Exchange 2003中却没有。
考虑到目前很多企业使用的都是Exchange 2003,下面我给出一套实用WebDAV读取Exchange的通用方法。
为了让更多的人使用,示例代码使用普通的asp.net版本。请需要做MOSS的朋友自己改为Web Part。
界面截图

 
首先,定义访问Exchange的基本信息
Code
 
string
 url 
=
 
"
//10.10.0.1/exchange/
"

//
指定Exchange服务器地址 

        System.Net.HttpWebRequest Request;
        System.Net.WebResponse Response;
        System.Net.CredentialCache MyCredentialCache;
        
string
 strUserName 
=
 
"
L1
"

//
指定登录的用户名

        
string
 strRootURI 
=
 url 
+
 strUserName.Trim() 
+
 
"
/收件箱/
"

//
得到要访问邮箱的WebDAV地址

        
string
 strPassword 
=
 
"
!QAZ1qaz
"

//
指定该用户的密码

        
string
 strDomain 
=
 
"huahua
.com
"

//
指定域名


 
然后,构造查询字符串:
Code
 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/
"
,
"

               
+
 
"
/
"
DAV:contentclass/
"
,/
"
DAV:getcontentlength/
"
,/
"
DAV:displayname/
""

               
+
 
"
FROM /
""
 + strRootURI + 
"
/
""

               
+
 
"
WHERE /
"
DAV:ishidden/
"
 = false AND /
"
DAV:isfolder/
"
 = false
"

               
+
 
"
</D:sql></D:searchrequest>
"
;


 
接下来,构造身份凭证、执行WebDAV的Search
Code

            
//
 创建新的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();
           
            ResponseXmlDoc 
=
 
new
 XmlDocument();
            ResponseXmlDoc.Load(ResponseStream);


 
最后,也就是最激动人心的一步:通过解析Xml节点来取得想要的数据。比如:
 
Code
 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
"
);
            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();


 
其他代码在这里就不一一列举了。 附件是完整的Project。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标系统运维之Exchange频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程