Acessar um calendário como um delegado usando o EWS no Exchange

Saiba como acessar um calendário como um 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 usuário acesso delegado à pasta Calendário de um proprietário de caixa de correio. Em seguida, o representante pode criar solicitações de reunião em nome do proprietário da caixa de correio, criar compromissos, responder a solicitações de reunião e recuperar, atualizar e excluir reuniões da pasta Calendário do proprietário da caixa de correio, dependendo de suas permissões.

Como representante, você usa os mesmos métodos e operações para acessar a pasta Calendário de um proprietário de caixa de correio que você usa para acessar sua própria pasta Calendário. A principal diferença é que você precisa usar acesso explicito para localizar ou criar um item de calendário ou uma subpasta de calendário, e depois de identificar a ID do item ou a ID da pasta, você pode usar 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 um calendário como delegado

Se você quiser... Use este método de API Gerenciada do EWS… Use esta operação do EWS…
Criar uma reunião ou compromisso como representante
Appointment.Save onde o parâmetro FolderId fornece acesso explícito à pasta Calendário do proprietário da caixa de correio
CreateItem em que o elemento Mailbox especifica o EmailAddress do proprietário da caixa de correio
Criar várias reuniões ou compromissos como representante
ExchangeService.CreateItems em que o parâmetro FolderId fornece acesso explícito à pasta Calendário 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 localize um compromisso ou reunião como representante
ExchangeService.FindItems em que o parâmetro FolderId fornece acesso explícito à pasta Calendário 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 compromisso ou reunião como representante
Appointment.Bind
GetItem
Atualizar um compromisso ou reunião como representante
Appointment.Bind seguido por Appointment.Update
GetItem seguido por UpdateItem
Excluir um compromisso ou reunião como representante
Appointment.Bind seguido por Appointment.Delete
GetItem seguido por DeleteItem

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 Calendário de um proprietário de caixa de correio como representante, o usuário deve estar adicionado como um delegado com permissões para a pasta Calendário do proprietário da caixa de correio.

Um representante deve ter uma caixa de correio anexada à conta para atualizar o calendário de um proprietário de caixa de correio.

Se um representante precisar trabalhar apenas com solicitações de reunião e respostas, você poderá adicionar o representante à pasta Calendário, e use o valor de enumeração da API Gerenciada do EWS MeetingRequestsDeliveryScope.DelegatesAndSendInformationToMe padrão ou o valor do elemento EWS DeliverMeetingRequests de DelegatesAndSendInformationToMe para enviar as solicitações para o representante e mensagens informativas para o proprietário da caixa de correio. Em seguida, o delegado não precisa ter acesso à pasta caixa de entrada do proprietário da caixa de correio.

Criar uma reunião ou compromisso como representante usando a API Gerenciada do EWS

A API Gerenciada do EWS permite que você use o objeto de serviço do usuário delegado para criar itens de calendário para o proprietário da caixa de correio. Este exemplo mostra como usar o método Salvar para criar uma reunião e enviar solicitações de reunião aos participantes.

Este exemplo pressupõe que serviço é um objeto válido ExchangeService para o representante e que o representante recebeu as permissões apropriadas para a pasta Calendário do proprietário da caixa de correio.

private static void DelegateAccessCreateMeeting(ExchangeService service)
{
    Appointment meeting = new Appointment(service);
    // Set the properties on the meeting object to create the meeting.
    meeting.Subject = "Team building exercise";
    meeting.Body = "Let's learn to really work as a team and then have lunch!";
    meeting.Start = DateTime.Now.AddDays(2);
    meeting.End = meeting.Start.AddHours(4);
    meeting.Location = "Conference Room 12";
    meeting.RequiredAttendees.Add("sadie@contoso.com");
    meeting.ReminderMinutesBeforeStart = 60;
    // Save the meeting to the Calendar folder for 
    // the mailbox owner and send the meeting request.
    // This method call results in a CreateItem call to EWS.
    meeting.Save(new FolderId(WellKnownFolderName.Calendar, 
        "primary@contoso.com"), 
        SendInvitationsMode.SendToAllAndSaveCopy);
    // Verify that the meeting was created.
    Item item = Item.Bind(service, meeting.Id, new PropertySet(ItemSchema.Subject));
    Console.WriteLine("\nMeeting created: " + item.Subject + "\n");
}

Observe que, quando você salva o item, a chamada de método Salvar deve identificar a pasta Calendário do proprietário da caixa de correio. Se a pasta Calendário do proprietário da caixa de correio não for especificada, a solicitação de reunião será salva no calendário do representante e não na pasta Calendário do proprietário da caixa de correio. Você pode incluir a pasta Calendário do proprietário da caixa de correio na chamada de método Salvar de duas maneiras. Recomendamos que você crie uma instância do objeto FolderId usando o WellKnownFolderName e o endereço SMTP do proprietário da caixa de correio.

meeting.Save(new FolderId(WellKnownFolderName.Calendar,
    "primary@contoso.com"), SendInvitationsMode.SendToAllAndSaveCopy);

No entanto, você também pode Associar à pasta Calendário primeiro e, em seguida, usar a ID da pasta na chamada de método Salvar. No entanto, lembre-se de que isso cria uma chamada EWS extra.

    // Identify the mailbox owner's SMTP address
    // and bind to their Calendar folder.
    Mailbox primary = new Mailbox("primary@contoso.com"); 
    Folder primaryCalendar = Folder.Bind(service, 
        new FolderId(WellKnownFolderName.Calendar, primary)); 
