Acessar o e-mail como um representante usando o EWS no Exchange

Saiba como acessar o email como delegado usando a API Gerenciada do EWS ou o EWS no Exchange.

Você pode usar a API Gerenciada do EWS ou o EWS para dar a um delegado de usuário acesso à pasta Caixa de Entrada do proprietário de uma caixa de correio. Em seguida, o delegado pode criar solicitações de reunião em nome do proprietário da caixa de correio, pesquisar por email e recuperar, atualizar e excluir email da pasta Caixa de Entrada do proprietário da caixa de correio, dependendo de suas permissões.

Como delegado, você usa os mesmos métodos e operações para acessar a pasta Caixa de Entrada do proprietário de uma caixa de correio que você usa para acessar uma pasta caixa de entrada sem acesso de delegado. A diferença main é que você precisa usar o acesso explícito para localizar ou criar um item de email e, depois de identificar a ID do item, você pode usar o acesso implícito para obter, atualizar ou excluir o item.

Tabela 1. Métodos de API Gerenciada do EWS e operações EWS para acessar email como delegado

Se você quiser... Use este método de API Gerenciada do EWS… Use esta operação do EWS…
Criar e enviar um email como delegado
EmailMessage.Save onde o parâmetro FolderId fornece acesso explícito à pasta Rascunhos do proprietário da caixa de correio
EmailMessage.SendAndSaveCopy onde o parâmetro FolderId fornece acesso explícito à pasta Itens Enviados do proprietário da caixa de correio
CreateItem em que o elemento Mailbox especifica o EmailAddress do proprietário da caixa de correio
SendItem onde o elemento Caixa de Correio especifica o EmailAddress do proprietário da caixa de correio
Criar várias mensagens de email como delegado
ExchangeService.CreateItems em que o parâmetro FolderId fornece acesso explícito à pasta Caixa de Entrada do proprietário da caixa de correio
CreateItem em que o elemento Mailbox especifica o EmailAddress do proprietário da caixa de correio
Pesquise ou encontre um email como delegado
ExchangeService.FindItems em que o parâmetro FolderId fornece acesso explícito à pasta Caixa de Entrada do proprietário da caixa de correio
FindItem em que o elemento Caixa de Correio especifica o EmailAddress do proprietário da caixa de correio
Obter um email como delegado
EmailMessage.Bind
GetItem
Atualizar um email como delegado
EmailMessage.Bind seguido por EmailMessage.Update
GetItem seguido por UpdateItem
Excluir um email como delegado
EmailMessage.Bind seguido por EmailMessage.Delete
GetItem seguido por DeleteItem

Tenha as seguintes coisas em mente ao trabalhar com emails como delegado:

  • Se um delegado precisar trabalhar apenas com solicitações e respostas de reunião, o delegado não precisará de acesso à pasta Caixa de Entrada. Para obter mais informações, consulte tarefas de pré-requisito para acessar calendários como delegado.

  • Quando um destinatário recebe uma mensagem enviada em nome de um proprietário de caixa de correio, o remetente aparece como "Delegado em nome do proprietário da caixa de correio".

Observação

Nos exemplos de código deste artigo, primary@contoso.com está o proprietário da caixa de correio.

Tarefas de pré-requisito

Antes que um usuário possa acessar a pasta Caixa de Entrada do proprietário da caixa de correio como delegado, o usuário deve ser adicionado como um delegado com permissões para a pasta Caixa de Entrada do proprietário da caixa de correio.

Criar e enviar um email como delegado usando a API Gerenciada do EWS

A API Gerenciada do EWS permite que você use o objeto de serviço para o usuário delegado criar e enviar email em nome do proprietário da caixa de correio. Este exemplo mostra como usar o método Salvar para salvar a mensagem na pasta Rascunhos do proprietário da caixa de correio e, em seguida, o método SendAndSaveCopy para enviar o email e salvar a mensagem na pasta Itens Enviados do proprietário da caixa de correio.

Este exemplo pressupõe que o serviço seja um objeto ExchangeService válido para o delegado e que o delegado recebeu as permissões apropriadas para a pasta Caixa de Entrada, Rascunhos e Itens Enviados do proprietário da caixa de correio.

public static void DelegateAccessCreateEmail(ExchangeService service)
{
    // Create an email message and provide it with connection 
    // configuration information by using an ExchangeService 
    // object named service.
    EmailMessage message = new EmailMessage(service);
    // Set properties on the email message.
    message.Subject = "Company Soccer Team";
    message.Body = "Are you interested in joining?";
    message.ToRecipients.Add("sadie@contoso.com");
    // Save the email to the mailbox owner's Drafts folder.
    // This method call results in a CreateItem call to EWS.
    // The FolderId parameter contains the context for the 
    // mailbox owner's Inbox folder. Any additional actions 
    // taken on this message will be performed in the mailbox 
    // owner's mailbox. 
    message.Save(new FolderId(WellKnownFolderName.Drafts, new Mailbox("primary@contoso.com")));
    // Send the email and save the message in the mailbox owner's 
    // Sent Items folder.
    // This method call results in a SendItem call to EWS.
    message.SendAndSaveCopy(new FolderId(WellKnownFolderName.SentItems, new Mailbox("primary@contoso.com")));
    Console.WriteLine("An email with the subject '" + message.Subject + "' has been sent to '" 
    + message.ToRecipients[0] + "' and saved in the Sent Items folder of the mailbox owner.");
}

