EWS Managed API 介绍

一、什么是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
//  实例化ExchageService
ExchangeService service  =   new  ExchangeService(ExchangeVersion.Exchange2007_SP1;
//  指定用户名,密码,和域名
service.Credentials  =   new  WebCredentials( " username " " password " " domain " );
//  指定Exchage服务的url地址
service.Url  =   new  Url( " your Exchange Service url Address " );
复制代码

我们在实例化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类的继承关系:

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

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

复制代码
代码
//  通过uniqueId来获取已存在的Email消息
EmailMessage message  =  EmailMessage.Bind(service,  new  ItemId(uniqueId));
// 通过uniqueId来获取已存在的Folder信息
Folder folder  =  Folder.Bind(service,  new  FolderId(uniqueId)); 
如果我们不知道这个item的类型,可以用以下的方法获取:
// 通过uniqueId来获取已存在的Item类型消息
Item item  =  Item.Bind(service,  new  ItemId(uniqueId));
if  (item  is  EmailMessage)
{
}
else   if  (item  is  Appointment)
{
}
else
{
//  Handle other types.
}
复制代码

获取folder类型信息和上面的方法同理。

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.SendAndSaveCopy();
复制代码

发送有附件的代码如下:

//  添加附件
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. 创建一个周期性的约会  

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

复制代码
代码
// 实例化一个Appointment
Appointment appointment  =   new  Appointment(service);
// 约会主题
appointment.Subject  =   " Play Basketball " ;
// 约会内容
appointment.Body  =   " Play Basketball " ;
// 约会开始时间2010-6-1 12:30:00
appointment.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. 创建任务

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

代码

删除和获取一个任务和获取一条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://www.cnblogs.com/PPlive/articles/ExchangeWebservice.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值