Exchange の EWS を使用してメールボックス イベントに関する通知を取得する
EWS マネージ API または EWS を使用してプル通知の受信を登録し、イベントを取得する方法について説明します。
Exchange の EWS では、サーバーからクライアントへのメールボックスの変更内容に関する通知をクライアントが要求 (プル) できるようにするためにプル通知を使用します。
EWS マネージ API を使用してプル通知の受信を登録する場合は、SubscribeToPullNotifications メソッドを使用してプル通知の登録と取得を実施します。 その後で、GetEvents メソッドを使用して、サーバーからイベントを取得します。
EWS を使用してプル通知にサブスクライブする場合は、Subscribe 操作を使用してサブスクリプションを作成し、応答を解析して、GetEvents s 操作を使用して通知を取得します。
サーバー上で変更または作成されたアイテムについての通知をクライアントで受信したら、変更内容を同期します。
EWS マネージ API を使用したプル通知の受信の登録と取得
次のコード例は、SubscribeToPullNotifications メソッドを使用して、受信トレイ フォルダー内のすべてのイベントに対応したプル通知の受信を登録する方法を示しています。 さらに、この例では GetEvents メソッドを使用して、サーバーからイベントを取得しています。 この例では、service が有効な ExchangeService バインディングであることを想定しています。
// Subscribe to pull notifications in the Inbox.
PullSubscription subscription = service.SubscribeToPullNotifications(
new FolderId[] { WellKnownFolderName.Inbox }, 30, null,
EventType.NewMail, EventType.Created, EventType.Deleted,
EventType.Modified, EventType.Moved, EventType.Copied, EventType.FreeBusyChanged);
// Call GetEvents to retrieve events from the server.
GetEventsResults events = subscription.GetEvents();
サーバーからイベントを受信したら、該当する変更内容をサーバーと同期できます。 サブスクリプションが不要になったら、「通知の受信の登録を解除する方法」に示した登録解除メソッドのいずれかを使用してサーバーとのサブスクリプションを終了します。
EWS を使用したプル通知の受信の登録
次の例は、Subscribe 操作を使用して受信トレイ フォルダー内のすべての EventTypes にサブスクライブするために、サーバーに送信される XML 要求を示しています。 これは、SubscribeToPullNotifications メソッドを使用してプル通知にサブスクライブするときに EWS マネージ API が送信する XML 要求でもあります。
<?xml version="1.0" encoding="utf-8"?>
<Subscribe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PullSubscriptionRequest xmlns="https://schemas.microsoft.com/exchange/services/2006/messages">
<FolderIds xmlns="https://schemas.microsoft.com/exchange/services/2006/types">
<DistinguishedFolderId Id="inbox" />
</FolderIds>
<EventTypes xmlns="https://schemas.microsoft.com/exchange/services/2006/types">
<EventType>NewMailEvent</EventType>
<EventType>CreatedEvent</EventType>
<EventType>DeletedEvent</EventType>
<EventType>ModifiedEvent</EventType>
<EventType>MovedEvent</EventType>
<EventType>CopiedEvent</EventType>
<EventType>FreeBusyChangedEvent</EventType>
</EventTypes>
<Timeout xmlns="https://schemas.microsoft.com/exchange/services/2006/types">30</Timeout>
</PullSubscriptionRequest>
</Subscribe>
次の XML 例は、Subscribe 操作要求に対する応答として、サーバーからクライアントに送信される SubscribeResponse メッセージを示しています。ResponseCode 要素には、サブスクリプションの作成が成功したことを意味する NoError の値が含まれています。SubscriptionId 要素により、サーバー上のプル通知サブスクリプションが一意に特定されます。Watermark 要素は、メールボックス イベント キュー内のブックマークを表します。
<?xml version="1.0" encoding="utf-8"?>
<SubscribeResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ResponseMessages xmlns="https://schemas.microsoft.com/exchange/services/2006/messages">
<SubscribeResponseMessage ResponseClass="Success">
<ResponseCode>NoError</ResponseCode>
<SubscriptionId>d581ab79-a2ec-4653-9c8e-564d7cfc1d8c</SubscriptionId>
<Watermark>AAAAAGUhAAAAAAAAAQ==</Watermark>
</SubscribeResponseMessage>
</ResponseMessages>
</SubscribeResponse>
サブスクリプションを作成すると、SubscribeResponse メッセージで返される SubscriptionId を使用して、ストリーミングされたイベントを取得できるようになります。
EWS を使用したプル通知の取得
次の XML 例は、SubscribeResponse メッセージで返された SubscriptionId についての通知を取得するために、クライアントからサーバーに送信される GetEvents 操作要求のメッセージを示しています。最初の GetEvents 要求には、Subscribe 応答で返された Watermark を使用します。その後の GetEvents 要求には、前の GetEvents 要求で返された最新の Watermark を使用します。
<?xml version="1.0" encoding="utf-8"?>
<GetEvents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SubscriptionId xmlns="https://schemas.microsoft.com/exchange/services/2006/messages">d581ab79-a2ec-4653-9c8e-564d7cfc1d8c</SubscriptionId>
<Watermark xmlns="https://schemas.microsoft.com/exchange/services/2006/messages">AAAAAGUhAAAAAAAAAQ==</Watermark>
</GetEvents>
次の XML 例は、サーバーからクライアントに送信される GetEvents 応答メッセージを示しています。それぞれの GetEvents 応答には、1 つ以上のイベントに関する情報が含まれています。Watermark は、イベントごとに返されます。最新の Watermark は保存しておいて、次回の GetEvents 要求で使用する必要があります。最後の GetEvents 要求以降にストア イベントが発生していない場合は、状態イベントが返されます。
<?xml version="1.0" encoding="utf-8"?>
<GetEventsResponseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ResponseMessages xmlns="https://schemas.microsoft.com/exchange/services/2006/messages">
<GetEventsResponseMessage ResponseClass="Success">
<ResponseCode>NoError</ResponseCode>
<Notification>
<SubscriptionId xmlns="https://schemas.microsoft.com/exchange/services/2006/types">d581ab79-a2ec-4653-9c8e-564d7cfc1d8c</SubscriptionId>
<PreviousWatermark xmlns="https://schemas.microsoft.com/exchange/services/2006/types">AAAAAGUhAAAAAAAAAQ==</PreviousWatermark>
<MoreEvents xmlns="https://schemas.microsoft.com/exchange/services/2006/types">false</MoreEvents>
<NewMailEvent xmlns="https://schemas.microsoft.com/exchange/services/2006/types">
<Watermark>AAAAAHMhAAAAAAAAAQ==</Watermark>
<TimeStamp>2013-09-15T21:37:01Z</TimeStamp>
<ItemId Id="AAAtA=" ChangeKey="CQAAAA==" />
<ParentFolderId Id="AQAtAEFkbWA==" ChangeKey="AQAAAA==" />
</NewMailEvent>
</Notification>
</GetEventsResponseMessage>
</ResponseMessages>
</GetEventsResponse>
サーバーからイベントを受信したら、変更内容をクライアントに同期します。サブスクリプションが不要になったら、Unsubscribe 操作を使用してサーバーとのサブスクリプションを終了します。
次の手順
通知を受信したら、フォルダー階層の同期や変更されたフォルダーの内容の同期を実行します。