Exchange で EWS を使用してアイテムをエクスポートする

Exchange の EWS マネージ API または EWS を使用して、予定、電子メール、連絡先、タスクなどのアイテムをエクスポートする方法について説明します。

EWS マネージ API または EWS を使用すると、さまざまな方法で Exchange からアイテムをエクスポートできます。次の事項によって、使用するオプションが決まります。

  • エクスポートするアイテムの種類。

  • Exchange 内のアイテム状態とエクスポートしたアイテムの間で維持する必要のある再現性の程度。

  • エクスポートしたアイテムの形式。

  • 後処理の要件。

  • Exchange にアイテムをインポートして戻す必要があるかどうか。

この記事では、さまざまなオプションを使用してアイテムをエクスポートする方法について説明します。どのオプションを使用しても Exchange のアイテムのバッチ エクスポートができます。

カスタム形式でアイテムをエクスポートする

EWS マネージ API の Item.Bind メソッドの呼び出しの結果を使用するか、EWS の GetItem 操作の結果を解析することで、カスタム アプリケーションの要件で動作する形式に変換できます。 このオプションは、アイテムをエクスポートして、データベースや .csv ファイルなどの形式やシステムにインポートする場合に使用します。 アイテムを EWS XML の形式で保存することもできます。多くのシステムに XML の解析機能があるため、この形式は実用的です。 Item.Bind メソッドまたは GetItem 操作を (Item.MimeContent プロパティなしで) 使用することをお勧めします。このオプションにより、エクスポートするプロパティを制御できるようになります。

完全な再現性のあるアイテムをエクスポートする

完全な再現性のあるアイテムをエクスポートする場合は、EWS の ExportItems 操作を使用できます。 ExportItems 操作では、データ ストリームとして各アイテムをエクスポートします。 このデータ ストリームは解析には向いていませんが、Exchange メールボックスにインポートして戻せるアイテム レベルのバックアップとして使用できます。 それぞれの ExportItems 要求には多数のアイテムを含めることができますが、呼び出しごとに含めるアイテム数は 100 個を超えないようにしてください。 EWS マネージ API は ExportItems 操作を実装していないため、EWS マネージ API を使用する場合は、Web 要求を送信するルーチンを記述することが必要になります。 Item.Bind メソッドをオプションとして使用するとアイテムに関するメタデータを取得できます。これにより、データ ストリームに関する情報のインデックス作成と保存が可能になります。

Exchange メールボックスにインポートする予定のあるアイテムをエクスポートする場合は、ExportItems 操作の使用をお勧めします。

次の例は、ExportItems 操作の使用方法を示しています。この例では、読みやすくなるようにアイテム ID が短くしてあります。

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
      xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
      xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013"/>
  </soap:Header>
  <soap:Body>
    <m:ExportItems>
      <m:ItemIds>
        <t:ItemId Id="AAMkAGYzZjZmRiUsidkC+NAAAAY89GAAA="/>
      </m:ItemIds>
    </m:ExportItems>
  </soap:Body>
</soap:Envelope>

サーバーは ExportItems 要求に ExportItemsResponse 要素で応答します。この要素には、アイテムが正常にアップロードされたことを示す NoErrorResponseCode 要素の値が含まれていてます。この応答には、エクスポートしたアイテムのアイテム ID とエクスポートしたコンテンツを格納しているデータ ストリームも含まれています。次の例は、エクスポートしたアイテムを格納している SOAP ボディを示しています。

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <m:ExportItemsResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
    <m:ResponseMessages>
      <m:ExportItemsResponseMessage ResponseClass="Success">
        <m:ResponseCode>NoError</m:ResponseCode>
        <m:ItemId Id="AAMkAGYzZjZmRiUsidkC+NAAAAY89GAAA=" ChangeKey="FwAAAA=="/>
        <m:Data>
          AQAAAAgAAAAAAAAALgBlAHgAdABlAHMAdAAuAG0AaQBjAHIAbwBzAG8AZgB0AC4A
          cgAyAEAAYQB1AGoAaQBuAGcALQBkAG8AbQAuAGUAeAB0AGUAcwB0AC4AbQBpAGMAcgBvAHMA
          bwBmAHQALgBjAG8AbQAAAAMAADkAAAAAAwD+DwYAAAADAARAAwACQAMADkA=
        </m:Data>
      </m:ExportItemsResponseMessage>
     </m:ResponseMessages>
  </m:ExportItemsResponse>
</s:Body>

一般的なファイル形式へのエクスポートに MIME ストリームを使用する

EWS マネージ API の Item.Bind メソッドまたは EWS の GetItem 操作を使用すると、アイテムの MIME 表現を得られます。 Exchange は各アイテムの MIME コンテンツを保存しないため、各アイテムのデータベース表現を MIME ストリームに変換する必要があります。 この変換にはコストがかかるため、規模の大きなアイテムに対する MIME ストリームの要求はお勧めできません。 また、MIME ストリームには限定的なプロパティのセットが含まれている点にも注意してください。そのプロパティのセットに必要とするものが含まれていない場合は、別のオプションを検討することが必要になります。

MIME ストリームを使用して電子メールを .eml ファイルと .mht ファイルにエクスポートするために EWS マネージ API を使用する

Outlook などの一般的なメール アプリケーションは、EML (.eml) ファイル形式を開くことができます。 次の例は、MIME ストリームを使用して電子メールをエクスポートする方法と、EML および MIME HTML (.mht) ファイルを作成するために MIME ストリームを使用する方法を示しています。 多数の Web ブラウザーが MIME HTML ファイル形式をサポートしています。 この例では、service が有効な ExchangeService オブジェクトであり、ユーザーが Exchange サーバーに対して認証できることを前提としています。

