WCF Exchange Server Mail Transport

更新:2007 年 11 月

Windows Communication Foundation (WCF) Mail Transport for Microsoft Exchange Server 藉由使用以電子郵件地址為基礎的 WCF 端點,來提供佇列服務。這個方案可讓 .NET Compact Framework 和 .NET Framework 應用程式從任何能夠連至電子郵件伺服器的電腦裝載和使用 Web 服務。

注意事項:

.NET Compact Framework 3.5 版 (含) 以後版本支援 WCF。

這項功能適用於各種應用程式案例,包括:

  • 想從外部傳送安全通訊至中央伺服器以及從伺服器接收安全通訊的應用程式。

  • 從企業伺服器推入資料至行動裝置的應用程式。

  • 點對點應用程式,其中兩部以上的裝置可以直接對話。

    在上述情況中,通訊雙方會使用電子郵件伺服器做為媒介,交換彼此的狀態資訊。例如,在線上遊戲中,常會見到某個玩家藉由提供電子郵件地址或群組別名給應用程式,來傳送玩遊戲的邀請給其他玩家。

  • 找出遺失裝置的應用程式。

  • 將資料推入至裝置以更新其他應用程式之組態資訊的應用程式。

WCF Exchange Server Mail Transport 解除了行動裝置的兩個基本限制:定址能力和裝置離線時佇列資料的能力。WCF 端點位址由通道名稱和電子郵件地址組成。這類似於通訊端架構應用程式中的 IP 位址和連接埠號碼。裝置的定址能力由電子郵件地址提供,而應用程式執行個體的定址能力則透過輸入通道名稱提供。實作此自訂定址機制的是 WS 定址通訊協定。

佇列能力是透過 Windows Mobile 式裝置中的本機資料存放區支援。如需關於 WCF 佇列的一般資訊,請參閱佇列概觀

以 WCF Exchange Server Mail Transport 為基礎所建置的應用程式可運用多項 WCF 基本功能。WCF 為多項基礎通訊協定和傳輸提供統一程式設計模型,可將應用程式邏輯與 WCF 端點分開來處理。此程式設計模型提供了幾項好處,包括支援不同的網路,如整合封包無線電服務 (GPRS)、Wi-Fi,以及任何其他可以存取電子郵件伺服器的網路。使用 WCF Exchange Server Mail Transport 開發應用程式的方式,非常類似於使用 WCF 通道 (如 HTTP 通道) 開發應用程式的方式。

需求

以 WCF Mail Transport 為架構的應用程式所使用的電子郵件伺服器是 Exchange Server 2007。Exchange Server 2007 Service Pack 1 提供有系統管理工作,可讓您將服務流量重新導向至另外 WCF 電子郵件專用的資料夾。

注意事項:

如果沒有重新導向,服務流量會使用 [收件匣]。

裝置和桌上型電腦都支援 Mail Transport。

裝置上須有 CE Messaging API (CEMAPI) 才能支援佇列功能。CEMAPI 存在於 Windows Mobile 式裝置,但不存在於 Windows Embedded CE 式裝置。

Windows Mobile 5.0 版 (含) 以後版本支援 WCF Exchange Server Mail Transport。在 Windows Mobile 5.0 版 (Build 14847.2.0) 之前的版本中,會使用 Systems Management Server (SMS) 而非 Direct Push 來強制與 Exchange 電子郵件伺服器同步處理。

注意事項:

Windows Mobile 2003 for Pocket PC 和 Windows Mobile 2003 Second Edition for Pocket PC 也支援 Mail Transport。但是,對於執行 Windows Mobile 5.0 之前版本的裝置,替傳入訊息所排程的 ActiveSync 同步處理期間不一定都會執行。針對這些裝置,建議您不要指定呼叫 Receive 方法的逾時或指定較長時間的逾時。不支援 Windows Mobile 2003 for Smartphone。

  • 在桌上型電腦,與電子郵件伺服器的通訊是直接透過 Exchange Server 2007 Web 服務進行的。桌上型電腦不支援佇列。因此,桌上型電腦必須永遠處於線上狀態。

  • 桌上型電腦的應用程式使用 WCF 的桌上型電腦實作。

架構

訊息層是以標準桌上型電腦 WCF 架構為基礎。服務執行階段層不存在。下圖顯示通道堆疊以及支援的通訊協定和繫結項目。

WCF Exchange Server Mail Transport 的訊息層

Exchange Server Mail Transport 的訊息層

WS-Security 規格版本 1.0 的支援包含使用 X.509 憑證的 SOAP 訊息安全性。

Message 類別是以 WS 定址標準為基礎建置的。所有訊息都是非同步的,它們會透過電子郵件伺服器從某個裝置移至另一個裝置,而不會返回。

