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


Перемещение и копирование сообщений электронной почты с помощью EWS в Exchange

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

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

Таблица 1. Методы управляемого API EWS и операции EWS для перемещения и копирования сообщений электронной почты

Задача Метод управляемого API EWS Операция EWS
Перемещение сообщения электронной почты
EmailMessage.Move
MoveItem
Копирование сообщения электронной почты
EmailMessage.Copy
CopyItem

Важно отметить, что при перемещении или копировании сообщения электронной почты в другую папку создается новый элемент с уникальным идентификатором элемента, а исходное сообщение удаляется. При перемещении или копировании сообщения электронной почты между двумя папками в одном почтовом ящике новый элемент возвращается в ответе, что дает доступ к идентификатору нового элемента. Однако при перемещении или копировании сообщения электронной почты между двумя почтовыми ящиками или между почтовым ящиком и общедоступной папкой новый элемент не возвращается в ответе. Чтобы получить доступ к перемещенному сообщению в этом сценарии, используйте метод FindItems управляемого API EWS или операцию EWS FindItem , создайте определение расширенного свойства для свойства PidTagSearchKey (0x300B0102) или создайте и задайте пользовательское расширенное свойство, а затем выполните поиск пользовательского расширенного свойства в новой папке.

Удаление сообщения электронной почты отличается от перемещения элемента в папку Удаленные. При использовании метода EWS Managed API Item.Delete или операции EWS DeleteItem элемент, указанный в запросе, удаляется из исходной папки, а копия помещается в папку "Удаленные" с новым идентификатором элемента. В отличие от перемещения или копирования любого элемента новый элемент не возвращается в методе Delete или ответе операции DeleteItem . Действия, связанные с удалением электронной почты с помощью управляемого API EWS или EWS , совпадают с действиями по удалению любого универсального элемента из хранилища Exchange.

Перемещение сообщения электронной почты с помощью управляемого API EWS

В следующем примере кода показано, как использовать метод EmailMessage.Move для перемещения существующего сообщения электронной почты из одной папки в другую.

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

// 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 для перемещения сообщения электронной почты в папку Нежелательная Email.

Это также XML-запрос, который отправляется управляемым API EWS при вызове метода Move . Для удобства значения некоторых атрибутов и элементов были сокращены.

<?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>

Сервер отвечает на запрос MoveItemсообщением MoveItemResponse , которое содержит значение ResponseCodeNoError, указывающее, что сообщение электронной почты было успешно перемещено. Ответ также включает ItemId для сообщения электронной почты в новой папке, который важно сохранить, так как ItemId отличается в новой папке.

Копирование сообщения электронной почты с помощью управляемого API EWS

В следующем примере кода показано, как с помощью метода EmailMessage.Copy скопировать существующее сообщение электронной почты из одной папки в другую.

В этом примере предполагается, что служба является допустимым объектом ExchangeService , а ItemIdидентификатором копируемого сообщения электронной почты. Значения некоторых параметров сокращены для удобства чтения.

// 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 .

Это также XML-запрос, который отправляется управляемым API EWS при вызове метода Copy . Для удобства значения некоторых атрибутов и элементов были сокращены.

<?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>

Сервер отвечает на запрос CopyItem сообщением CopyItemResponse , которое содержит значение ResponseCodeNoError, указывающее, что сообщение электронной почты было успешно скопировано. Ответ также включает ItemId для сообщения электронной почты в новой папке, который важно сохранить, так как ItemId отличается в новой папке.

См. также