Поделиться через


Экспорт элементов с помощью веб-служб Exchange в Exchange

Узнайте, как экспортировать встречи, сообщения электронной почты, контакты, задачи и другие элементы с помощью управляемого API EWS или веб-служб Exchange в Exchange.

Элементы Exchange можно экспортировать с помощью управляемого API EWS или веб-служб Exchange различными способами. Параметр, который вы используете, зависит от следующих условий:

  • Тип экспортируемого элемента.

  • Степень точности, которую необходимо обеспечить между состоянием элемента в Exchange и экспортируемого элемента.

  • Формат экспортируемого элемента.

  • Любые требования по постобработке.

  • Требуется ли импортировать элемент обратно в Exchange.

В этой статье показано, как использовать каждый из различных вариантов для экспорта элементов. Вы можете использовать любой вариант для пакетного экспорта элементов из Exchange.

Экспорт элемента в настраиваемый формат

Можно использовать результаты вызова метода управляемого API EWS Item.Bind или провести синтаксический анализ результатов операции веб-служб Exchange GetItem в формате, который соответствует требованиям приложения. Используйте этот параметр при экспорте элементов, чтобы импортировать их в базу данных, CSV-файл или другой формат или систему. Элемент можно даже сохранить в виде XML-элемента веб-служб Exchange, что может оказаться полезным, поскольку многие системы обладают возможностью анализа XML. Рекомендуется использовать метод Item.Bind или операцию GetItem (без свойства Item.MimeContent), так как этот параметр позволяет указать, какие свойства следует экспортировать.

Экспорт элементов с полной точностью

Если вы хотите экспортировать элементы с полной точностью, можно использовать операцию веб-служб Exchange ExportItems. Операция ExportItems экспортирует каждый элемент в виде потока данных. Этот поток данных не используется для синтаксического анализа, но может служить резервной копией на уровне элементов, которую можно импортировать обратно в почтовый ящик Exchange. Вы можете включить множество элементов в каждый запрос ExportItems, но мы рекомендуем включать не более 100 элементов в каждый вызов. Так как управляемый API EWS не реализует операцию ExportItems, при использовании управляемого API EWS необходимо написать процедуру для отправки веб-запросов. Для получения метаданных об элементе можно использовать метод Item.Bind, чтобы индексировать и хранить сведения о потоке данных.

Рекомендуется использовать операцию ExportItems для экспорта элементов, которые планируется импортировать в почтовый ящик Exchange.

В следующем примере показано, как использовать операцию ExportItems. В этом примере идентификатор элемента сокращен для удобства чтения.

<?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="http://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"/>
  </soap:Header>
  <soap:Body>
    <m:ExportItems>
      <m:ItemIds>
        <t:ItemId Id="AAMkAGYzZjZmRiUsidkC+NAAAAY89GAAA="/>
      </m:ItemIds>
    </m:ExportItems>
  </soap:Body>
</soap:Envelope>

Сервер отвечает на запрос ExportItems элементом ExportItemsResponse, который содержит значение NoError элемента ResponseCode, указывающее, что элемент экспортирован. Ответ также содержит ИД экспортируемого элемента и поток данных с экспортируемым контентом. В следующем примере показан текст SOAP, содержащий экспортируемый элемент.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <m:ExportItemsResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="http://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 для экспорта в стандартные форматы файлов

Для получения представления элемента MIME можно использовать метод управляемого API EWS Item.Bind или операцию веб-служб Exchange GetItem. Поскольку Exchange не хранит содержимое MIME каждого элемента, необходимо преобразовать представление базы данных каждого элемента в поток MIME. Поскольку такое преобразование является ресурсоемким, мы не рекомендуем запрашивать поток MIME для элементов в больших масштабах. Также обратите внимание, что поток MIME содержит ограниченный набор свойств. Возможно, вам придется рассмотреть другие варианты, если набор не содержит необходимых свойств.

Использование управляемого API EWS для экспорта сообщения электронной почты в EML-файл и MHT-файл с помощью потока MIME

Outlook и другие распространенные приложения электронной почты могут открывать EML-файлы (.eml). В следующем примере показано, как экспортировать сообщение электронной почты с помощью потока MIME и использовать поток MIME для создания EML-файла и файла HTML MIME (.mht). Многие веб-браузеры поддерживают формат файлов HTML MIME. В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь может пройти проверку подлинности на сервере Exchange Server.

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);
        }
    }
}

Использование управляемого API EWS для экспорта встречи в файл iCal с помощью потока MIME

Outlook и другие распространенные приложения календаря могут открывать файлы в формате iCal (.ics). В следующем примере показано, как экспортировать встречу с помощью потока MIME и использовать поток MIME для создания файла iCal. Обратите внимание, что многие свойства не экспортируются с помощью потока MIME, в том числе свойства участников и вложений. Вы можете захватить другие свойства из веб-служб Exchange, запросив и сохранив их в файле iCal в качестве частных расширений. Эти частные расширения имеют префикс "x-".

В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь может пройти проверку подлинности на сервере Exchange Server. В этом примере также предполагается, что в папке календаря назначена встреча с темой "Финансовые прогнозы 2015".

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);
        }
    }
}

Использование управляемого API EWS для экспорта контакта в файл vCard с помощью потока MIME

Outlook и другие распространенные приложения для управления контактами могут открывать файлы в формате vCard (.vcf). В следующем примере показано, как экспортировать контакт с помощью потока MIME и использовать поток MIME для создания файла vCard. Вы можете захватить другие свойства из веб-служб Exchange, запросив и сохранив их в файле vCard в качестве частных расширений. Эти расширения имеют префикс "x-".

В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь может пройти проверку подлинности на сервере Exchange Server.

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. Вы можете импортировать контакты с помощью метода управляемого API EWS Contact.Save или операции веб-служб Exchange CreateItem.

Использование веб-служб Exchange для экспорта любого элемента с помощью потока MIME

Используйте операцию GetItem, чтобы получить поток MIME элемента. В следующем запросе GetItem показано, как запрашивать содержимое MIME элемента.

<?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: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="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" 
                         MinorVersion="0" 
                         MajorBuildNumber="893" 
                         MinorBuildNumber="17" 
                         Version="V2_10" 
                         xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" 
                         xmlns="http://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="http://schemas.microsoft.com/exchange/services/2006/messages"
                       xmlns:t="http://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.

См. также