訊息的序列化和還原序列化是在 .NET Compact Framework 或 .NET Framework 執行階段內處理的。在裝置端,應用程式中必須使用自訂序列化程式。這在桌上型電腦則不是必要的,因為完整 .NET Framework 支援 DataContractSerializer 類別。不過,如果應用程式支援裝置與桌上型電腦之間的通訊,則桌上型電腦也應使用裝置所使用的相同序列化程式。

設計

在 WCF Exchange Server Mail Transport 中,WCF 端點是以 WCF 繫結和端點位址的組合表示。繫結會指定用於通訊的參數。它代表繫結項目的集合,其中包括傳輸繫結項目、編碼繫結項目和安全性繫結項目。對於使用 Mail Transport 的應用程式,這些項目定義如下:

應用程式無須執行個體化 CustomBinding 物件內的一組繫結項目,而是可以使用衍生自 MailBindingBase 物件的類別,來建立預先定義的繫結項目集合。除了電子郵件傳輸繫結項目,此類別還包含文字編碼繫結項目和選擇性的訊息安全性。

訊息會包含在電子郵件訊息主體中,或是當做附件傳送。訊息的 [主旨] 列包含有通道名稱。訊息是以自訂 WCF 電子郵件通道戳記識別的,而此戳記是由 Exchange Server 使用的訊息類別所提供。

傳送訊息

當應用程式傳送訊息時,它會在目前輸出通道上呼叫 Send 方法,此通道必須開啟。輸出通道會將訊息序列化為字串,並在 [草稿] 資料夾中建立訊息。它會在電子郵件欄位中設定適當的值。訊息在建立之後,就會移到 [寄件匣] 中。這會透過裝置上的 CEMAPI 或桌上型電腦上的 Exchange Web 服務進行。在裝置上,[寄件匣] 中的訊息會根據 ActiveSync 定義,與其他傳出訊息同步處理。

接收訊息

當 WCF Exchange Server Mail Transport 架構應用程式接收訊息時,其過程如下:

  1. 應用程式開啟輸入通道。

  2. 輸入通道呼叫 Receive 方法,開始接聽訊息。

  3. 當 Exchange 電子郵件伺服器接收有 WCF 電子郵件通道戳記的訊息時,它會自動將訊息傳送到 [服務電子郵件] 資料夾,此資料夾與 [收件匣] 位於同層級。

    注意事項:

    如果尚未設定 Exchange 電子郵件伺服器傳送 WCF Exchange Server 服務郵件至 [服務電子郵件] 資料夾,則會改用 [收件匣]。

  4. 接聽新郵件事件的輸入通道會檢查到達 [服務電子郵件] 或 [收件匣] 資料夾中的每則訊息。

    輸入通道在接聽訊息的同時會封鎖程式碼。

  5. 如果輸入通道與訊息中的特定通道名稱相符,就會擷取訊息並解除封鎖程式碼。

您可以對相同傳輸上所建置的多個輸入通道呼叫 Receive 方法。只有在對同一個執行緒上的同一輸入通道呼叫 Receive 第二次時,才會進行封鎖。

注意事項:

每個通道接聽程式只能與一個輸入通道相關聯。在通道接聽程式上第二次呼叫 AcceptChannel 方法,會等到第一個輸入通道關閉時才傳回。

為提供更大的彈性,電子郵件傳輸可設定來以不同的方式處理各種大小的訊息。例如,訊息可根據其大小,當做附件或在訊息主體中傳送。在初始同步處理期間,較大的訊息可能無法完整下載。在裝置上,[服務電子郵件] 或 [收件匣] 資料夾中的訊息會根據 Microsoft ActiveSync 定義,與其他傳入訊息同步處理。

注意事項:

對裝置來說,ActiveSync 電子郵件同步處理設定會控制每則訊息一開始下載至裝置的大小上限。如果訊息超過這個大小,一開始只會下載一部分的訊息主體。如果某則訊息已下載一部分,而且通道接聽程式正在等候該訊息,傳輸作業便會將訊息加上標籤,表示其必須完整下載。完整的訊息會在下次同步處理工作階段 (Session) 進行下載。

接收訊息時,您可以使用 Message 類別中的 FromEmailAddress 自訂屬性來取得寄件者的電子郵件地址。下列範例示範如何使用這個屬性。

System.ServiceModel.Channels.Message m;
String senderAddress;
m = input.Receive();
senderAddress = m.Properties.ContainsKey("FromEmailAddress")

刪除訊息

一旦應用程式已要求並接收訊息,傳輸就會刪除訊息。傳入訊息在處理後的刪除程序,會因平台而不同。

在 Windows Mobile 式裝置上刪除傳入訊息的程序步驟如下:

  1. 輸入通道在呼叫 Receive 方法之後擷取訊息。

  2. Mail Transport 發出呼叫,從 Windows Mobile 式裝置上的訊息存放區刪除訊息。

  3. 等到下次電子郵件同步處理時,便會從伺服器刪除訊息。