…
    // Save the meeting to the Calendar folder for the mailbox owner and send the meeting request.
    meeting.Save(primaryCalendar.Id, 
        SendInvitationsMode.SendToAllAndSaveCopy);

Criar uma reunião ou compromisso como representante usando o EWS

O EWS permite que você use o objeto de serviço para o usuário delegado criar itens de calendário para o proprietário da caixa de correio. Este exemplo mostra como usar a operação CreateItem para criar uma reunião e enviar solicitações de reunião aos participantes.

Essa também é a solicitação XML que a API Gerenciada do EWS envia quando você usa o método Salvar para criar uma reunião ou compromisso como representante.

O cabeçalho SOAP foi removido do exemplo a seguir para fins de brevidade.

<?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:Body>
    <m:CreateItem SendMeetingInvitations="SendToAllAndSaveCopy">
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="calendar">
          <t:Mailbox>
            <t:EmailAddress>primary@contoso.com</t:EmailAddress>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:SavedItemFolderId>
      <m:Items>
        <t:CalendarItem>
          <t:Subject>Team building exercise</t:Subject>
          <t:Body BodyType="HTML">Let's learn to really work as a 
              team and then have lunch!</t:Body>
          <t:ReminderMinutesBeforeStart>60</t:ReminderMinutesBeforeStart>
          <t:Start>2014-03-09T23:26:33.756-05:00</t:Start>
          <t:End>2014-03-10T03:26:33.756-05:00</t:End>
          <t:Location>Conference Room 12</t:Location>
          <t:RequiredAttendees>
            <t:Attendee>
              <t:Mailbox>
                <t:EmailAddress>sadie@contoso.com</t:EmailAddress>
              </t:Mailbox>
            </t:Attendee>
          </t:RequiredAttendees>
        </t:CalendarItem>
      </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 de NoError, que indica que a reunião foi criada com êxito. A resposta também contém a ID do item da reunião recém-criada.

Pesquisar uma reunião ou compromisso como representante usando a API Gerenciada do EWS

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

static void DelegateAccessSearchWithFilter
    (ExchangeService service, SearchFilter filter)
{
    // Limit the result set to 10 items.
    ItemView view = new ItemView(10);
    view.PropertySet = new PropertySet(ItemSchema.Subject,
                                       ItemSchema.DateTimeReceived,
                                       EmailMessageSchema.IsRead);
    // Item searches do not support deep traversal.
    view.Traversal = ItemTraversal.Shallow;
    // Define the sort order.
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
    try
    {
        // Call FindItems to find matching calendar items. 
        // The FindItems parameters must denote the mailbox owner,
        // mailbox, and Calendar folder.
        // This method call results in a FindItem call to EWS.
        FindItemsResults<Item> results = service.FindItems(
        new FolderId(WellKnownFolderName.Calendar, 
            "primary@contoso.com"), 
            filter, 
            view);
        foreach (Item item in results.Items)
        {
            Console.WriteLine("Subject: {0}", item.Subject);
            Console.WriteLine("Id: {0}", item.Id.ToString());
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception while 
            enumerating results: {0}", ex.Message);
    }
}

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

Pesquisar uma reunião ou compromisso como representante usando o EWS

O EWS permite que você use o objeto de serviço para que o usuário delegado pesquise compromissos e reuniões que atendam a um conjunto de critérios de pesquisa. Este exemplo mostra como usar a operação FindItem para localizar reuniões na pasta Calendário do proprietário da caixa de correio que contém a palavra "compilando" no assunto.

Essa também é a solicitação XML que a API Gerenciada do EWS envia quando você usa o método FindItem para buscar uma reunião ou compromisso como representante.

<?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="building" />
        </t:Contains>
      </m:Restriction>
      <m:SortOrder>
        <t:FieldOrder Order="Descending">
          <t:FieldURI FieldURI="item:DateTimeReceived" />
        </t:FieldOrder>
      </m:SortOrder>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="calendar">
          <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 CalendarItem para todos os compromissos ou reuniões que atenderam aos critérios de pesquisa. Nesse caso, apenas uma reunião é encontrada.

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="10"
                         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:CalendarItem>
                <t:ItemId Id="IJpUAAA="
                          ChangeKey="DwAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAAAIKhS" />
                <t:Subject>Team building exercise</t:Subject>
                <t:DateTimeReceived>2014-03-04T21:27:22Z</t:DateTimeReceived>
              </t:CalendarItem>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

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

Obter, atualizar ou excluir itens de calendário como um delegado usando a API Gerenciada do EWS

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

Tabela 2. Métodos de API Gerenciada do EWS para trabalhar com compromissos e reuniões como delegado

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

Obter, atualizar ou excluir itens de calendário como um delegado usando o EWS

Você pode usar o EWS para obter, atualizar ou excluir uma reunião ou compromisso da mesma maneira que executa essas ações quando não estiver usando o acesso de representante. A única diferença é que o objeto de serviço é para o usuário delegado. A ID do item incluída na chamada de método GetItem identifica exclusivamente o item no repositório de caixas de correio, na pasta Calendário do proprietário da caixa de correio.

Tabela 3. Operações EWS para trabalhar com compromissos e reuniões como delegado

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

Confira também