Criar e enviar um email como delegado usando o EWS

O EWS permite que você use o objeto de serviço para o usuário delegado criar e enviar email em nome do proprietário da caixa de correio. Este exemplo mostra como usar a operação CreateItem para criar um email e a operação SendItem para enviar a hora e salvá-la na pasta Itens Enviados do proprietário da caixa de correio.

Essa também é a primeira solicitação XML que a API Gerenciada do EWS envia quando você usa o método Save para criar e enviar um email.

<?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" />
  </soap:Header>
  <soap:Body>
    <m:CreateItem MessageDisposition="SaveOnly">
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="drafts">
          <t:Mailbox>
            <t:EmailAddress>primary@contoso.com</t:EmailAddress>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:SavedItemFolderId>
      <m:Items>
        <t:Message>
          <t:Subject>Company Soccer Team</t:Subject>
          <t:Body BodyType="HTML">Are you interested in joining?</t:Body>
          <t:ToRecipients>
            <t:Mailbox>
              <t:EmailAddress>sadie@contoso.com</t:EmailAddress>
            </t:Mailbox>
          </t:ToRecipients>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

O servidor responde à solicitação CreateItem com uma mensagem CreateItemResponse que inclui um valor de elemento ResponseCode do NoError, que indica que o email foi criado e salvo com êxito. A resposta também contém a ID do item do email recém-criado.

O valor ItemId foi abreviado para legibilidade.

<?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="893"
                         MinorBuildNumber="17"
                         Version="V2_10"
                         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>
    <m:CreateItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                          xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:CreateItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Items>
            <t:Message>
              <t:ItemId Id="iNRaAAA="
                        ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQPU" />
            </t:Message>
          </m:Items>
        </m:CreateItemResponseMessage>
      </m:ResponseMessages>
    </m:CreateItemResponse>
  </s:Body>
</s:Envelope>

Em seguida, use a operação SendItem para enviar a mensagem em nome do proprietário da caixa de correio e salvá-la na pasta Itens Enviados do proprietário da caixa de correio.

O valor ItemId foi abreviado para legibilidade.

<?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" />
  </soap:Header>
  <soap:Body>
    <m:SendItem SaveItemToFolder="true">
      <m:ItemIds>
        <t:ItemId Id="iNRaAAA="
                  ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQPU" />
      </m:ItemIds>
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="sentitems">
          <t:Mailbox>
            <t:EmailAddress>primary@contoso.com</t:EmailAddress>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:SavedItemFolderId>
    </m:SendItem>
  </soap:Body>
</soap:Envelope>

O servidor responde à solicitação SendItem com uma mensagem SendItemResponse que inclui um valor de elemento ResponseCode do NoError, o que indica que o email foi enviado e salvo na pasta Sent Items do proprietário da caixa de correio com êxito.

<?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="893"
                         MinorBuildNumber="17"
                         Version="V2_10"
                         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>
    <m:SendItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:SendItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
        </m:SendItemResponseMessage>
      </m:ResponseMessages>
    </m:SendItemResponse>
  </s:Body>
</s:Envelope>

Pesquise um email como delegado usando a API Gerenciada do EWS

Para pesquisar um email, você deve usar um dos métodos ExchangeService.FindItems que inclui um parâmetro FolderId , para que você possa especificar a pasta Caixa de Entrada do proprietário da caixa de correio.

