EWS Managed API 介紹
一、什麼是EWS Managed API
要介紹什麼是EWS Managed API首先要介紹什麼是EWS,EWS的全稱是Exchange Web Services,是Exchange 2007 之後推出的,它提供了一套訪問Exchange資源的全新介面。EWS完成了一下幾個目的:
- 提供Exchange資源的統一訪問;
- 內建了與Outlook一致邏輯層;
- 給予web Service標準;
- 可遠端訪問。
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開發介面。
二、使用的前準備
- 首先要從微軟官方網站上去下載EwsManagedApi.msi的一個安裝包。下載完成後安裝,安裝成功後我們從安裝目錄中Copy我們所需要的Microsoft.Exchange.WebServices.dll和 Microsoft.Exchange.WebServices.xml 兩個檔案。然後在你的專案中新增引用那個DLL檔案。
三、EWS Managed API 功能介紹
- 繫結WES
在開始使用EWS Managed API之前,首先要初始化一個ExchangeService類的一個例項,程式碼如下:
例項化ExchageService我們在例項化ExchangeService時一般要指定Exchange的版本,如不指定將會有異常丟擲。如果我們知道Exchange Service的地址直接給例項指定URL,如果不知道可以用EWS Managed API的Autodiscover服務,程式碼如下:
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物件,示例程式碼如下:
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的方式獲取提醒。
四。 備註
- EWS Managed API 下載地址:
- 參考網站
轉自:http://diaojia.blog.51cto.com/2299865/410968