90%使用WebDAV开发的Exchange邮件管理(三)
                                                                                            ——获取邮件

        这段时间在做项目的用户培训,闲下来的工夫抱着三本书乱啃一通:《C# Primer Plus》,用来反复巩固OO的概念和基础,《JAVA与模式》,既是对模式的学习,也是对OO的深入。还有就是《.net 框架程序设计》。感觉收获不小,但时间越往后,对这个项目里的一些技术细节和内容遗忘得越快。前几天去蓝凌面试,填完表后就做题,连win1=window.open('herf','name','')这样的JS都写错了,回来才想起来,但当时大脑就是一片混沌。所以决定尽快将这部分的个人知识管理工作做完。这段时间,在.net开发群里也有人问到这些相关的,不过我还没写出来,没能帮到别人,真是惭愧。

一、用Search方法获取邮件列表。
        如上一篇所讲,首先定义要查询的URL:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件string strRootURI = "http://191.0.0.111/exchange/"+userID.Trim()+"/收件箱/";
        然后,生成发送查询请求的XML:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件// Build the SQL query.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                strQuery = "<?xml version=\"1.0\"?><D:searchrequest xmlns:D = \"DAV:\" >"
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                    
+ "<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\","
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                    
+"\"DAV:contentclass\",\"DAV:getcontentlength\",\"DAV:displayname\""
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                    
+ "FROM \""    + strRootURI + "\""
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                    
+ "WHERE \"DAV:ishidden\" = false AND \"DAV:isfolder\" = false"
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                    
+ "</D:sql></D:searchrequest>";
最后,解析查询返回的XML文档,得到各项内容:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件// Get the XML response stream.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                ResponseStream = Response.GetResponseStream();
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Create the XmlDocument object from the XML response stream.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                ResponseXmlDoc = new XmlDocument();
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                ResponseXmlDoc.Load(ResponseStream);
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件            
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Build a list of the DAV:href XML nodes, corresponding to the folders
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// in the mailbox.  The DAV: namespace is typically assgigned the a:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// prefix in the XML response body.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                XmlNodeList idNodes=ResponseXmlDoc.GetElementsByTagName("a:displayname");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList SenderNodes 
= ResponseXmlDoc.GetElementsByTagName("d:from");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList importanceNodes
=ResponseXmlDoc.GetElementsByTagName("d:importance");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList contextclassNodes
=ResponseXmlDoc.GetElementsByTagName("a:contentclass");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList    readNodes
=ResponseXmlDoc.GetElementsByTagName("d:read");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList    datareceiveNodes
=ResponseXmlDoc.GetElementsByTagName("d:datereceived");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList subjectNodes
=ResponseXmlDoc.GetElementsByTagName("d:subject");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList getcontentlengthNodes
=ResponseXmlDoc.GetElementsByTagName("a:getcontentlength");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                XmlNodeList    hasattachmentNodes
=ResponseXmlDoc.GetElementsByTagName("d:hasattachment");    
        然后通过将得到的属性添加到DataTable,绑定到DataGrid上。
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
        这里要注意的是:虽然邮件是以邮件主题来命名,但相同的邮件主题,其displayname是不一致的,而这个我个人认为也应该是其在WWS中唯一的标志符。如图中的前两封邮件,subject都是ffffffff,但displayname分别为fffffffff.EML和fffffffff-1.EML。
        另外就是DataGrid上重要性和是否已读等的图片绑定,这个可能对初学者比较有用。当时因时间仓促,我是这样来做的:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件<asp:Label id=Label1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.importance").ToString()=="1"?"":"<img src=\"images/prio"+DataBinder.Eval(Container, "DataItem.importance")+".gif\">" %>'>
将图片的名字分别与重要性的标识位相对应。默认不显示,如果重要性为2,则显示的图片就是prio2.gif。

二、用PROPFIND方法得到某邮件的具体属性
        在上述的内容中,我们得到了邮件列表的DataGrid,接着就要通过邮件的displayname,来获取邮件的具体属性。基本方式还是如上。这里用来显示邮件内容的地方用到了一点JS的东东,至于实现上,应该是和EXCHANGE一样的。效果如图:90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
