Exchange Web Services Managed API 1.0 入门

摘要:
2007年之后,Exchange提供了ExchangeWeb服务,它提供了一个访问Exchange资源的新接口。为了解决这些使用和维护问题,我们引入了Microsoft Exchange Web Services托管API最佳Exchange。NET开发EWSManaged API是一个完全面向对象的API,就像。Net Framework类库。它基于EWSXML协议,提供了一个非常易于学习、使用和维护的ExchangeWeb服务。NET开发接口。初学者和有经验的开发人员都可以发现它比代理类更具优势。EWS协议始终是Exhange的函数。EWS协议中添加的所有功能也将反映在EWSManageAPI中。使用EWSMangedAPI非常简单,它比代理类好得多。

Exchange Web Services Managed API 1.0 大概是在微软在09年10月左右发布的目前国内的资料非常少,国外倒是还有一些比较好的资料。这是一篇入门级的文章,只希望能给大家一个简单的介绍,具体的更详细的大家可以在MSDN里面找。

Exchange在2007之后提供了Exchange Web Service(EWS),它提供了一个访问Exchange资源的全新接口。EWS达到了下面几个目标:

  • 提供了Exchange资源的统一访问。
  • 内置了与outlook一致的逻辑层(换句话说,用outlook能做的操作,用EWS 也能做到)
  • 基于Web Service标准
  • 可远程访问

EWS集合了原来WebDAV和CODEX的功能,它提供的相关功能使实现日程安排等操作非常容易。EWS是基于SOAP协议的XML WebService,这使它能够被可以发送HTTPS请求的任何操作系统远程访问。

Exchange2007 SP1提供了一些Exchange2007最初发布所不包含的功能,比如delegate管理,公共文件夹管理,Exchange2010将会包含更多新的EWS功能,包括文件夹关联项的访问,用户配置对象访问(这些对象让开发者可以通过邮箱保存和检索用户配置),Distribution lists的完全控制,增强时区支持。。

EWS是非常高效的Exchange资源访问接口。如果采用自动生成的代理类来访问EWS,比如在使用在Vistual Studio中新增Web Service引用服务的方法,对于一个复杂应用来说,并不是一个好的方法。可能还是要写一大堆的代码,因为那些代理类只是协议的直接映射。且自动生成的代码使用起来非常不方便(比如Vistual Studio 生成的一些晦涩难懂的属性),这些都让自动生成的代理类难以使用和维护。

为了解决这些使用和维护的问题,我们推出了Microsoft Exchange Web Services (EWS) Managed API

最佳的Exchange .NET开发

EWS Managed API是一个完全的面向对象的API,就像.Net Framework 类库一样。它基于EWS XML 协议,提供了非常容易学习,使用和维护的Exchange Web Service .NET开发接口,无论是初学者,还是有丰富经验的开发者都能发现它相对于代理类的优势。

尽管EWS Managed API是一个全新的API(意味着我们要在应用中添加新的程序集),但必须明白一点:它并没有替代EWS 协议。它仅仅为.Net开发者实现了EWS协议。这表示以前的代码还是可以使用的。无论使用最基本XML(比如Javascript程序员使用的),还是采用代理类与EWS通信,以前的应用都是可以继续使用的。EWS协议一直会是Exhange的一项功能,所有在EWS协议中添加的功能,也会在EWS Manage API所有体现。

使用就是如此简单

EWS Manged API 确实比代理类有极大的改进。下面是检索文件夹属性的代码,将会对两种方法进行对比,先是采用代理类,然后是采用EWS Managed API.

用代理类检索文件夹属性:

  1. GetFolderType request = new GetFolderType();   
  2. request.FolderShape = new FolderResponseShapeType();   
  3. request.FolderShape.BaseShape = DefaultShapeNamesType.AllProperties;   
  4. DistinguishedFolderIdType inboxId = new DistinguishedFolderIdType();   
  5. inboxId.Id = DistinguishedFolderIdNameType.inbox;   
  6. request.FolderIds = new BaseFolderIdType[] { inboxId };   
  7. GetFolderResponseType response = serviceBinding.GetFolder(request);   
  8. FolderInfoResponseMessageType responseMessage   
  9. = response.ResponseMessages.Items[0] as FolderInfoResponseMessageType;   
  10. if (responseMessage.ResponseClass == ResponseClassType.Success)   
  11. {   
  12.    FolderType inbox = responseMessage.Folders[0] as FolderType;   
  13. }  
