Mover e copiar mensagens de email usando o EWS no Exchange

Saiba como mover e copiar mensagens de email usando a API Gerenciada do EWS ou o EWS no Exchange.

Você pode usar a API Gerenciada do EWS ou o EWS para mover e copiar mensagens de email em uma caixa de correio.

Tabela 1. Métodos de API Gerenciada do EWS e operações EWS para mover e copiar mensagens de email

Tarefa Método da API Gerenciada do EWS Operação do EWS
Mover uma mensagem de email
EmailMessage.Move
MoveItem
Copiar uma mensagem de email
EmailMessage.Copy
CopyItem

É importante observar que quando você move ou copia uma mensagem de email para uma pasta diferente, um novo item é criado na nova pasta com uma ID de item exclusiva e a mensagem original é excluída. Se você estiver movendo ou copiando uma mensagem de email entre duas pastas na mesma caixa de correio, o novo item será retornado na resposta, o que lhe dará acesso à nova ID do item. No entanto, se você estiver movendo ou copiando uma mensagem de email entre duas caixas de correio ou entre uma caixa de correio e uma pasta pública, o novo item não será retornado na resposta. Para acessar a mensagem movida nesse cenário, use o método FindItems da API Gerenciada do EWS ou a operação EWS FindItem , crie uma definição de propriedade estendida para a propriedade PidTagSearchKey (0x300B0102) ou crie e defina uma propriedade estendida personalizada e procure a propriedade estendida personalizada na nova pasta.

Excluir uma mensagem de email é diferente de mover um item para a pasta Itens Excluídos. Se você usar o método EWS Managed API Item.Delete ou a operação EWS DeleteItem , o item especificado na solicitação será removido da pasta original e uma cópia será colocada na pasta Itens Excluídos com uma nova ID de item. Ao contrário de quando você move ou copia qualquer item, o novo item não é retornado no método Delete ou na resposta da operação DeleteItem . As etapas envolvidas na exclusão de um email usando a API Gerenciada do EWS ou o EWS são as mesmas para excluir qualquer item genérico do repositório exchange.

Mover uma mensagem de email usando a API Gerenciada do EWS

O exemplo de código a seguir mostra como usar o método EmailMessage.Move para mover uma mensagem de email existente de uma pasta para outra.

Este exemplo pressupõe que o serviço seja um objeto ExchangeService válido e que ItemId é a Id da mensagem de email para mover ou copiar.

// 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.");

Mover uma mensagem de email usando o EWS

O exemplo de código a seguir mostra como usar a operação MoveItem para mover uma mensagem de email para a pasta Junk Email.

Essa também é a solicitação XML enviada pela API Gerenciada do EWS ao chamar o método Move . Os valores de alguns atributos e elementos foram reduzidos para legibilidade.

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

O servidor responde à solicitação MoveItem com uma mensagem MoveItemResponse que inclui um valor ResponseCode de NoError, que indica que a mensagem de email foi movida com êxito. A resposta também inclui o ItemId para a mensagem de email na nova pasta, que é importante armazenar porque o ItemId é diferente na nova pasta.

Copiar uma mensagem de email usando a API Gerenciada do EWS

O exemplo de código a seguir mostra como usar o método EmailMessage.Copy para copiar uma mensagem de email existente de uma pasta para outra.

Este exemplo pressupõe que o serviço seja um objeto ExchangeService válido e que ItemId é a Id da mensagem de email a ser copiada. Os valores de alguns parâmetros foram abreviados para legibilidade.

// 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.");

Copiar uma mensagem de email usando o EWS

O exemplo de código a seguir mostra como usar a operação CopyItem para copiar uma mensagem de email para uma pasta diferente na mesma caixa de correio enviando o ItemId da mensagem de email para mover e especificando a pasta de destino no elemento ToFolderId .

Essa também é a solicitação XML enviada pela API Gerenciada do EWS ao chamar o método Copy . Os valores de alguns atributos e elementos foram reduzidos para legibilidade.

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

O servidor responde à solicitação CopyItem com uma mensagem CopyItemResponse que inclui um valor ResponseCode de NoError, que indica que a mensagem de email foi copiada com êxito. A resposta também inclui o ItemId para a mensagem de email na nova pasta, que é importante armazenar porque o ItemId é diferente na nova pasta.

Confira também