EWS Managed API 介绍

来源:互联网 发布:淘宝祖国版手办好莱污 编辑:程序博客网 时间:2024/06/05 04:45

一、什么是EWS Managed API

    要介绍什么是EWS Managed API首先要介绍什么是EWS,EWS的全称是Exchange Web Services,是Exchange 2007 之后推出的,它提供了一套访问Exchange资源的全新接口。EWS完成了一下几个目的:

  1. 提供Exchange资源的统一访问;
  2. 内置了与Outlook一致逻辑层;
  3. 给予web Service标准;
  4. 可远程访问。

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

EWS是非常高效的Exchange资源访问接口,如果我们采用引用Web Service服务的方法来生产代理类访问EWS,这个可能是一个不好的方法,因为代理类是协议的直接映射,并且自动生成的代码使用起来非常不方便,实现一个简单的功能就要写一大堆代码,这些自动生产的代理类,难以使用和维护。

为了解决这些使用和维护的问题,微软在2009年10左右推出了Microsoft Exchange Web Services(EWS) Managed API。它是一个完全面向对象的API,就和.Net Framework类库一样,它基于WES XML协议,提供了非常容易学习、使用和维护的EWS.Net开发接口。

二、使用的前准备

  1.      首先要从微软官方网站上去下载EwsManagedApi.msi的一个安装包。下载完成后安装,安装成功后我们从安装目录中Copy我们所需要的Microsoft.Exchange.WebServices.dll和 Microsoft.Exchange.WebServices.xml 两个文件。然后在你的项目中添加引用那个DLL文件。

三、EWS Managed API 功能介绍

  1.  绑定WES

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

 

实例化ExchageService

我们在实例化ExchangeService时一般要指定Exchange的版本,如不指定将会有异常抛出。如果我们知道Exchange Service的地址直接给实例指定URL,如果不知道可以用EWS Managed API的Autodiscover服务,代码如下:

 

// 指定邮箱账号service.AutodiscoverUrl("your e-mail address");

Autodiscover服务是EWS的一个核心部分,只要提供了Email地址,程序就会自动获取与服务器通讯的设置方式。

2.  Item和Folder的介绍

  在EWS Managed API中定义了Item和Folder的一个类的继承关系,每一个类就对应一个Exchange中的给定的类型,例如:EmailMessage 类就代表邮件消息,Appointment类则代表会议和日历中的事件。如下图片显示:

1)         Item类的继承关系:

2)         Folder类的继承关系:

 

 

kevin

 

每一个Item和Folder都一个唯一的标示(uniquely identified.),Item和Folder都有一个Id的属性对应这个唯一的标示,Item的Id类型是ItemId,folder的Id类型是FolderId。

如果知道这个唯一的标示,我们可以用Item和Folder类的静态方法Bind来获取对应的Item和Folder对象,示例代码如下:

 EmailMessage mail = ((EmailMessage)Item.Bind(_service, new ItemId(UniqueId)));

3. 发送邮件 

发送邮件的代码有详细的注释说明,如下:

EmailMessage message= new EmailMessage(service);
// 邮件主题

message.Subject= "Hello kevindiao!";
message.Body
=new
MessageBody();
// 指定发送邮件的格式,可以是Text和Html格式

message.Body.BodyType=BodyType.Text;
// 邮件内容

message.Body.Text= "Sent using the EWS Managed API.";
//
可以添加多个邮件人.也可以添加一个集合,用
// message.ToRecipients.AddRange(IList toEmailAddress_list)

message.ToRecipients.Add("test@klx168.com");
//
保存草稿
//
message.save();
//
只发送不保存邮件
//
message.Send();
// 发送并保存已发送邮件
 

// 添加附件
message.Attachmens.addFileAttachment(“@d:\test.txt”);

4.回复和转发邮件

 回复邮件代码如下:

