Excluir anexos usando o EWS no Exchange

Saiba como excluir anexos de itens usando a API Gerenciada do EWS ou o EWS Exchange.

Você tem várias opções quando se trata de excluir anexos de arquivos e itens de itens usando a API Gerenciada do EWS. Você pode excluir todos os anexos da mensagem, excluir por um nome de arquivo ou excluir por posição na coleção. Para cada uma dessas opções, há um método AttachmentCollection.

Por outro lado, com o EWS, não importa se você está excluindo todos os anexos de um item ou apenas um, a sequência de operações é a mesma. Ao contrário da API Gerenciada do EWS, o EWS não inclui operações separadas para excluir com base no nome ou na posição na matriz de anexos.

Tabela 1. Métodos de API Gerenciada EWS e operações EWS para excluir anexos

Tarefa Método da API Gerenciada do EWS Operação do EWS
Exclua todos os anexos de um item.
Item.Bind, seguido por AttachmentCollection.Clear, seguido por EmailMessage.Update
GetItem seguido por DeleteAttachment
Exclua um anexo de um item por nome.
Item.Bind, seguido por AttachmentCollection.Remove, seguido por EmailMessage.Update
GetItem seguido por DeleteAttachment
Exclua um anexo de um item por posição na coleção.
Item.Bind, seguido por AttachmentCollection.RemoveAt, seguido por EmailMessage.Update
GetItem seguido por DeleteAttachment

Excluir todos os anexos de um email usando a API Gerenciada do EWS

O exemplo de código a seguir mostra como excluir todos os anexos de um email:

  1. Usando o método EmailMessage.Bind para vincular a uma mensagem de email existente e recuperar a coleção de Anexos.

  2. Usando o método AttachmentCollection.Clear para excluir todos os anexos do email.

  3. Usando o método EmailMessage.Update para salvar as alterações.

Este exemplo pressupõe que o serviço é um objeto ExchangeService válido, itemId é a ItemId da mensagem da qual os anexos serão excluídos e que o usuário foi autenticado para um servidor Exchange.

public static void DeleteAllAttachments(ExchangeService service, ItemId itemId)
{
    // Bind to an existing message by using its item ID and requesting its attachments collection.
    // This method results in a GetItem call to EWS.
    EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
    // Delete all attachments from the message.
    message.Attachments.Clear();
    // Save the updated message.
    // This method results in an DeleteAttachment call to EWS.
    message.Update(ConflictResolutionMode.AlwaysOverwrite);
}

Excluir um anexo pelo nome de um email usando a API Gerenciada do EWS

O exemplo de código a seguir mostra como excluir um anexo pelo nome:

  1. Usando o método EmailMessage.Bind para vincular a uma mensagem de email existente e recuperar a coleção de Anexos.

  2. Usando o método AttachmentCollection.Remove para excluir um anexo chamado FileAttachment.txt.

  3. Usando o método EmailMessage.Update para salvar as alterações.

Este exemplo pressupõe que o serviço é um objeto ExchangeService válido, itemId é o ItemId da mensagem da qual o anexo será excluído e que o usuário foi autenticado para um servidor Exchange.

public static void DeleteNamedAttachments(ExchangeService service, ItemId itemId)
{
    // Bind to an existing message by using its item ID and requesting its attachments collection.
    // This method results in a GetItem call to EWS.
    EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
    // Iterate through the attachments collection and delete the attachment named "FileAttachment.txt," if it exists.
    foreach (Attachment attachment in message.Attachments)
    {
        if (attachment.Name == "FileAttachment.txt")
        {
            message.Attachments.Remove(attachment);
            break;
        }
    }
    // Save the updated message.
    // This method results in an DeleteAttachment call to EWS.
    message.Update(ConflictResolutionMode.AlwaysOverwrite);
}

Excluir anexos por posição usando a API Gerenciada do EWS

O exemplo de código a seguir mostra como excluir um anexo por posição por:

  1. Usando o método EmailMessage.Bind para vincular a uma mensagem de email existente e recuperar a coleção de Anexos e a propriedade EmailMessage.HasAttachments.

  2. Usando o método AttachmentCollection.Remove para excluir o primeiro anexo da coleção.

  3. Usando o método EmailMessage.Update para salvar as alterações.

Este exemplo pressupõe que o serviço é um objeto ExchangeService válido, itemId é o ItemId da mensagem da qual o anexo será excluído e que o usuário foi autenticado para um servidor Exchange.

