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