GetFolderType request = new GetFolderType();
request.FolderShape = new FolderResponseShapeType();
request.FolderShape.BaseShape = DefaultShapeNamesType.AllProperties;
DistinguishedFolderIdType inboxId = new DistinguishedFolderIdType();
inboxId.Id = DistinguishedFolderIdNameType.inbox;
request.FolderIds = new BaseFolderIdType[] { inboxId };
GetFolderResponseType response = serviceBinding.GetFolder(request);
FolderInfoResponseMessageType responseMessage
= response.ResponseMessages.Items[0] as FolderInfoResponseMessageType;
if (responseMessage.ResponseClass == ResponseClassType.Success)
{
   FolderType inbox = responseMessage.Folders[0] as FolderType;
}

用EWS Managed API检索文件夹属性:

  1. Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);  
Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);

(呵呵,确实简化了很多代码。。)

EWS Managed API 功能:

下面将体会到使用该API的简单,让我们来看看它的一些功能:

绑定EWS

在开始使用EWS Managed API之前,我们先要初始化一个ExchangeService类的一个实例。代码如下

  1. using Microsoft.Exchange.WebServices.Data;   
  2. ...   
  3. ExchangeService service = new ExchangeService();   
  4. service.Credentials = new NetworkCredential("name""pwd""domain");   
  5. service.Url = new Uri(https://myserver/EWS/Exchange.asmx);  
using Microsoft.Exchange.WebServices.Data;
...
ExchangeService service = new ExchangeService();
service.Credentials = new NetworkCredential("name", "pwd", "domain");
service.Url = new Uri(https://myserver/EWS/Exchange.asmx);

ExchangeService类有许多有用的方法,比如FindItems, FindAppointments, DeleteItemsAddDelegates, 可以通过vs 的职能感知查看相关函数:

EWS Managed API 智能感知

Exchange Web Services Managed API 1.0 入门第1张

可喜的是:EWS Managed API 也支持Exchange 2007 SP1 ,你可以在ExchangeService的构造函数中指定Exchange的版本。

  1. ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);  
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

可以采用同一个版本的EWS Manged API 指定不同版本的Exchange,它可以同时支持Exchange 2007 SP1和Exchange 2010,当然必须注意如果你指定了Exchange 2007 SP1 版本,与Exchange 2010相关的功能就不能使用了,如果使用了将会抛出异常。

使用 Autodiscover

Autodiscover服务是Exchange2007 和Exchange 2010架构中的一个核心部分。采用Autodiscover,程序可以自动获取到与服务器通信的设置方式,比如Exchange Web Services的URL。

Exchange Web Services Managed API提供了一个内置的Autodiscover客户端API,我们不再需要下载Exchange Server Software Development Kit (SDK),从Autodiscover 示例中拷贝代码。因为现在调用Autodiscover服务就只要一个方法。代码如下:

  1. ExchangeService service = new ExchangeService();   
  2. service.Credentials = new NetworkCredential("name""pwd""domain");   
  3. service.AutodiscoverUrl(someone@contoso.com);  
ExchangeService service = new ExchangeService();
service.Credentials = new NetworkCredential("name", "pwd", "domain");
service.AutodiscoverUrl(someone@contoso.com);

Exchange 2010 将会提供一个新的基于SOAP的Autodiscover服务,下面代码是采用EWS Managed API的方式

  1. using Microsoft.Exchange.WebServices.Autodiscover;   
  2. ...   
  3. AutodiscoverService autodiscover = new AutodiscoverService("contoso.com");   
  4. autodiscover.Credentials = new NetworkCredential("name""pwd""domain");   
  5. GetUserSettingsResponse response = autodiscover.GetUserSettings(   
  6. "someone@contoso.com",   
  7. UserSettingName.ExternalEwsUrl,   
  8. UserSettingName.InternalEwsUrl);  
using Microsoft.Exchange.WebServices.Autodiscover;
...
AutodiscoverService autodiscover = new AutodiscoverService("contoso.com");
autodiscover.Credentials = new NetworkCredential("name", "pwd", "domain");
GetUserSettingsResponse response = autodiscover.GetUserSettings(
"someone@contoso.com",
UserSettingName.ExternalEwsUrl,
UserSettingName.InternalEwsUrl);

处理 项目和文件夹

EWS Managed API提供了项目和文件夹的所有操作功能,包括以面向对象的方式创建,更新,删除。下面的代码展示了这些功能。

在收件箱中创建文件夹

  1. Folder folder = new Folder(service);   
  2. folder.DisplayName = "My new folder";   
  3. folder.Save(WellKnownFolderName.Inbox);  
Folder folder = new Folder(service);
folder.DisplayName = "My new folder";
folder.Save(WellKnownFolderName.Inbox);

创建和保存草稿

  1. EmailMessage message = new EmailMessage(service);   
  2. message.Subject = "Hello from the EWS Managed API";   
  3. message.Body = "Now that's easy!";   
  4. message.ToRecipients.Add("someone@fabrikam.com");   
  5. message.Save();  
EmailMessage message = new EmailMessage(service);
message.Subject = "Hello from the EWS Managed API";
message.Body = "Now that's easy!";
message.ToRecipients.Add("someone@fabrikam.com");
message.Save();

发送邮件且保存副本

message.SendAndSaveCopy();

注意:保存副本不是必须的!

绑定且更新联系人

  1. Contact contact = Contact.Bind(service, new ItemId("abcdef"));   
  2. contact.CompanyName = "Fabrikam";   
  3. contact.Update(ConflictResolutionMode.AutoResolve);  
Contact contact = Contact.Bind(service, new ItemId("abcdef"));
contact.CompanyName = "Fabrikam";
contact.Update(ConflictResolutionMode.AutoResolve);

删除联系人

  1. contact.Delete(DeleteMode.HardDelete);  
contact.Delete(DeleteMode.HardDelete);

创建周期性的会议

  1. Appointment appointment = new Appointment(service);   
  2. appointment.Subject = "Play tennis";   
  3. appointment.Body = "Let's play tennis for an hour every Saturday at 10AM";   
  4. appointment.Start = new DateTime(2008, 12, 20, 10, 00, 00);   
  5. appointment.End = appointment.Start.AddHours(1);   
  6. appointment.RequiredAttendees.Add("someone@fabrikam.com");   
  7. appointment.Recurrence = new Recurrence.WeeklyPattern(   
  8. appointment.Start.Date,   
  9. /* Every week */,   
  10. DayOfWeek.Saturday);   
  11. appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);  