public static void DeleteAttachmentByPosition(ExchangeService service, ItemId itemId)
{
    // Bind to an existing message by using its item ID and requesting the HasAttachments property and the attachments collection.
    // This method results in a GetItem call to EWS.
    EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(EmailMessageSchema.HasAttachments, ItemSchema.Attachments));
    // Remove attachments using the zero-based index position of the attachment in the attachments collection.
    if (message.HasAttachments)
    {
        message.Attachments.RemoveAt(0);
    }
    // Save the updated message.
    // This method results in an DeleteAttachment call to EWS.
    message.Update(ConflictResolutionMode.AlwaysOverwrite);
}

Excluir anexos de um item usando o EWS

Para excluir anexos usando o EWS, primeiro você precisa recuperar a mensagem e o conjunto de anexos para determinar AttachmentId (GetAttachment e DeleteAttachment) do anexo a ser excluído. Depois de ter um ou mais valores AttachmentId para excluir, chame a operação DeleteAttachment para remover os anexos especificados da mensagem.

O exemplo de código a seguir mostra como usar a operação GetItem para obter uma mensagem de email e a coleção de anexos na mensagem. Essa também é a primeira solicitação XML que a API Gerenciada do EWS envia quando você usa a API Gerenciada do EWS para excluir todos os anexos de um email. Os valores de alguns atributos são reduzidos para a capacidade de leitura.

<?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="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Central Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:GetItem>
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:Attachments" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:ItemIds>
        <t:ItemId Id="uqE1AAA=" />
      </m:ItemIds>
    </m:GetItem>
  </soap:Body>
</soap:Envelope>

O servidor responde à solicitação GetItem com uma mensagem GetItemResponse que inclui um valor ResponseCode de NoError, que indica que o email foi recuperado com êxito e os valores AttachmentId dos anexos existentes.

<?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="939"
                         MinorBuildNumber="12"
                         Version="V2_11"
                         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:ItemId Id="uqE1AAA="
                        ChangeKey="CQAAABYAAAAFI5DJmZv+TLtyLOLIF1S5AAAXulcd" />
              <t:Attachments>
                <t:FileAttachment>
                  <t:AttachmentId Id="IpHLObE=" />
                  <t:Name>FileAttachment.txt</t:Name>
                </t:FileAttachment>
                <t:FileAttachment>
                  <t:AttachmentId Id="QuHSSmY=" />
                  <t:Name>SecondAttachment.txt</t:Name>
                </t:FileAttachment>
                <t:FileAttachment>
                  <t:AttachmentId Id="qf2KoPo=" />
                  <t:Name>ThirdAttachment.jpg</t:Name>
                </t:FileAttachment>
                <t:FileAttachment>
                  <t:AttachmentId Id="NFQMnMc=" />
                  <t:Name>FourthAttachment.txt</t:Name>
                </t:FileAttachment>
                <t:ItemAttachment>
                  <t:AttachmentId Id="jJvbLXQ=" />
                  <t:Name>Attached Message Item</t:Name>
                </t:ItemAttachment>
              </t:Attachments>
            </t:Message>
          </m:Items>
        </m:GetItemResponseMessage>
      </m:ResponseMessages>
    </m:GetItemResponse>
  </s:Body>
</s:Envelope>

Depois de determinar qual anexo excluir, chame a operação DeleteAttachment e inclua os valores AttachmentId dos anexos a ser excluídos.

<?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="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Central Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:DeleteAttachment>
      <m:AttachmentIds>
        <t:AttachmentId Id="IpHLObE=" />
        <t:AttachmentId Id="QuHSSmY=" />
        <t:AttachmentId Id="qf2KoPo=" />
        <t:AttachmentId Id="NFQMnMc=" />
        <t:AttachmentId Id="jJvbLXQ=" />
      </m:AttachmentIds>
    </m:DeleteAttachment>
  </soap:Body>
</soap:Envelope>

O servidor responde à solicitação DeleteAttachment com uma mensagem DeleteAttachmentResponse que inclui um valor ResponseCode de NoError para cada DeleteAttachmentResponseMessage, que indica que cada anexo foi excluído com êxito. Os valores de alguns atributos são reduzidos para a capacidade de leitura.

<?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="939"
                         MinorBuildNumber="12"
                         Version="V2_11"
                         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:DeleteAttachmentResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                                xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:DeleteAttachmentResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
        </m:DeleteAttachmentResponseMessage>
        <m:DeleteAttachmentResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
        </m:DeleteAttachmentResponseMessage>
        <m:DeleteAttachmentResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
        </m:DeleteAttachmentResponseMessage>
        <m:DeleteAttachmentResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
        </m:DeleteAttachmentResponseMessage>
        <m:DeleteAttachmentResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
        </m:DeleteAttachmentResponseMessage>
      </m:ResponseMessages>
    </m:DeleteAttachmentResponse>
  </s:Body>
</s:Envelope>

Confira também