[EWS]使用 Exchange Web Services Managed API 輕鬆存取 Microsoft Exchange

說到存取Mail Server不外乎使用 SMTP、POP3、IMAP 這幾個協定,但除了 SMTP 協定 .Net Framework 中有提供外,POP3、IMAP 協定不是使用第三方組件就是自己用 Scoket 寫,那就有點累了,但如果你目前與未來只會連結 Microsoft Exchange Server 是可以考慮使用 Exchange Web Services Managed API,你會發現操作變簡單。

說到存取Mail Server不外乎使用 SMTP、POP3、IMAP 這幾個協定,但除了 SMTP 協定 .Net Framework 中有提供外,POP3、IMAP 協定不是使用第三方組件就是自己用 Scoket 寫,那就有點累了,但如果你目前與未來只會連結 Microsoft Exchange Server 是可以考慮使用 Exchange Web Services Managed API,你會發現操作變簡單。

 

什麼是Exchange Web Services Managed API

Exchange Web Services Managed API(以下簡稱 EWS)是微軟提供 .Net Framework 版本,存取 Exchange Server 的API,Outlook 有的資料都可以用 EWS 存取,所以用 EWS 打迼自己的 Outlook 也是可能的,以下是 EWS 提供的功能:

  • Availability
  • Bulk Transfer (new in Exchange 2010)
  • Conversations (new in Exchange 2010)
  • Delegate Management
  • Exchange Store Search
  • Exchange Search (new in Exchange 2010)
  • Federated Sharing (new in Exchange 2010)
  • Folder
  • Inbox Rules (new in Exchange 2010)
  • Item
  • Mail Tips (new in Exchange 2010)
  • Messaging Records Management
  • Message Tracking (new in Exchange 2010)
  • Notification
  • Service Configuration (new in Exchange 2010)
  • Synchronization
  • Unified Messaging (new in Exchange 2010)
  • User Configuration (new in Exchange 2010)
  • Utility
  • Autodiscover service


可存取的類型有:

  • email
  • meetings
  • tasks
  • notes
  • docs
  • journals
  • contacts
  • im

為什麼叫Web Services Managed API 呢?

因為 Exchange Server 也有提供SOAP+XML的Web Services 給所有的語言使用(如: JAVA、Python 等等),而 Web Services Managed API 就是 Web Services 使用 .Net Framework 再包裝過 ,跟使用 Visual Studio 的 Web 參考所產生的 Proxy 完全不一樣(Proxy 產生的超難用),如果你想要直接使用 SOPA+XML 存取 EWS,可以使用下例網址取得定義與XML Schema。

而連線網址使用 http://server/EWS/Exchange.asmx

使用需求

伺服器版本: Exchange Server 2007 SP1 以上

用戶端版本: .Net Framework 2.0 以上

 

安裝方法

到MSDN下載安裝檔(撰寫文章時最新版為 1.2.1),安裝檔中含有文件與 dll,使用 Visual Studio 將 dll 加入參考。

image

 

也有好心的朋友上傳到NuGet上,不過版本有點舊了

image

 

範例

本範例的主要功能是尋找未讀郵件並下載附件、完成更新成已讀並移動資料夾


internal class Program
{
    private static void Main(string[] args)
    {
        ExchangeService es = new ExchangeService(ExchangeVersion.Exchange2007_SP1);//版本預設值最新版
        es.Credentials = new WebCredentials("username", "password", "domain");
        //es.Credentials = new ClientCertificateCredentials(x509); 也可以使用憑證登入

        es.Url = new Uri("https://server/EWS/Exchange.asmx"); // Server路徑

        Folder processedFolder = GetFolder(es);
        SearchFilter search = new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false); //使用欄位搜尋
        //string search = "From:Wade AND Subject:EWS"; //也支援搜尋語法,但語法沒有IsRead欄位

        //找出 10筆 Inbox 下的未讀郵件
        foreach (EmailMessage element in es.FindItems(WellKnownFolderName.Inbox, search, new ItemView(10)))
        {
            //跟IMAP一樣,首先只會下載部分基本資料,像Body與Attachments資訊要呼叫Load才會下載
            element.Load(PropertySet.FirstClassProperties);

            foreach (FileAttachment item in element.Attachments)
            {
                //下載附檔
                item.Load("R:\\" + item.Name);
            }

            //Do Something

            //更新成已讀
            element.IsRead = true;
            element.Update(ConflictResolutionMode.AlwaysOverwrite);

            //移動到處理完成資料夾
            element.Move(processedFolder.Id);
        }
    }

    private static Folder GetFolder(ExchangeService es)
    {
        //取得 處理完成資料夾,如果沒有資料夾就新增
        SearchFilter search = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "處理完成");

        var folder = es.FindFolders(WellKnownFolderName.Inbox, search, new FolderView(1)).FirstOrDefault();
        if (folder == null)
        {
            folder = new Folder(es);
            folder.DisplayName = "處理完成";
            folder.Save(WellKnownFolderName.Inbox); //在Inbox下新增資料夾
        }

        return folder;
    }
}

 

參考

EWS版本不同 Class 有一些變動如原本的 ExchangeServicemBinding 更改成 ExchangeService ,在找範例時別覺得奇怪為什麼照著打編譯不過,應該就是 Class 改了。

其他IMAP組件

可以連結其他 Mail Server 如: Gmail、Hotmail等等。