Appointment appointment = new Appointment(service);
appointment.Subject = "Play tennis";
appointment.Body = "Let's play tennis for an hour every Saturday at 10AM";
appointment.Start = new DateTime(2008, 12, 20, 10, 00, 00);
appointment.End = appointment.Start.AddHours(1);
appointment.RequiredAttendees.Add("someone@fabrikam.com");
appointment.Recurrence = new Recurrence.WeeklyPattern(
appointment.Start.Date,
1 /* Every week */,
DayOfWeek.Saturday);
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);

上面的例子可以看出,每一个项目类型都有专门的类与其对应。这个概念和文件夹类似–每一个文件夹类型都有一个类与其对应。下面的图片展示了项目类和文件夹类的继承关系:

项目类继承关系:

Exchange Web Services Managed API 1.0 入门第2张

文件夹类继承关系

Exchange Web Services Managed API 1.0 入门第3张

使用Response对象

借助Exchange Web Services,Response对象能对项目进行一系列的操作,比如回复消息,接受会议请求。EWS Managed API封装了这些概念,给出了一种非常简单的使用方式。让我们看看下面的代码:

回复消息

  1. EmailMessage message = EmailMessage.Bind(service, new ItemId("abcd"));   
  2. message.Reply("This is my reply!"true /* replyAll */);  
EmailMessage message = EmailMessage.Bind(service, new ItemId("abcd"));
message.Reply("This is my reply!", true /* replyAll */);

发送且保存自定义的回复

  1. ResponseMessage response = message.CreateReply(true /* replyAll */);   
  2. response.BodyPrefix = "This is my customized reply!"; response.CcRecipients.Add("someone@fabrikam.com");   
  3. response.SendAndSaveCopy();  
ResponseMessage response = message.CreateReply(true /* replyAll */);
response.BodyPrefix = "This is my customized reply!"; response.CcRecipients.Add("someone@fabrikam.com");
response.SendAndSaveCopy();

接受会议请求

  1. Appointment appointment = Appointment.Bind(service, new ItemId("abcd"));   
  2. appointment.CancelMeeting();  
Appointment appointment = Appointment.Bind(service, new ItemId("abcd"));
appointment.CancelMeeting();

取消会议请求

  1. Appointment appointment = Appointment.Bind(service, new ItemId("abcd"));   
  2. appointment.CancelMeeting();  
Appointment appointment = Appointment.Bind(service, new ItemId("abcd"));
appointment.CancelMeeting();

搜索

EWS Managed API提供了非常完善的搜索功能,代码如下:

显示收件箱的所有子文件夹

  1. FindFoldersResults findResults = service.FindFolders(   
  2. WellKnownFolderName.Inbox,   
  3. new FolderView(int.MaxValue));  
FindFoldersResults findResults = service.FindFolders(
WellKnownFolderName.Inbox,
new FolderView(int.MaxValue));