private static void ExportMIMEEmail(ExchangeService service)
{
    Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
    ItemView view = new ItemView(1);
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
    // This results in a FindItem call to EWS.
    FindItemsResults<Item> results = inbox.FindItems(view);
    foreach (var item in results)
    { 
        PropertySet props = new PropertySet(EmailMessageSchema.MimeContent);
        // This results in a GetItem call to EWS.
        var email = EmailMessage.Bind(service, item.Id, props);
                
        string emlFileName = @"C:\export\email.eml";
        string mhtFileName = @"C:\export\email.mht";
        // Save as .eml.
        using (FileStream fs = new FileStream(emlFileName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
        }
        // Save as .mht.
        using (FileStream fs = new FileStream(mhtFileName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
        }
    }
}

MIME ストリームを使用して iCal ファイルに予定をエクスポートするために EWS マネージ API を使用する

Outlook などの一般的な予定表アプリケーションは、iCal (.ics) ファイル形式を開くことができます。次の例は、MIME ストリームを使用して予定をエクスポートする方法と、iCal ファイルを作成するために MIME ストリームを使用する方法を示しています。MIME ストリームでは、多くのプロパティ (出席者や添付ファイル関連のプロパティなど) がエクスポートされない点に注意してください。その他のプロパティを EWS から取得するには、そのプロパティを要求してプライベート拡張機能として iCal ファイルに保存します。こうしたプライベート拡張機能には、プレフィックスの "x-" が付いています。

この例では、service が有効な ExchangeService オブジェクトであり、ユーザーが Exchange サーバーに対して認証できることを前提としています。 また、予定表フォルダー内に "2015 Financial Projections" という件名の予定があることも前提としています。

private static void ExportMIMEAppointment(ExchangeService service)
{
    Folder inbox = Folder.Bind(service, WellKnownFolderName.Calendar);
    ItemView view = new ItemView(1);
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly); 
    // This results in a FindItem call to EWS.
    FindItemsResults<Item> results = inbox.FindItems("subject:'2015 Financial Projections'", view);
    foreach (var item in results)
    {
        PropertySet props = new PropertySet(AppointmentSchema.MimeContent);
        // This results in a GetItem call to EWS.
        var email = Appointment.Bind(service, item.Id, props);
        string iCalFileName = @"C:\export\appointment.ics";
        // Save as .ics.
        using (FileStream fs = new FileStream(iCalFileName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
        }
    }
}

MIME ストリームを使用して vCard ファイルに連絡先をエクスポートするために EWS マネージ API を使用する

Outlook などの連絡先管理アプリケーションは、vCard (.vcf) ファイル形式を開くことができます。次の例は、MIME ストリームを使用して連絡先をエクスポートする方法と、vCard を作成するために MIME ストリームを使用する方法を示しています。その他のプロパティを EWS から取得するには、そのプロパティを要求してプライベート拡張機能として vCard に保存します。こうした拡張機能には、プレフィックスの "x-" が付いています。

この例では、service が有効な ExchangeService オブジェクトであり、ユーザーが Exchange サーバーに対して認証できることを前提としています。

private static void ExportMIMEContact(ExchangeService service)
{
    Folder inbox = Folder.Bind(service, WellKnownFolderName.Contacts);
    ItemView view = new ItemView(1);
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
    // This results in a FindItem call to EWS.
    FindItemsResults<Item> results = inbox.FindItems(view);
    foreach (var item in results)
    {
        PropertySet props = new PropertySet(ContactSchema.MimeContent);
        // This results in a GetItem call to EWS.
        var email = Contact.Bind(service, item.Id, props);
        string vcfFileName = @"C:\export\contact.vcf";
        // Save as .vcf.
        using (FileStream fs = new FileStream(vcfFileName, FileMode.Create, FileAccess.Write))
        {
            fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
        }
    }
}

注意

vCard のファイルは、MimeContent プロパティを使用してインポートすることはできません。 EWS マネージ API の Contact.Save メソッドまたは EWS の CreateItem 操作を使用すると、連絡先をインポートできます。

MIME ストリームを使用してアイテムをエクスポートするために EWS を使用する

GetItem 操作を使用して、アイテムの MIME ストリームを取得します。次の GetItem 要求は、アイテムの MIME コンテンツの要求方法を示しています。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" 
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
    <m:GetItem>
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:IncludeMimeContent>true</t:IncludeMimeContent>
      </m:ItemShape>
      <m:ItemIds>
        <t:ItemId Id="AAMkADEzYjJkLTYxMwB8GqYicWAAA=" ChangeKey="CQAAABzXv"/>
      </m:ItemIds>
    </m:GetItem>
  </soap:Body>
</soap:Envelope>

次の例に、MIME ストリームを取得する要求への応答を示します。MIME ストリームは、読みやすくするために短縮されています。

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" 
                         MinorVersion="0" 
                         MajorBuildNumber="893" 
                         MinorBuildNumber="17" 
                         Version="V2_10" 
                         xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
                         xmlns="https://schemas.microsoft.com/exchange/services/2006/types" 
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                       xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:GetItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Items>
            <t:Message>
              <t:MimeContent CharacterSet="UTF-8">UmVjZ6IGZyb2b2suY29y5hMzgwZTA1YtDQo=</t:MimeContent>
              <t:ItemId Id="AAMkADEzYjJkLTYxMwB8GqYicWAAA=" ChangeKey="CQAAABzXv"/>
            </t:Message>
          </m:Items>
        </m:GetItemResponseMessage>
      </m:ResponseMessages>
    </m:GetItemResponse>
  </s:Body>
</s:Envelope>

アイテムをエクスポートしたら、アイテムを Exchange にインポートします。

関連項目