首先在页面中放了一个IFrame,IFrame中引用的blank.htm为完全空白文件,下面放了一个隐藏的TextArea,将其设为服务器端组件,html代码如下:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件<IFRAME class="ipFlat" id="idHtmlBody" name="idHtmlBody" src="blank.htm" frameBorder="0"
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                                                    width
="100%" height="100%" security="restricted"></IFRAME><TEXTAREA id="idBody" style="DISPLAY: none" runat="server"></TEXTAREA>
在程序中获取邮件的正文信息:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件XmlNodeList htmldescription=ResponseXmlDoc.GetElementsByTagName("e:htmldescription");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件this.idBody.InnerHtml=htmldescription[0].InnerText;
最后是页面中的JAVASCRIPT:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件        <script language="JavaScript">
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
function window.onload()
>

三、用X-MS-ENUMATTS方法获取附件名称及属性
        X-MS-ENUMATTS据说是微软以前未公布的方法,这次在Exchange2003里面才公布出来的。但我用的时候,还是发现一些小问题。这里的问题是当我用PR_ATTACH_FILENAME_W得到附件的名称时,发现文件名只能显示8个字符,简直晕死,恍惚回到了DOS时代(偶没学过dos,但考计算机三级的时候学到开始是不支持长文件名的)。不过还好可以得到附件的路径。还是在附件路径上作分拆字符串吧。
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件    Response = (HttpWebResponse)Request.GetResponse();
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Get the XML response stream.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                ResponseStream = Response.GetResponseStream();
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Create the XmlDocument object from the XML response stream.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                ResponseXmlDoc = new System.Xml.XmlDocument();
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Load the XML response stream.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                ResponseXmlDoc.Load(ResponseStream);
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Get the root node.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                root = ResponseXmlDoc.DocumentElement;
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Create a new XmlNamespaceManager.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                nsmgr = new System.Xml.XmlNamespaceManager(ResponseXmlDoc.NameTable);
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Add the DAV: namespace, which is typically assigned the a: prefix
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// in the XML response body.  The namespaceses and their associated
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// prefixes are listed in the attributes of the DAV:multistatus node
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// of the XML response.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                nsmgr.AddNamespace("a""DAV:");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Add the http://schemas.microsoft.com/mapi/proptag/ namespace, which
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// is typically assigned the d: prefix in the XML response body.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                nsmgr.AddNamespace("d""http://schemas.microsoft.com/mapi/proptag/");
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Use an XPath query to build a list of the DAV:propstat XML nodes,
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// corresponding to the returned status and properties of
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// the file attachment(s).
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                PropstatNodes = root.SelectNodes("//a:propstat", nsmgr);
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// Use an XPath query to build a list of the DAV:href nodes,
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// corresponding to the URIs of the attachement(s) on the message.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// For each DAV:href node in the XML response, there is an
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                
// associated DAV:propstat node.
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件
                HrefNodes = root.SelectNodes("//a:href", nsmgr);

然而,此时通过HrefNodes[i].InnerText得到的却是形如http://191.0.0.111/exchange/zhouhongying/%E6%94%B6%E4%BB%B6%E7%AE%B1/No%20Subject-7.EML/%E6%A0%B7%E5%93%81.jpg的字符串,也就说中文字符被转换成了UTF8的编码,详细参考见《IIS如何接收ServerXMLHTTP传过来的编码字符》(原作者不详)。那么将分拆的字符串进行码制转换即可。

90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件int index=HrefNodes[i].InnerText.LastIndexOf('/')+1;
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            
string attachmentName=HrefNodes[i].InnerText.Substring(index);                            
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            
int    mLastIndex=attachmentName.LastIndexOf('.');
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            
string mMainName=attachmentName.Substring(0,mLastIndex);
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            mMainName
=Server.UrlDecode(mMainName);
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            
int mExtLength=attachmentName.Length - mLastIndex;
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            
string mExtName= attachmentName.Substring(mLastIndex,mExtLength);                
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            
this.LAttachment.Text+="<a href=\"MailAttachment/"+displayname+"/"+mMainName+"."+mExtName+"\" target=\"_blank\">"+mMainName+"."+mExtName+"("+size+")</a>&nbsp;&nbsp;&nbsp;&nbsp;";
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件                            _attachmentName[i]
=mMainName+"."+mExtName;

附录代码:
90%使用WebDAV开发的Exchange邮件管理(三)——获取邮件private void GetDateToForm(string displayname)
        }

相关文章:

  • 2022-12-23
  • 2022-01-02
  • 2021-07-05
  • 2022-12-23
  • 2021-05-16
  • 2022-01-15
  • 2021-08-21
  • 2021-09-04
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-12
  • 2021-12-23
相关资源
相似解决方案