翻译:Exchage Web 服务和 Internet 消息头

We had a customer asking how to use the InternetMessageHeaders property in EWS. The found that if they asked for the prop, they only got the names of the headers, but not the values. This is one of those areas (like attachments) where EWS is only going to fetch the minimal amount of data, avoiding potentially expensive operations until you explicitly ask for them. In this case, once you have the names of the headers, you can make another call back to fetch their values. Of course, if you already knew the name of a header you wanted, then you could skip the middle step and ask for it directly.

I've updated my earlier sample to illustrate the technique.

这里是翻译过来的, 原来的文章在我博客里面的这页上,你可以点击原文看看,,呵呵,希望对你有帮助   http://blog.csdn.net/zhangyunbo1116/archive/2007/10/26/1844554.aspx
本来也不会这么早翻译,组长说对我有用,我感觉没有用.但还是仔细看了下.但是发现,还真的没有什么用..权当交流使用,转载请注明出处

我有个客户问我如何在EWS(Exchange Server 2007 支持 WebService 的网站)使用 InternetMessageHeaders 属性. 因为在他们使用的过程中,发现当他们请求这个属性的时候,只能获取InternetMessageHeader 的名字,而却不能得到他的值.  这主要是由 Exchange的EWS自身的WebService实现所决定的,因为 EWS一般只返回最小数量的数据,就像你请求附件一样, 避免潜在的,有可能发生的不必要的操作,,除非你明确的请求, EWS才会返回所有的信息.
在这个列子里面,一旦你有了 InternetMessageHeader 的名字, 你就可以再次创建请求获取他们的值. 当然,如果你已经知道了 InternetMessageHeader 名字的话, 你就可以跳过中间步骤,而直接获取他的值了.

我翻译的也就这样了,应该差不多了.如果你感觉偶翻译的不怎么样,你就直接看原来的文章吧!

using  System;
using  System.Collections.Generic;
using  System.Text;
using  HelloW3.webdev.mail.mail.hnwv;
using  HelloW3.webdev.mail.GlobalShare;

namespace  HelloW3.webdev.mail.PostMail
{
    
/// <summary>
    
/// 功能:演示如何操作获取 InternetMessageHeaders
    
/// 
    
/// 个人测试使用,非本人源码.
    
/// 
    
/// 版权归原作者所有, 仅此声明.....
    
/// 
    
/// 作者:海纳万维信息技术有限责任公司, 开发部
    
/// </summary>