代码
public void ReplyToMessage(EmailMessage replyToMessage, string replyMsg){// 回复所有// replyToMessage.Reply(replyMsg,true);// 回复指定的账号ResponseMessage responseMessage = messageToReplyTo.CreateReply(true);responseMessage.BodyPrefix = replyMsg;// 选择需要回复的账号responseMessage.CcRecipients.Add("someone@klx168.com");responseMessage.SendAndSaveCopy();}

转发邮件和回复类型只要调用.Forward()或.CreateForward()方法。 

5. 删除一个任何类型的Item

删除一个Item,如邮件,代码如下:

// 软删除一个邮件信息// 软删除指将邮件移动到已删除文件箱中,如果是在已删除文件夹中的item则直接删除,//回收资源。message.Delete(DeleteMode.SoftDelete);

  删除Item和删除Folder类似。

 

6. 创建一个周期性的约会  

创建周期性约会和周期性会议是类似的,这里就举例约会,代码如下:

 

代码
//实例化一个AppointmentAppointment appointment = new Appointment(service);//约会主题appointment.Subject = "Play Basketball";//约会内容appointment.Body = "Play Basketball";//约会开始时间2010-6-1 12:30:00appointment.Start = new DateTime(2010, 5, 29, 12, 30, 0);//约会结束appointment.End = appointment.Start.AddHours(4);//约会的位置appointment.location="体育馆";//添加与会者appointment.RequiredAttendees.Add(“test@klx168.com”)// 从2010-6-1 12:30:00开始每周举行一次appointment.Recurrence = new Recurrence.WeeklyPattern(appointment.Start,1,/*每一周一次*/DayOfWeek.Saturday); //可以设置发送通知的方式,如: //Appointment.Save(SendInvitationsMode.SendOnlyToAll)appointment.Save()

7.创建一个自定义文件夹

 

 

在指定的目录下创建文件夹,代码如下:

Folder folder = new Folder(service);folder.DisplayName = "New Folder";// 在收件箱中创建自定义文件夹.folder.Save(WellKnownFolderName.Inbox);

8. 获取收件箱中的内容

获取收件箱中所有的内容,代码如下:

代码
// 获取收件箱中所有内容// 也可以指定每次获取的条数,如:10条New ItemView(10)FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox,new ItemView(int,MaxValue));foreach (Item item in findResults.Items){// 对item做一些处理.}

获取收件箱中的内容的方式和获取其他文件夹中的内容类似,只要指定

WellKnownFolderName的枚举类型。分页获取需要ItemView.Offset属性的支持。

9.获取一个文件夹下所有子文件夹

代码如下:

FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.Inbox,new FolderView(int.MaxValue));foreach (Folder folder in findResults.Folders){// 对Folder的一些处理.}

代码是获取收件箱中所有的子文件夹,要获取其他文件夹下的子文件夹类似。

 

 

10. 创建任务

创建或更新一个任务,代码如下:

 

代码
/// <summary>/// 创建重复任务/// </summary>/// <param name="subject">任务主题</param>/// <param name="body">任务内容</param> /// <param name="startDate">开始时间</param> /// <param name="endDate">结束时间</param> /// <param name="taskStatus">任务开始状态</param> /// <param name="isReminder">是否开启提醒</param> /// <param name="reminderDueBy">设置提醒时间</param> /// <param name="sensitivity">设置任务类型</param> /// <param name="taskImportance">任务的优先级</param> /// <param name="recurrence">任务重复类型</param> /// <param name="contact_list">设置任务的联系人</param> /// <param name="isUpdate">是添加还是更新一个任务,true表示更新。</param>public void CreateTast(string subject, string body, DateTime startDate, DateTime endDate, TaskStatus taskStatus, bool isReminder, DateTime reminderDueBy, Sensitivity sensitivity, Importance taskImportance,Recurrence recurrence,IList<string>contact_list,bool isUpdate) { Task myTask = new Task(MyExchangeService); myTask.Subject = subject; myTask.Body = body; myTask.StartDate = startDate; myTask.DueDate = endDate; myTask.Status = taskStatus; myTask.IsReminderSet = isReminder; if (isReminder) myTask.ReminderDueBy = reminderDueBy; myTask.Sensitivity = sensitivity; myTask.Importance = taskImportance; myTask.Recurrence = recurrence; myTask.Contacts.AddRange(contact_list); if (isUpdate) { myTask.Update(ConflictResolutionMode.AlwaysOverwrite); } else { myTask.Save(); } }

删除和获取一个任务和获取一条Item类型。获取一个时间段内的任务和获取一个时间段内的约会类型。在任务中也可以添加附件和在邮件中添加附件相同。

11. 分页获取item

代码如下:

代码
/// <summary> /// 分页获取指定文件夹中的内容 /// </summary> /// <param name="folderType">需要获取内容的文件夹</param> /// <param name="pageSize">显示条数</param> /// <param name="currentPage">当前页</param> /// <param name="totalItems">总共多少条</param> /// <returns></returns> public FindItemsResults<Item> GetItemsOfPager(WellKnownFolderName folderType, int pageSize, int currentPage, out int totalItems) { ItemView itemView = new ItemView(pageSize); itemView.Offset += pageSize * currentPage; FindItemsResults<Item> findResults; try { findResults = MyExchangeService.FindItems(folderType, itemView); } catch (Exception ex) { throw new Exception("异常" + ex.Message); } totalItems = findResults.TotalCount; return findResults; }

12.  创建一个条件搜索

可以指定多个文件箱和多个关键字来创建一个搜索,查看如下代码:

 

代码
/// <summary> /// 在搜索文件夹中创建一个自定义的搜索 /// </summary> /// <param name="displayName">显示的名称</param> /// <param name="searchFolderName">检索目录</param> /// <param name="filders">检索条件</param> public void CreateSearchFolder(string displayName,WellKnownFolderName searchFolderName, params SearchFilter[] filders) { SearchFolder searchFoler = new SearchFolder(MyExchangeService); searchFoler.DisplayName = displayName; // 添加查询的文件夹 searchFoler.SearchParameters.RootFolderIds.Add(searchFolderName); //添加查询条件 searchFoler.SearchParameters.SearchFilter = new SearchFilter.SearchFilterCollection( LogicalOperator.Or,filders); //保存文件夹的位置 searchFoler.Save(WellKnownFolderName.SearchFolders); }

可以根据上面的方法指定的条件来创建各种条件的搜索。

13.  其他功能

在ExchangeService中还有下面一些功能,文档中暂时没有详细的描述: 

1)         设置其他邮箱地址,查收其他邮箱的邮件 。

2)         一次请求创建多个类型的Item。

3)         获取可用性服务。

4)         用pull的方式获取提醒。

四。  备注

  1. EWS Managed API 下载地址:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=c3342fb3-fbcc-4127-becf-872c746840e1

  1. 参考网站

Exchange Web Services Managed API 1.0 入门

Exchange Development Forum

Exchange Web Service Namespace

转自:http://diaojia.blog.51cto.com/2299865/410968


原创粉丝点击