1. 程式人生 > >EWS Managed API 介紹

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

我們在例項化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("[email protected]");
//
儲存草稿
//
message.save();
//
只發送不儲存郵件
//
message.Send();
// 傳送並儲存已傳送郵件

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

4.回覆和轉發郵件

 回覆郵件程式碼如下:

程式碼 publicvoid ReplyToMessage(EmailMessage replyToMessage, string replyMsg) { // 回覆所有 // replyToMessage.Reply(replyMsg,true); // 回覆指定的賬號ResponseMessage responseMessage = messageToReplyTo.CreateReply(true); responseMessage.BodyPrefix = replyMsg; // 選擇需要回復的賬號responseMessage.CcRecipients.Add("[email protected]"); 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(“[email protected]”) // 從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>publicvoid 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, outint totalItems) { ItemView itemView =new ItemView(pageSize); itemView.Offset += pageSize * currentPage; FindItemsResults<Item> findResults; try { findResults = MyExchangeService.FindItems(folderType, itemView); } catch (Exception ex) { thrownew Exception("異常"+ ex.Message); } totalItems = findResults.TotalCount; return findResults; }

12.  建立一個條件搜尋

可以指定多個檔案箱和多個關鍵字來建立一個搜尋,檢視如下程式碼:

程式碼 ///<summary>/// 在搜尋資料夾中建立一個自定義的搜尋 ///</summary>///<param name="displayName">顯示的名稱</param>///<param name="searchFolderName">檢索目錄</param>///<param name="filders">檢索條件</param>publicvoid 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 下載地址:
  1. 參考網站

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