Exchange の EWS を使用してアイテムをインポートする

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

多くのシステムには予定、メール、連絡先、タスクが含まれており、さまざまな方法でそれらのアイテムを Exchange にインポートできます。 Exchange へのアイテムのインポートは、メールボックスのリレーションシップがそれらのアイテムに対して管理されていない場合に簡単です。 Item.Save EWS マネージ API メソッドまたは CreateItem EWS 操作を使用して、Exchange メールボックスにアイテムを作成できます。 ただし、単純なアプローチでは、すべてのシナリオがサポートされているわけではありません。例えば:

  • 出席者 (会議) によって予定をインポートするときに、開催者と出席者のリレーションシップを維持できません。 つまり、開催者と出席者のリレーションシップを確立するには、会議の開催者が会議出席依頼を出席者に再送信する必要があるということです。 出席者の予定表にインポートされた予定は、会議の開催者の予定に関連付けられることはありません。 出席者は、開催者と出席者のリレーションシップを確立するために、開催者からの会議出席依頼の再送信を受け入れる必要があります。

  • 割り当て済みのタスクがインポートされるときに、割り当て先に関する情報が保持されません。

どのインポート オプションを使用しても、Exchange にアイテムをバッチ インポートできます。

アイテムのインポートに EWS マネージ API または EWS のアイテムの種類を使用する

EWS マネージ API または EWS を使用して、別のシステムから電子メール、連絡先、予定、またはタスクをインポートできます。 インポートする内容に応じて、次のいずれかのオブジェクトにインポート元形式からのプロパティを設定するだけです。

表 1. EWS マネージ API のオブジェクトと EWS の要素

EWS マネージ API のオブジェクト EWS の要素
EmailMessage
Message
Contact
Contact
Appointment
CalendarItem
Task
タスク

EWS マネージ API の Item.Save メソッドまたは EWS の CreateItem 操作を使用して、アイテムのインポートを実行します。 このアプローチでは、どのプロパティをインポートするかを制御できるため、別のシステムからアイテムをインポートする場合にお勧めします。 アイテムにプロパティを設定して、アイテムを保存する方法の詳細については、「EWS マネージ API を使用してアイテムを作成する」または「EWS を使用してアイテムを作成する」を参照してください。

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

EWS の UploadItems 操作を使用すると、アイテムをデータ ストリームとしてアップロードできます。 このアイテムのデータ ストリーム表現は、 ExportItems 操作の呼び出しの結果から得る必要があります。 EWS マネージ API は UploadItems 操作を実装していないため、EWS マネージ API を使用する場合は、Web 要求を送信するルーチンを記述することが必要になります。

これは、別の Exchange サーバーからエクスポートされたアイテムを最も簡単にインポートする方法です。

次に示す例では、読みやすくなるように識別子と Data 要素の内容が簡略化されています。

<?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="http://schemas.microsoft.com/exchange/services/2006/types"
      xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1"/>
  </soap:Header>
  <soap:Body>
    <m:UploadItems>
      <m:Items>
        <t:Item CreateAction="CreateNew">
          <t:ParentFolderId  Id="AAMkADEzOTE7kV0AAA=" ChangeKey="AQAAAA=="/>
          <t:Data>AQAAAAgAAAAAAQAAAAADABZADQASDkANABMO</t:Data>
        </t:Item>
      </m:Items>
    </m:UploadItems>
  </soap:Body>
</soap:Envelope>

サーバーは、Item が正常にアップロードされたことを示す NoErrorResponseCode 要素値を含む UploadItemsResponse 要素を使用して UploadItems 要求に応答します。 応答には、アップロードされたアイテムのアイテム ID も含まれます。

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

EWS では、EML (.eml) ファイルと iCal (.ics) ファイルをインポートできます。 独自の MIME コンテンツをテストして、Exchange の MIME パーサーが MIME ストリームのコンテンツを処理する方法を確認してください。 MIME ストリームは便利に使用できますが、一般に、アイテムのインポートに EWS マネージ API または EWS のアイテムの種類を使用するほうが優れています。 ここには、vCard をインポートする方法の例があります。