在桌上型電腦上刪除傳入訊息的程序步驟如下:

  1. 輸入通道在呼叫 Receive 方法之後擷取訊息。

  2. Mail Transport 將訊息放入刪除訊息快取,這是 Mail Transport 擁有的內部快取。

  3. 在下次查詢間隔時,Mail Transport 會檢查刪除訊息快取。

    查詢間隔是由 ServerQueryInterval 屬性決定。

  4. 如果刪除訊息快取包含任何訊息,Mail Transport 會發出包含命令的查詢至伺服器,來刪除快取中的訊息。

  5. 在查詢期間,Mail Transport 會檢查伺服器事件並下載任何相關聯的訊息。

  6. Mail Transport 會將任何下載的訊息貼到其處理快取,以供應用程式處理。

若為桌上型電腦,Mail Transport 還會在下列情況發出命令至伺服器,從刪除訊息快取中刪除訊息:

  • 當您在與 Mail Transport 相關聯的最後一個保持開啟的輸入通道上呼叫 Close 方法。

  • 當您在 Mail Transport 上呼叫 Dispose 方法。

這些作業是同步進行的;CloseDispose 會封鎖程式碼,直到訊息從伺服器刪除為止。刪除訊息所需的時間不一定,會視必須刪除的訊息數目而定。如果在此程序期間發生失敗,傳輸會多試幾次來刪除訊息。

在 Windows Mobile 式裝置上,此功能會由訊息存放區處理。

系統也會刪除無效或格式不正確的訊息。SOAP 封套損毀的訊息會視為無效並會永久刪除。如果訊息中的主旨列在 WCF 電子郵件通道戳記後面包含錯誤資訊,例如通道名稱中包含不支援的字元時,系統就會將它視為格式錯誤的訊息。格式不正確的訊息會移至 [已刪除] 資料夾。

預設值

MailBindingBase 類別或其衍生類別代表預先定義繫結項目的集合。這些類別可讓您更容易建立輸入和輸出通道。在某些情況下,您可能必須變更這些預先定義集合中的預設值。如果您必須變更的屬性不存在於 MailBindingBase 或所使用的衍生類別,可以另外在 CustomBinding 物件中建立繫結項目。或者,您可以呼叫 CreateBindingElements 方法,來傳回 MailBindingBase 中的所有繫結項目。

例如,在 ExchangeWebServiceMailBinding 類別中,所接收訊息的預設訊息大小上限為 65,536 位元組。您可以使用下列程式碼來設定 MaxReceivedMessageSize 屬性,將大小上限增加成為 100,000 位元組。

binding = new ExchangeWebServiceMailBinding(Server, Credential, MailSecurityMode.Message);
bindingElems = binding.CreateBindingElements();
bindingElems.Find<ExchangeWebServiceMailTransportBindingElement>().MaxReceivedMessageSize = 100000;
binding = new CustomBinding(bindingElems);

安全性。

WCF Exchange Server Mail Transport 架構應用程式支援以 WS-Security 為基礎的 SOAP 訊息安全性,這類似於支援 HttpTransportBindingElement 類別的桌上型電腦安全性功能。這項安全性功能依賴 X.509 憑證。

如果您在 MailBindingBase 物件的子類別中使用預先定義的繫結項目集,訊息安全性雖仍可使用,但預設會停用。若要啟用安全性,請使用 Mode 屬性。您可以使用 AlgorithmSuite 屬性變更預設加密演算法。啟用安全性時,預設值為 Basic256Rsa15

使用 WCF Exchange Server Mail Transport 的應用程式上支援的安全性繫結項目為 SecurityBindingElementAsymmetricSecurityBindingElement

注意事項:

使用訊息安全性會增加每則訊息的大小。如果您使用 ExchangeWebServiceMailBinding 類別,而訊息超過 45,000 位元組,則可能必須增加 MaxReceivedMessageSize 屬性值。前一節中的程式碼範例示範了如何增加訊息大小上限。

部署

針對裝置部署,WCF Exchange Server Mail Transport DLL 會隨 .NET Compact Framework CAB 檔案提供給 Windows Mobile 式裝置。Managed 組件安裝在全域組件快取中。

裝置的 Mail Transport DLL 如下:

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.WindowsMobile.dll

  • Netcfmail3_5.dll,這是 CEMAPI 原生包裝函式

裝置上也必須有 .NET Compact Framework WCF DLL。

桌上型電腦的部署則是透過 .NET Compact Framework .msi 安裝程式檔案處理的。WCF Exchange Server Mail Transport 功能預設會安裝。Mail Transport 組件安裝在桌上型電腦的全域組件快取中。

桌上型電腦的 WCF Exchange Server Mail Transport DLL 如下:

  • Microsoft.ServiceModel.Channels.Mail.dll

  • Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll

桌上型電腦也必須有標準桌上型電腦 WCF DLL。

請參閱

工作

逐步解說:使用 WCF Exchange Server Mail Transport

其他資源

Windows Communication Foundation (WCF) 開發和 .NET Compact Framework