收件箱中查找前10个重要且包含“API”项目

  1. ItemView view = new ItemView(10);   
  2. // Return only ten items.   
  3. view.SearchFilter = new SearchFilter.SearchFilterCollection(   
  4. LogicalOperator.And,   
  5. new SearchFilter.IsEqualTo(ItemSchema.Importance, Importance.High),   
  6. new SearchFilter.ContainsSubstring(ItemSchema.Subject, "API"));   
  7. FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, view);  
ItemView view = new ItemView(10);
// Return only ten items.
view.SearchFilter = new SearchFilter.SearchFilterCollection(
LogicalOperator.And,
new SearchFilter.IsEqualTo(ItemSchema.Importance, Importance.High),
new SearchFilter.ContainsSubstring(ItemSchema.Subject, "API"));
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, view);

查找文件夹对象

  1. Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);   
  2. inbox.FindItems(view);  
Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
inbox.FindItems(view);

创建一个新的搜索文件夹

  1. SearchFolder searchFolder = new SearchFolder(service);   
  2. searchFolder.DisplayName = "My search folder";   
  3. searchFolder.SearchParameters.RootFolderIds.Add(WellKnownFolderName.Inbox);   
  4. searchFolder.SearchParameters.SearchFilter = new SearchFilter.SearchFilterCollection(   
  5. LogicalOperator.And,   
  6. new SearchFilter.IsEqualTo(ItemSchema.Importance, Importance.High),   
  7. new SearchFilter.ContainsSubstring(ItemSchema.Subject, "API"));   
  8. searchFolder.Save(WellKnownFolderName.SearchFolders);  
SearchFolder searchFolder = new SearchFolder(service);
searchFolder.DisplayName = "My search folder";
searchFolder.SearchParameters.RootFolderIds.Add(WellKnownFolderName.Inbox);
searchFolder.SearchParameters.SearchFilter = new SearchFilter.SearchFilterCollection(
LogicalOperator.And,
new SearchFilter.IsEqualTo(ItemSchema.Importance, Importance.High),
new SearchFilter.ContainsSubstring(ItemSchema.Subject, "API"));
searchFolder.Save(WellKnownFolderName.SearchFolders);

更多内容

本文件仅仅介绍了EWS Managed API的一小部分功能,需要更多内容,可以到Microsoft Exchange Team BlogMicrosoft TechNet Forums: Development 查找。

最后再给大家提供点有用的东西:

EWS Managed API 函数参考:Exchange Web Services Managed API Reference.

EWS Managed API 1.0 程序集: 下载地址(如果地址失效,在Microsoft Download Center搜索”EWS API”就能找到新的下载地址了)

免责声明:文章转载自《Exchange Web Services Managed API 1.0 入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇团体程序设计天梯赛-练习集L1-002. 打印沙漏jquery幻灯片插件之owl.carousel.js下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue 本地和线上跨域的问题 个人解决方案

产生跨域问题的原因   跨域是因为浏览器的同源策略所导致的。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。浏览器引入同源策略主要是为了防止XSS,CSRF攻击。 常见跨域问题的解决方式 使用jsonp 服务端代理 服务端设置Request Header头中Access-Control-Allow-Origin为...

ODOO 新API修饰符

Odoo8中,API接口分为traditaional style和record style两种类型: traditional style指的就是我们在7.0中使用的类型,def(self,cr,uid,ids,context)式的语法. record style 8.0及以后版本精简化参数后的风格,只保留了self和args,形如def(self,args...

Vue全家桶系列【vue3更新中.....】

一. 简介  1. 说明   Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。 V...

OpenStack 中的neutron-server启动过程

neutron-server是neutron的核心组件之中的一个。负责直接接收外部请求,然后调用后端对应plugin进行处理。 其核心启动过程代码主要在neutron.server包中。 __init__.py文件里包含一个main()函数,是WSGIserver開始的模块,而且通过调用serve_wsgi来创建一个NeutronApiService的...

记一个多线程使用libevent的问题

前段时间使用libevent网络库实现了一个游戏服务器引擎,在此记录下其中遇到的一个问题。 我在设计服务器上选择把逻辑和网络分线程,线程之间通信使用队列。但是这样做会有个问题: 当逻辑线程想要主动的发一个数据包的时候,网络线程此时可能还阻塞在等待网络IO的系统调用上(比如说epoll)。如果不做特殊处理的话,此时消息包就会一直积压在缓冲区中,直到下一次网络...

C#使用FFmpeg的总结

上篇文章提到FFmpeg解决项目中视频和语音问题,说道C#和FFmpeg不得不提的2个类库。 1、Xabe.FFmpeg 简单查看了下源码和demo,发现基于ffmpeg.exe的命令行参数进行处理。 2、FFmpeg.AutoGen 把C语言对外API和类型翻译成C#的API和对象。 看了一下这个源码生成,其中使用了CppSharp来生成g.cs的文件,...