




已閱讀5頁,還剩9頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄1.什么是EWS12.Items & Folders22.1.Item22.2.Item 的常用操作22.2.1.綁定到一個Item22.2.2.發送一封郵件22.2.3.創建一個循環的 Appointment32.2.4.刪除一個 Item32.2.5.更新 Item32.3.Folder42.4.Folder 的常用操作42.4.1.綁定一個Folder42.4.2.創建一個Folder43.EWS Managed API 的使用43.1.創建 ExchangeService 的實例43.2.設置 Service 的 URL54.操作Exchange Item & Folder64.1.獲取收件箱中的Item64.2.查尋文件夾74.3.設定查尋條件94.4.設置返回字段,排序字段104.5.查尋用戶的狀態105.通知-Notification115.1.Pull Notification115.2.Push Notification121. 什么是EWSEWS 的全稱是 Microsoft Exchange Web service, 它是 Exchange 2007 以后推出的一個 web service, 它提供了訪問 Exchange 資源的全新接口。使用它可以避免使用 .NET 基礎類來使用SMTP 協議發送郵件和使用POP3 協議收郵件帶來的大量代碼工作。EWS 是基于SOAP (Simple Object Access Protocol) 協議的, 它的推出達到了以下幾種目的: 提供EWS 資源的統一訪問 提供與Outlook 一致的邏輯 Web Service 標準支持 遠程訪問現在這個Service 的地址以 .asmx 結尾,是傳統的web service, 期待后續的Exchange 推出 WCF 版本的 Service, 這樣我們也許可以使用很多的Exchange 定義的類來處理 Mail, Folder, Rule 等諸多 Exchange 對象來方便的進行郵件處理的相關操作??磥砦④汦xchange 團隊也覺察到了與Web Service 直接交互的晦澀和不便(awkward), 他們在后續推出類 Microsoft Exchange Web Service(EWS) Managed API。其中包括了我們理想中的類型封裝。你可以在/zh-cn/download/details.aspx?id=35371 下載EwsManagedApi.msi 安裝包, 下載完成后雙擊安裝。- 這里筆者強烈推薦使用英文版的下載地址/en-us/download/details.aspx?id=35371, 并且閱讀英文版的文檔,具體原因你懂的( You know exactly!).安裝完成后,打開安裝目錄,可以看到下面有一個 GettingStarted.doc, 打開以后有關于EwsManagedAPI 的大致介紹。在需有使用這個API 的項目添加Microsoft.Exchange.WebServices.dll 引用, 然后使用Microsoft.Exchange.WebServices.Data 命名空間。 從這里/zh-cn/library/dd633710(v=EXCHG.80).aspx 查看API的使用說明。2. Items & Folders. ItemEWS Managed API 定義和繼承自Item的類來映射 Exchange 中的對象。例如MailMessage 類映射 Exhange 中的 e-mail, Appointment 映射 Exchange 中的約會。Item 的屬性 Id 類型為 ItemId 唯一標識 Item.2.2. Item 的常用操作..1. 綁定到一個ItemItem 類的 Bind 方法,可以根據唯一標識符綁定到一個 Item, 它的外號是=GetItemById 方法。/ Bind to an existing message using its unique identifier.EmailMessage message = EmailMessage.Bind(service, new ItemId(uniqueId);2.2.2. 發送一封郵件我相信很多人一定經歷過使用 SMTP 發送郵件的痛苦,那么來體會一下EWS 帶給你的暢快體驗吧。EmailMessage message = new EmailMessage(service);message.Subject = Hello EWS!;message.Body = Sent using the EWS Managed API.;message.ToRecipients.Add();message.SendAndSaveCopy();你也可以回復和轉發郵件:messageToReplyTo.Reply(reply, true /* replyAll */);/ OrResponseMessage responseMessage = messageToReplyTo.CreateReply(true);responseMessage.BodyPrefix = reply;responseMessage.CcRecipients.Add();responseMessage.SendAndSaveCopy();2.2.3. 創建一個循環的 AppointmentAppointment appointment = new Appointment(service);appointment.Subject = Meditation;appointment.Body = My weekly relaxation time.;appointment.Start = new DateTime(2008, 1, 1, 18, 0, 0);appointment.End = appointment.Start.AddHours(2);/ Occurs every weeks on Tuesday and Thursdayappointment.Recurrence = new Recurrence.WeeklyPattern(new DateTime(2008, 1, 1),2,DayOfWeek.Tuesday,DayOfWeek.Thursday);appointment.Save();2.2.4. 刪除一個 Itemmessage.Delete(DeleteMode.HardDelete);2.2.5. 更新 Item EmailMessage message = EmailMessage.Bind(service, itemEvent.ItemId); / Change the mail as read and update message.IsRead = true; message.Update(ConflictResolutionsMode.AutoResolve);2.3. FolderEWS Managed API 定義了一組繼承自 Folder基類的類,以映射 Exchange 中的 Folder 及其層級關系。Item 的屬性 Id 類型為 FolderId 唯一標識 Folder。 WellFolderName 列舉了常見的 Folder 名稱如InBox 收件箱, Drafts 草稿箱,Outbox, JunkMail 等。2.4. Folder 的常用操作.2.4.1. 綁定一個Folder/ Bind to the Inbox.Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);2.4.2. 創建一個FolderFolder folder = new Folder(service);folder.DisplayName = This is a new folder;/ Creates the folder as a child of the Inbox folder.folder.Save(WellKnownFolderName.Inbox);3. EWS Managed API 的使用3.3.1. 創建 ExchangeService 的實例 public static ExchangeService GetExchangeService( string username, string domainName, string password, bool useWebCredential, bool useNetworkCredential, bool machineInDomain) / Set the suitable Exchange Version, or else, you may encounter Version issues ExchangeService exchangeService = new ExchangeService(ExchangeVersion.Exchange2010_SP1); if(!machineInDomain) if (useWebCredential) exchangeService.Credentials = new WebCredentials(username, password, domainName); else exchangeService.Credentials = new NetworkCredential(username, password, domainName); return exchangeService;3.2. 設置 Service 的 URL你可以通過兩種方式來設置 Service 的 URL( Exchange Service 的地址): HardCode: 假設Exchange Service 維護部門人員發布這一地址 AutoDiscover: 根據你的郵件地址自動獲取 URL public static void SettingUri(ExchangeService service, string url, string email) / Prefer use Auto-Discover way to set ExchageService URL if(!string.IsNullOrEmpty(email) service.AutodiscoverUrl(email); if (!string.IsNullOrEmpty(url) service.Url = new Uri(url); 推薦使用AutoDiscover 的方式,因為: AutoDiscover, 有助于幫你選擇對當前連接最合適的 Mailbox Server, 例如你今天在中國,Exchange Server 分派給你的 Mailbox Server 在中國,但是你明天到美國出差,那么這種方式可以幫你選擇美國的Mailbox Server. URL 有可能改變,假如當你的Exchange 團隊重新部署 Exchange Service, 那么URL或許有改變。當然你可以通過配置的方式來避免HardCode.4. 操作Exchange Item & Folder 4.4.1. 獲取收件箱中的Item我們如何同ExchangeService 的對象獲取收件箱(Inbox) 中的郵件,并對其進行相應的操作呢?答案是FindItems 方法,該方法返回一個繼承自IEnumerable, IEnumnerable 接口的自定義集合FindItemsResults. FindItems 的泛型 T 可以是繼承自 Item 的類,所以你可以通過改方法查尋 Appointment, Task, Contact. 注意: ExchangeService 提供了FindAppointments, FindConversation 方法來簡化這些查尋。FindItemsResults findResults = folder.FindAppointments(new CalendarView(startDate, endDate);下面的代碼展示了如何獲取Inbox中前10封郵件:FindItemsResults mails = service.FindItems(WellKnownFolderName.Inbox, new ItemView(10);難道我們只能控制查找收件箱中的前幾個或者全部查尋么?當然不是,如果是那個API的設計者肯定是嗑藥了(on drugs).那么如果我們想要每次只獲取10條,但是有需要處理所有的郵件改如何作呢?那么我需要用到 ViewBase 的 Offset 屬性。下面的代碼已經說明了一切,自己體會吧!public void PageThroughEntireInbox()ItemView view = new ItemView(10);FindItemsResults findResults;dofindResults = service.FindItems(WellKnownFolderName.Inbox, view);foreach (Item item in findResults.Items)/ Do something with the item.view.Offset += 10; while (findResults.MoreAvailable);.. 查尋文件夾查尋文件夾的方式大體上類似于查尋 Item, 但使用的方法是 FindFolders, 返回值為 FinderFolderResults.注意,service.FindFolders 并不能返回指定父文件夾的所有子文件夾,我們知道文件夾是一個樹形結構,所以如果你想在父文件夾下搜尋某個指定名稱的字文件需要使用到遞歸(Recursion)的方式。 private static Folder FindFolderByName(ExchangeService service, string folderName) / Find all sub folders FindFoldersResults subFolders = service.FindFolders(WellKnownFolderName.Inbox, new FolderView(int.MaxValue); foreach (Folder folder in subFolders) Folder result = FindSubFolder(folder, folderName); if (result != null) return result; return null; / / Find sub folder recurs / / / / private static Folder FindSubFolder(Folder partentFolder, string folderName) if (string.Equals(partentFolder.DisplayName, folderName, StringComparison.InvariantCultureIgnoreCase) return partentFolder; if (partentFolder.ChildFolderCount 0) FindFoldersResults subFolders = partentFolder.FindFolders(new FolderView(int.MaxValue); foreach (Folder subFolder in subFolders) Folder result = FindSubFolder(subFolder, folderName); if (result != null) return result; return null; 4.3. 設定查尋條件答案是Class: SearchFilter, 以及他的屬性SearchFilterCollection 這個類似于T-SQL Where 子句的(),你可以用 AND, OR 把很多的 SearchFilterCollection連接起來。但是SearchFilter 是一個抽象類也沒有公開的構造函數(Constructor), 他提供了很多的繼承內部類如: SearchFilter.IsEqualTo, ContainsSubString 等。為了解決如何不知道如何確定查尋的名稱,那么EWS 提供一些工具類:1) ItemSchema: 定義查尋郵件的條件的列名2) FolderSchema: 定義查尋文件夾的條件的列列名3) ConversationSchema: 定義查尋會話的條件的列名這種代碼方式避免了解析用戶輸入查尋條件字符的痛苦, 加入要支持用戶把字符串作為查尋條件,那個要寫一個語法分析模塊也對用戶的輸入字符進行解析。大大加重了代碼量,并且在一個特定領域中的應用不需要做的那么靈活(Flexible)。-我覺得這種編程思想值得我們去學習呀!我們程序員不要做拿大炮打蚊子的事!否則老板要扣工資的呀。 FindItemsResults findResults = service.FindItems( WellKnownFolderName.Inbox, new SearchFilter.SearchFilterCollection( LogicalOperator.Or, new SearchFilter.ContainsSubstring(ItemSchema.Subject, EWS), new SearchFilter.ContainsSubstring(ItemSchema.Subject, API), view);4.4. 設置返回字段,排序字段如何我們只想返回部分字段且按某個字段進行排序,那該如何實現那?忽然很懷想 T-SQL 的 Select Statement, Order by Statements。 但是這里是 EWS, 所以我們只能 Follow 他們的方式. 使用 View 的 OrderBy 屬性來制定排序方式,PropertySet 來指定返回的字段。 ItemView view = new ItemView(10); view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending); view.PropertySet = new PropertySet( BasePropertySet.IdOnly, ItemSchema.Subject, ItemSchema.DateTimeReceived);4.5. 查尋用戶的狀態當你要新建一個邀請 Boss 門來參加時,就是你們組隊刷Boss時, 你需要知道 Boss 們是不是有空。 否則你的會議正好趕上Boss 們有活動,要么他們直接 Reject 你的會議請求,要么批評你在發郵件之前為什么不先看一下他們的 Calendar. 哎,苦B 的小兵誰能懂。EWS 提供了一種方式讓你查尋 Boss 們是否有空,即狀態是否為 Available. 好了下次發 Meeting Request 一定要記住查尋 Boss 們的 Availability 狀態吧。List attendees = new List();attendees.Add();attendees.Add(boss2 );/ Call the availability service.GetUserAvailabilityResults results = service.GetUserAvailability( attendees, new TimeWindow(DateTime.Now, DateTime.Now.AddHours(12),AvailabilityData.FreeBusyAndSuggestions);foreach (AttendeeAvailability attendeeAvailability in results.AttendeesAvailability)5. 通知-NotificationEWS 提供了事件觸發機制,從而使得客戶端的應用程序可以注冊事件并作出相應的處理。比如在特定的文件夾收件箱(Inbox)發生的事件,比如一個Item(郵件,約會,會議)被創建,修改,移動,以及刪除等。EWS中有兩種事件訂閱方式也是經典觀察者模式中的推 (Push), 和拉 (Pull) 實現方式: Pull: 在這種模式下,Client 端需要不斷的去詢問Exchange Server ,從而獲取自從上次詢問過后發生的事件集合。 Push: 在這種模式下,Exchange Server 在事件發生時會主動通知客戶端。個人比較喜歡這種方式,也許因為我比較懶吧懶也符合寫代碼的精神。5.5.1. Pull Notification拉模式,在觀察者這個設計模式中,意味著當事件發生后,僅僅通知客戶端發生了某個事件,但是對于訂閱者所關心的數據確發到一個訂閱者可以拿到的地方-比如公共類的靜態變量,然后訂閱者取到數據在進行處理。這個有點像諜戰片中的橋段 長江拿到了情報放到一個隱蔽的地方,然后再告訴黃河情報已發到老地方(觸發事件),黃河再拿取情報。由此可見這種方式的適用場景之一是比較少的客戶端關注此事件。代碼示例: public static void RegisterPullNotification(ExchangeService service, FolderId folderId) int interval = ConfigurationHelper.GetInt(ConfigurationHelper.POLLEXCHANGESERVERINTERVALINMINUTES); int timeout = ConfigurationHelper.GetInt(ConfigurationHelper.POLLEXCHANGESERVERTIMOUTINMINUTES); PullSubscription pullSubscription = service.SubscribeToPullNotifications(folderId, timeout, null, EventType.NewMail); while (true) GetEventsResults events = pullSu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地平線機器人-W深度報告:國產智駕方案龍頭邁向高階新征程
- 城市污水處理廠智能化升級改造對城市污水處理行業的變革作用
- 環境監測行業智能化發展中的數據質量控制風險管理與防范措施研究報告
- 2025年食品飲料電商運營跨界合作與數字化營銷策略研究報告
- 電影產業2025年票房收益最大化與發行渠道優化策略報告
- 2025年資源型城市綠色轉型政策體系構建與實施效果分析報告
- 2025年葡萄酒產區特色品牌國際化品牌國際化創新成果轉化與應用報告
- 培訓學校藝體生管理制度
- 子公司股權事項管理制度
- 互聯網公司部門管理制度
- 2024-2030年中國擴展現實(XR)行業未來展望與投融資狀況分析報告
- 2024年湖北省武漢市中考道德與法治·歷史試題(含答案解析)
- 2024年天津市初中學業水平考試語文試卷及參考答案
- 山東省聊城市2023-2024學年高一下學期期末考試英語試題
- 公路水運工程施工企業主要負責人和安全生產管理人員考核大綱和模擬試題庫1
- 2024年上海市普通高中學業水平等級性考試化學試卷(含答案)
- 企業法務概論智慧樹知到期末考試答案章節答案2024年溫州大學
- DB1309T 298-2024 園林綠地喬木修剪技術規程
- 日本概況-四季流轉中的日本文化史智慧樹知到期末考試答案2024年
- 【中國地理】中國的氣候
- 我國地方政府在公私合作(PPP)項目中的風險管理研究的綜述報告
評論
0/150
提交評論