MIME ストリームを使用して EML ファイルから電子メールをインポートするために EWS マネージ API を使用する

次の例は、EML ファイルのコンテンツで MimeContent プロパティを設定して、電子メールをメールボックスにインポートする方法を示しています。 さらに、インポートした電子メールの PidTagMessageFlags (0x0E07) 拡張プロパティを設定して、メールボックス内で下書きアイテムとして表示されないようにする方法も示しています。 この例では、service が有効な ExchangeService オブジェクトであり、ユーザーが Exchange サーバーに対して認証できることを前提としています。

private static void UploadMIMEEmail(ExchangeService service)
{
    EmailMessage email = new EmailMessage(service);
    
    string emlFileName = @"C:\import\email.eml";
    using (FileStream fs = new FileStream(emlFileName, FileMode.Open, FileAccess.Read))
    {
        byte[] bytes = new byte[fs.Length];
        int numBytesToRead = (int)fs.Length;
        int numBytesRead = 0;
        while (numBytesToRead > 0)
        {
            int n = fs.Read(bytes, numBytesRead, numBytesToRead);
            if (n == 0)
                break;
            numBytesRead += n;
            numBytesToRead -= n;
        }
        // Set the contents of the .eml file to the MimeContent property.
        email.MimeContent = new MimeContent("UTF-8", bytes);
    }
    
    // Indicate that this email is not a draft. Otherwise, the email will appear as a 
    // draft to clients.
    ExtendedPropertyDefinition PR_MESSAGE_FLAGS_msgflag_read = new ExtendedPropertyDefinition(3591, MapiPropertyType.Integer);
    email.SetExtendedProperty(PR_MESSAGE_FLAGS_msgflag_read, 1);
    // This results in a CreateItem call to EWS. The email will be saved in the Inbox folder.
    email.Save(WellKnownFolderName.Inbox);
}

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

MIME ストリームを使用して、iCalendar ファイルの形式で単純な予定をインポートできます。 会議の開催者と出席者の関係を Exchange 予定表 ワークフローの一部として設定する必要があるため、出席者との予定である会議をインポートすることはできません。 MIME ストリームで出席者をキャプチャすることはできません。

次のコード例は、単純な .ics ファイルをユーザーのメールボックスにインポートする方法を示しています。

private static void UploadMIMEAppointment(ExchangeService service)
{
    Appointment appointment = new Appointment(service);
    string iCalFileName = @"C:\import\appointment.ics";
    using (FileStream fs = new FileStream(iCalFileName, FileMode.Open, FileAccess.Read))
    {
        byte[] bytes = new byte[fs.Length];
        int numBytesToRead = (int)fs.Length;
        int numBytesRead = 0;
        while (numBytesToRead > 0)
        {
            int n = fs.Read(bytes, numBytesRead, numBytesToRead);
            if (n == 0)
                break;
            numBytesRead += n;
            numBytesToRead -= n;
        }
        // Set the contents of the .ics file to the MimeContent property.
        appointment.MimeContent = new MimeContent("UTF-8", bytes);
    }
    // This results in a CreateItem call to EWS. 
    appointment.Save(WellKnownFolderName.Calendar);
}

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

EWS の CreateItem 操作を使用すると、EML アイテムと iCal アイテムは、それぞれの MIME ストリームを使用することでインポートできます。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1" />
    <t:MailboxCulture>en-US</t:MailboxCulture>
  </soap:Header>
  <soap:Body >
    <m:CreateItem>
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="inbox"/>
      </m:SavedItemFolderId> 
        <m:Items>
        <t:Message>
          <t:MimeContent CharacterSet="UTF-8">
            <!-- Insert MIME content here-->
          </t:MimeContent>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

次の手順

メールボックスにアイテムをインポートしたら、インポートしたアイテムを保存するためのカスタム フォルダーを作成することや、クライアントとメールボックスのアイテムを同期することが必要になります。

関連項目