static void DelegateAccessSearchEmailWithFilter(ExchangeService service)
{
    // Limit the result set to 10 items.
    ItemView view = new ItemView(10);
    // Define the search filter.
    SearchFilter.ContainsSubstring filter = new SearchFilter.ContainsSubstring(ItemSchema.Subject, 
        "soccer", ContainmentMode.Substring, ComparisonMode.IgnoreCase);
    view.PropertySet = new PropertySet(ItemSchema.Subject,
                                       ItemSchema.DateTimeReceived,
                                       EmailMessageSchema.IsRead);
    // Item searches do not support deep traversal.
    view.Traversal = ItemTraversal.Shallow;
    // Sorting.
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
    try
    {
        // Call FindItems to find matching Inbox items. 
        // The parameters of FindItems must denote the mailbox owner,
        // mailbox, and Inbox folder.
        // This call results in a FindItem call to EWS.
        FindItemsResults<Item> results = service.FindItems(new 
            FolderId(WellKnownFolderName.Inbox, "primary@contoso.com"), 
            filter, view);
        foreach (Item item in results.Items)
        {
            Console.WriteLine("Subject: {0}", item.Subject);
            Console.WriteLine("Id: {0}", item.Id.ToString());
            if (item is EmailMessage)
            {
                EmailMessage message = item as EmailMessage;
                Console.WriteLine("Read: {0}", message.IsRead.ToString());
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception while enumerating results: {0}", ex.Message);
    }
}

Depois que a chamada FindItems retornar uma resposta com uma ID, você pode obter, atualizar ou excluir esse email usando a ID e o acesso implícito - e você não precisa especificar o endereço SMTP do proprietário da caixa de correio.

Pesquise por um email como delegado usando o EWS

O EWS permite que você use o objeto de serviço para o usuário delegado pesquisar emails que atendam a um conjunto de critérios de pesquisa. Este exemplo mostra como usar a operação FindItem para localizar mensagens na pasta Caixa de Entrada do proprietário que contêm a palavra "futebol" no assunto.

Essa também é a solicitação XML que a API Gerenciada do EWS envia quando você procura por um email.

<?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" />
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:Subject" />
          <t:FieldURI FieldURI="item:DateTimeReceived" />
          <t:FieldURI FieldURI="message:IsRead" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="10"
                             Offset="0"
                             BasePoint="Beginning" />
      <m:Restriction>
        <t:Contains ContainmentMode="Substring"
                    ContainmentComparison="IgnoreCase">
          <t:FieldURI FieldURI="item:Subject" />
          <t:Constant Value="soccer" />
        </t:Contains>
      </m:Restriction>
      <m:SortOrder>
        <t:FieldOrder Order="Descending">
          <t:FieldURI FieldURI="item:DateTimeReceived" />
        </t:FieldOrder>
      </m:SortOrder>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="inbox">
          <t:Mailbox>
            <t:EmailAddress>primary@contoso.com</t:EmailAddress>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:ParentFolderIds>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

O servidor responde à solicitação FindItem com uma FindItemResponse mensagem que inclui um valor de elemento ResponseCode de NoError, que indica que a pesquisa foi concluída com êxito. A resposta contém um elemento Message para todos os emails que atendem aos critérios de pesquisa. Nesse caso, apenas um email é encontrado.

O valor do elemento ItemId foi reduzido para legibilidade.

<?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="893"
                         MinorBuildNumber="17"
                         Version="V2_10"
                         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>
    <m:FindItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="1"
                        TotalItemsInView="1"
                        IncludesLastItemInRange="true">
            <t:Items>
              <t:Message>
                <t:ItemId Id="iNwoAAA="
                          ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQuu" />
                <t:Subject>Soccer team</t:Subject>
                <t:DateTimeReceived>2014-03-10T06:16:55Z</t:DateTimeReceived>
                <t:IsRead>false</t:IsRead>
              </t:Message>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

Agora que você tem o ItemId para o email que atende aos seus critérios, você pode obter, atualizar ou excluir esse email usando o ItemId e o acesso implícito - e você não precisa especificar o endereço SMTP do proprietário da caixa de correio.

Obter, atualizar ou excluir itens de email como delegado usando a API Gerenciada do EWS

Você pode usar a API Gerenciada do EWS para obter, atualizar ou excluir um email da mesma forma que executa essas ações quando não estiver usando o acesso de delegado. A única diferença é que o objeto ExchangeService é para o usuário delegado. A ID do item incluída na chamada do método Bind identifica exclusivamente o item no repositório de caixas de correio, na pasta Caixa de Entrada do proprietário da caixa de correio.

Tabela 2. Métodos de API Gerenciada do EWS trabalhando com email como delegado

Tarefa Método da API Gerenciada do EWS Exemplo de código
Obter um email
Vincular
Gerenciar um item usando a API Gerenciada do EWS
Atualizar um email
Bind seguido por Update
Atualizar um item usando a API Gerenciada do EWS
Excluir um email
Bind seguido por Delete
Excluir um item usando a API Gerenciada do EWS

Obter, atualizar ou excluir itens de email como delegado usando o EWS

Você pode usar a API Gerenciada do EWS para obter, atualizar ou excluir um email da mesma forma que executa essas ações quando não estiver usando o acesso de delegado. A única diferença é que o objeto de serviço é para o usuário delegado. A ID do item incluída na solicitação GetItem identifica exclusivamente o item no repositório de caixas de correio, na pasta Caixa de Entrada do proprietário da caixa de correio.

Tabela 3. Operações EWS para trabalhar com email como delegado

Tarefa Operação do EWS Exemplo de código
Obter um email
GetItem
Get um item usando EWS
Atualizar um email
GetItem seguido por UpdateItem
Atualizar um item usando o EWS
Excluir um email
GetItem seguido por DeleteItem
Excluir um item usando o EWS

Confira também