次の方法で共有


Exchange において EWS を使用して電子メール メッセージを移動およびコピーする

Exchange で EWS マネージ API または EWS を使用して電子メール メッセージを移動およびコピーする方法について説明します。

EWS マネージ API または EWS を使用すると、メールボックスの電子メール メッセージを移動およびコピーすることができます。

表 1. 電子メール メッセージを移動およびコピーするための EWS マネージ API メソッドと EWS 操作

タスク EWS マネージ API メソッド EWS 操作
電子メール メッセージの移動
EmailMessage.Move
MoveItem
電子メール メッセージのコピー
EmailMessage.Copy
CopyItem

電子メール メッセージを別のフォルダーに移動したりコピーしたりすると、重要なこととして、新しいフォルダーに新しいアイテムが一意のアイテム ID で作成され、元のメッセージが削除されるという点に注意してください。 同じメールボックスにある 2 つのフォルダーで電子メール メッセージを移動またはコピーすると、応答で新しいアイテムが返され、新しいアイテム ID に対するアクセス権が付与されます。 ただし、2 つのメールボックス間で、またはメールボックスとパブリック フォルダー間で電子メール メッセージを移動またはコピーすると、応答で新しいアイテムが返されません。 このシナリオの場合に、移動したメッセージにアクセスするには、EWS マネージ API FindItems メソッドまたは EWS FindItem 操作を使用して、PidTagSearchKey (0x300B0102) プロパティの拡張プロパティ定義を作成するか、カスタムの拡張プロパティを作成および設定し、新しいフォルダーでそのカスタム拡張プロパティを検索します。

電子メール メッセージの削除は、[削除済みアイテム] フォルダーへの移動とは異なります。 EWS マネージ API Item.Delete メソッドまたは EWS DeleteItem 操作を使用する場合、要求で指定されたアイテムは元のフォルダーから除去されて、新しいアイテム ID で [削除済みアイテム] フォルダーにコピーが配置されます。 アイテムを移動またはコピーする場合とは異なり、新しいアイテムが Delete メソッドまたは DeleteItem 操作の応答で返されません。 EWS マネージ API または EWS を使用して電子メールを削除するための手順は、Exchange ストアから汎用アイテムを削除する手順と同じです。

EWS マネージ API を使用して電子メール メッセージを移動する

次のコード例は、EmailMessage.Move メソッドを使用して既存の電子メール メッセージをフォルダー間で移動する方法を示しています。

この例では、service は有効な ExchangeService オブジェクトで、ItemId は移動またはコピー対象のメール メッセージの Id であると想定しています。

// As a best practice, limit the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.ParentFolderId);
// Bind to the existing item by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage beforeMessage = EmailMessage.Bind(service, ItemId, propSet);
// Move the specified mail to the JunkEmail folder and store the returned item.
Item item = beforeMessage.Move(WellKnownFolderName.JunkEmail);
// Check that the item was moved by binding to the moved email message 
// and retrieving the new ParentFolderId.
// This method call results in a GetItem call to EWS.
EmailMessage movedMessage = EmailMessage.Bind(service, item.Id, propSet);
Console.WriteLine("An email message with the subject '" + beforeMessage.Subject + "' has been moved from the '" + beforeMessage.ParentFolderId + "' folder to the '" + movedMessage.ParentFolderId + "' folder.");

EWS を使用して電子メール メッセージを移動する

次のコード例は、MoveItem 操作を使用して [迷惑メール] フォルダーに電子メール メッセージを移動する方法を示しています。

これは、Move メソッドの呼び出し時に EWS マネージ API によって送信される XML 要求でもあります。 読みやすくするため、一部の属性と要素の値が短縮されています。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
    <m:MoveItem>
      <m:ToFolderId>
        <t:DistinguishedFolderId Id="junkemail" />
      </m:ToFolderId>
      <m:ItemIds>
        <t:ItemId Id="AfwDoAAA="
                  ChangeKey="CQAAABYAAAApjGm7TnMWQ5TzjbhziLL0AAF25sM1" />
      </m:ItemIds>
    </m:MoveItem>
  </soap:Body>
</soap:Envelope>

サーバーは、電子メール メッセージが正常に移動されたことを示す NoErrorResponseCode 値を含む MoveItemResponse メッセージで MoveItem 要求に応答します。 応答には、新しいフォルダー内の電子メール メッセージの ItemId も含まれます。 これは、ItemId が新しいフォルダー内で異なるため、保存することが重要です。

EWS マネージ API を使用して電子メール メッセージをコピーする

次のコード例は、EmailMessage.Copy メソッドを使用して既存の電子メール メッセージをフォルダー間でコピーする方法を示しています。

この例では、service は有効な ExchangeService オブジェクトで、ItemId はコピー対象のメール メッセージの Id であると想定しています。 読みやすくするため、一部のパラメーターの値が短縮されています。

// As a best practice, limit the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.ParentFolderId);
// Bind to the existing item by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage originalMessage = EmailMessage.Bind(service, ItemId, propSet);
// Copy the orignal message into another folder in the mailbox and store the returned item.
Item item = originalMessage.Copy("epQ/3AAA=");
// Check that the item was copied by binding to the copied email message 
// and retrieving the new ParentFolderId.
// This method call results in a GetItem call to EWS.
EmailMessage copiedMessage = EmailMessage.Bind(service, item.Id, propSet);
Console.WriteLine("An email message with the subject '" + originalMessage.Subject + "' has been copied from the '" + originalMessage.ParentFolderId + "' folder to the '" + copiedMessage.ParentFolderId + "' folder.");

EWS を使用して電子メール メッセージをコピーする

次のコード例は、CopyItem 操作を使用して同じでメールボックスにある別のフォルダーに電子メール メッセージをコピーする方法を示しています。コピーするために、移動する電子メール メッセージの ItemId を送信し、ToFolderId 要素で宛先フォルダーを指定しています。

これは、Copy メソッドの呼び出し時に EWS マネージ API によって送信される XML 要求でもあります。 読みやすくするため、一部の属性と要素の値が短縮されています。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
    <m:CopyItem>
      <m:ToFolderId>
        <t:FolderId Id="pQ/3AAA=" />
      </m:ToFolderId>
      <m:ItemIds>
        <t:ItemId Id="2TSeSAAA="
                  ChangeKey="CQAAABYAAAApjGm7TnMWQ5TzjbhziLL0AAF2d+3+" />
      </m:ItemIds>
    </m:CopyItem>
  </soap:Body>
</soap:Envelope>

サーバーは、電子メール メッセージが正常にコピーされたことを示す NoErrorResponseCode 値を含む CopyItemResponse メッセージで CopyItem 要求に応答します。 応答には、新しいフォルダー内の電子メール メッセージの ItemId も含まれます。 これは、ItemId が新しいフォルダー内で異なるため、保存することが重要です。

関連項目