    class TestInternetMessageHeaders
    
{
        
static void Main(string[] args)
        
{
            ExchangeServiceBinding exchangeServer 
= MailToolsFactory.getExchangeSrvBinding();
            
            
//设置待操作的文件夹
            DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];
            folderIDArray[
0= new DistinguishedFolderIdType();
            
//这个表示收件箱
            folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox;

            
//自定义属性,表示显示名,注意这个是限制文件夹请求用的
            PathToUnindexedFieldType ptuftDisplayName = new PathToUnindexedFieldType();
            ptuftDisplayName.FieldURI 
= UnindexedFieldURIType.folderDisplayName;

            
//暂时不知道什么意思,注意这个是限制文件夹请求用的
            PathToExtendedFieldType pteftComment = new PathToExtendedFieldType();
            pteftComment.PropertyTag 
= "0x3004"// PR_COMMENT
            pteftComment.PropertyType = MapiPropertyTypeType.String;

            
//创建文件夹操作请求
            GetFolderType myfoldertype = new GetFolderType();
            myfoldertype.FolderIds 
= folderIDArray;
            myfoldertype.FolderShape 
= new FolderResponseShapeType();
            myfoldertype.FolderShape.BaseShape 
= DefaultShapeNamesType.IdOnly;
            myfoldertype.FolderShape.AdditionalProperties 
= new BasePathToElementType[2];
            myfoldertype.FolderShape.AdditionalProperties[
0= ptuftDisplayName;
            myfoldertype.FolderShape.AdditionalProperties[
1= pteftComment;


            
//开始与 Exchange Server 交互,获取特定的文件夹
            Console.WriteLine("Getting inbox");
            GetFolderResponseType myFolder 
= exchangeServer.GetFolder(myfoldertype);

            
//获取返回的信息
            FolderInfoResponseMessageType firmtInbox =
            (FolderInfoResponseMessageType)myFolder.ResponseMessages.Items[
0];

            
//DisplayName 表示文件夹的友好用户名,在这里输出的是 收件箱, 中文 Exchange Server 2007  下
            Console.WriteLine("got folder: {0}", firmtInbox.Folders[0].DisplayName);

            
if (null != firmtInbox.Folders[0].ExtendedProperty)
            
{
                Console.WriteLine(
"Comment: {0}", firmtInbox.Folders[0].ExtendedProperty[0].Item.ToString());
            }

            
else
            
{
                Console.WriteLine(
"Comment: not found");
            }


            
//属性操作,要对邮件的主题操作
            PathToUnindexedFieldType ptuftSubject = new PathToUnindexedFieldType();
            ptuftSubject.FieldURI 
= UnindexedFieldURIType.itemSubject;

            PathToExtendedFieldType pteftFlagStatus 
= new PathToExtendedFieldType();
            pteftFlagStatus.PropertyTag 
= "0x1090"// PR_FLAG_STATUS
            pteftFlagStatus.PropertyType = MapiPropertyTypeType.Integer;

            
//创建查找请求, 表示要查找某项,这里指查找特定的邮件
            FindItemType findItemRequest = new FindItemType();
            
//设置遍历属性
            findItemRequest.Traversal = ItemQueryTraversalType.Shallow;
            findItemRequest.ItemShape 
= new ItemResponseShapeType();
            findItemRequest.ItemShape.BaseShape 
= DefaultShapeNamesType.IdOnly;
            findItemRequest.ItemShape.AdditionalProperties 
= new BasePathToElementType[2];
            findItemRequest.ItemShape.AdditionalProperties[
0= ptuftSubject;
            findItemRequest.ItemShape.AdditionalProperties[
1= pteftFlagStatus;
            findItemRequest.ParentFolderIds 
= new FolderIdType[] { firmtInbox.Folders[0].FolderId };

            
//获取返回的查找信息
            FindItemResponseType firt = exchangeServer.FindItem(findItemRequest);

            
//注意这里对 FindItemResponse 的操作方式
            foreach (FindItemResponseMessageType firmtMessage in firt.ResponseMessages.Items)
            
{
                
if (null != firmtMessage.RootFolder && firmtMessage.RootFolder.TotalItemsInView > 0)
                
{

                    
//获取的 ResponseItemType 的信息,要使用 ArrayOfRealItemsType 做类型转换,因为这里可以返回你需要的的信息
                    
//比如邮件的各个信息,而如果不转换的,一般你只能使用 几个属性.  
                    
//请注意,这个 FindItem 与 GetItem  的区别, 就是 GetItem 可以返回所有的邮件信息,
                    
//而 FindItem 只能返回邮件的 前 500(似乎是这么大) 个字节的信息,所以说FindItem 和 GetItem 一般是配合操作的.
                    foreach (ItemType it in ((ArrayOfRealItemsType)firmtMessage.RootFolder.Item).Items)
                    
{
                        
//显示当前操作的邮件的主题
                        Console.WriteLine("got item: {0}", it.Subject);

                        
//不是很清楚什么意思
                        if (null != it.ExtendedProperty)
                        
{
                            Console.WriteLine(
"Prop PR_FLAG_STATUS: {0}", it.ExtendedProperty[0].Item.ToString());
                        }

                        
else
                        
{
                            Console.WriteLine(
"Prop PR_FLAG_STATUS: not found");
                        }


                        
//这表示要根据属性查找 Header ,即是邮件头了.
                        PathToUnindexedFieldType ptuftHeaders = new PathToUnindexedFieldType();
                        ptuftHeaders.FieldURI 
= UnindexedFieldURIType.itemInternetMessageHeaders;

                        PathToExtendedFieldType ptuftHeadersProp 
= new PathToExtendedFieldType();
                        ptuftHeadersProp.PropertyTag 
= "0x007D"// PR_TRANSPORT_MESSAGE_HEADERS
                        ptuftHeadersProp.PropertyType = MapiPropertyTypeType.String;

                        
//通过 GetItem 请求获取更详细的信息
                        GetItemType getItemRequest = new GetItemType();
                        getItemRequest.ItemIds 
= new ItemIdType[] { it.ItemId };
                        getItemRequest.ItemShape 
= new ItemResponseShapeType();
                        getItemRequest.ItemShape.BaseShape 
= DefaultShapeNamesType.IdOnly;
                        getItemRequest.ItemShape.AdditionalProperties 
= new BasePathToElementType[2];
                        getItemRequest.ItemShape.AdditionalProperties[
0= ptuftHeaders;
                        getItemRequest.ItemShape.AdditionalProperties[
1= ptuftHeadersProp;

                        
//获取返回的 GetItemType 信息,获取消息头名字
                        GetItemResponseType girt = exchangeServer.GetItem(getItemRequest);
                        
foreach (ItemInfoResponseMessageType grmtMessage in girt.ResponseMessages.Items)
                        
{
                            
//得到当前操作项
                            ItemType item = grmtMessage.Items.Items[0];
                            
if (null != item.ExtendedProperty)
                            
{
                                Console.WriteLine(
"Prop PR_TRANSPORT_MESSAGE_HEADERS:  {0}", item.ExtendedProperty[0].Item.ToString());
                            }

                            
else
                            
{
                                Console.WriteLine(
"Prop PR_TRANSPORT_MESSAGE_HEADERS: not found");
                            }

                            Console.WriteLine();


                            
//准备操作网路信息头
                            if (null != item.InternetMessageHeaders)
                            
{
                                PathToIndexedFieldType[] headerProps 
= new PathToIndexedFieldType[item.InternetMessageHeaders.Length];
                                
int index = 0;
                                
foreach (InternetHeaderType iht in item.InternetMessageHeaders)
                                
{
                                    PathToIndexedFieldType headerProp 
= new PathToIndexedFieldType();
                                    headerProp.FieldURI 
= DictionaryURIType.itemInternetMessageHeader;
                                    headerProp.FieldIndex 
= iht.HeaderName;
                                    headerProps[index
++= headerProp;
                                }



                                
//还要请求一次,这次获取的就是具体的消息头的值了,因为上次请求只能获取消息头的名字哦,你可以运行一下输出看看就可以了
                                GetItemType getItemRequest2 = new GetItemType();
                                getItemRequest2.ItemIds 
= new ItemIdType[] { it.ItemId };
                                getItemRequest2.ItemShape 
= new ItemResponseShapeType();
                                getItemRequest2.ItemShape.BaseShape 
= DefaultShapeNamesType.IdOnly;
                                getItemRequest2.ItemShape.AdditionalProperties 
= headerProps;

                                GetItemResponseType girt2 
= exchangeServer.GetItem(getItemRequest2);
                                
foreach (ItemInfoResponseMessageType grmtMessage2 in girt2.ResponseMessages.Items)
                                
{
                                    ItemType item2 
= grmtMessage2.Items.Items[0];
                                    
if (null != item2.InternetMessageHeaders)
                                    
{
                                        Console.Write(
"Parsing internet headers");
                                        
foreach (InternetHeaderType iht2 in item2.InternetMessageHeaders)
                                        
{
                                            
if (null != iht2.HeaderName)
                                            
{
                                                Console.Write(
"Header {0}", iht2.HeaderName.ToString());
                                                
if (null != iht2.Value)
                                                
{
                                                    Console.WriteLine(
" = {0}", iht2.Value.ToString());
                                                }

                                                
else Console.WriteLine(" is null");
                                            }

                                        }

                                    }

                                }

                            }

                        }

                        Console.WriteLine();
                    }

                }

            }


            Console.WriteLine(
" Hit any key to continue");
            Console.ReadKey(
true);
        }

    }

}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值