Compartilhar via


Acessar uma série recorrente usando o EWS no Exchange

Saiba como acessar itens de calendário em uma série recorrente usando a API Gerenciada do EWS ou o EWS no Exchange.

Uma série recorrente de compromissos ou reuniões é composta por um mestre recorrente, uma série de ocorrências em uma série que se repetem de acordo com um padrão definido e, opcionalmente, conjuntos de ocorrências que foram alteradas e que foram excluídas. Você pode usar a API Gerenciada do EWS ou o EWS para acessar itens de calendário em uma série recorrente. Isso permite que você:

  • Verifique se um item de calendário associado a uma ID de item é um mestre recorrente, uma ocorrência em uma série ou uma exceção a uma série.

  • Pesquise sua pasta de calendário em busca de compromissos de recorrência.

  • Obter itens de calendário de recorrência relacionados

  • Iterar por meio de ocorrências em uma série, exceções de ocorrência ou exclusões de ocorrência.

Obter uma coleção de itens de calendário recorrentes usando a API Gerenciada do EWS

Se você quiser recuperar uma coleção de compromissos, poderá usar o método ExchangeService.FindAppointments para recuperar todos os compromissos entre uma determinada data de início e término e adicionar todos os itens de calendário com um tipo de compromisso de Ocorrência ou Exceção a uma coleção, conforme mostrado no exemplo a seguir.

Este exemplo pressupõe que você se autenticou em um servidor Exchange e adquiriu um objetoExchangeService chamado service.

public static Collection<Appointment> FindRecurringCalendarItems(ExchangeService service, 
                                                                    DateTime startSearchDate, 
                                                                    DateTime endSearchDate)
{
    // Instantiate a collection to hold occurrences and exception calendar items.
    Collection<Appointment> foundAppointments = new Collection<Appointment>();
    // Create a calendar view to search the calendar folder and specify the properties to return.
    CalendarView calView = new CalendarView(startSearchDate, endSearchDate);
    calView.PropertySet = new PropertySet(BasePropertySet.IdOnly, 
                                            AppointmentSchema.Subject, 
                                            AppointmentSchema.Start, 
                                            AppointmentSchema.IsRecurring, 
                                            AppointmentSchema.AppointmentType);
    // Retrieve a collection of calendar items.
    FindItemsResults<Appointment> findResults = service.FindAppointments(WellKnownFolderName.Calendar, calView);
    // Add all calendar items in your view that are occurrences or exceptions to your collection.
    foreach (Appointment appt in findResults.Items)
    {
        if (appt.AppointmentType == AppointmentType.Occurrence || appt.AppointmentType == AppointmentType.Exception)
        {
            foundAppointments.Add(appt);
        }
        else
        {
            Console.WriteLine("Discarding calendar item of type {0}.", appt.AppointmentType);
        }
    }
    return foundAppointments;
}

Observe que os itens de calendário mestre recorrentes não são retornados em uma chamada para FindAppointments. Se você quiser recuperar mestres recorrentes ou quiser uma abordagem mais geral para recuperar itens de calendário, precisará usar ExchangeService.FindItems. Em seguida, você pode usar um filtro de pesquisa para recuperar apenas itens com uma data de início maior ou igual a uma data escolhida e uma exibição de item para limitar o número de itens a serem retornados. Observe que um mestre recorrente com uma data de início anterior à data de início em sua pesquisa não será encontrado, mesmo que ocorram ocorrências nesse intervalo.

Este exemplo pressupõe que você se autenticou em um servidor Exchange e adquiriu um objetoExchangeService chamado service.

public static Collection<Appointment> FindCalendarItemsByAppointmentType(ExchangeService service, 
                                                                         AppointmentType myAppointmentType, 
                                                                         DateTime startSearchDate)
{
    Collection<Appointment> foundAppointments = new Collection<Appointment>();
    // Create a search filter based on the start search date.
    SearchFilter.SearchFilterCollection searchFilter = new SearchFilter.SearchFilterCollection();
    searchFilter.Add(new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, startSearchDate));
    // Create an item view to specify which properties to return.
    ItemView view = new ItemView(20);
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly, 
                                       AppointmentSchema.Subject, 
                                       AppointmentSchema.Start, 
                                       AppointmentSchema.AppointmentType,
                                       AppointmentSchema.IsRecurring);
    // Get the appointment items from the server with the properties we specified.
    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Calendar, searchFilter, view);
    // Add each of the appointments of the type you want to the collection.
    foreach (Item item in findResults.Items)
    {
        Appointment appt = item as Appointment;
        if (appt.AppointmentType == myAppointmentType)
        {
            foundAppointments.Add(appt);
        }
    }
    return foundAppointments;
}

Às vezes você tem uma peça do quebra-cabeça, mas para resolvê-lo você precisa do resto das peças. Se você tiver a ID do item para um item de calendário de recorrência, poderá obter as outras peças necessárias usando uma das várias propriedades ou métodos de API Gerenciada do EWS.

Tabela 1. Propriedade ou método da API Gerenciada do EWS a ser usado para obter itens de calendário de recorrência relacionados

Se você tiver a ID do item para... Você pode obter... Usando o...
O item de calendário mestre recorrente
A primeira ocorrência em uma série
A última ocorrência em uma série
As exceções a uma série
Os compromissos excluídos em uma série
Qualquer ocorrência (dado seu índice)
Propriedade Appointment.FirstOccurrence
Propriedade Appointment.LastOccurrence
Propriedade Appointment.ModifiedOccurrences
Propriedade Appointment.DeletedOccurrences
Método Appointment.BindToOccurrence
Uma única ocorrência em uma série
O mestre recorrente
Método Appointment.BindToRecurringMaster
Qualquer item de calendário (um objeto Appointment )
O valor de enumeração de tipo de compromisso
Propriedade Appointment.AppointmentType

O exemplo de código a seguir mostra como obter um mestre recorrente, a primeira ou última ocorrência em uma série ou uma ocorrência dada a seu índice.

Este exemplo pressupõe que você se autenticou em um servidor Exchange e adquiriu um objetoExchangeService chamado service.

public static void GetRelatedRecurrenceCalendarItems(ExchangeService service, ItemId itemId)
{
    Appointment calendarItem = Appointment.Bind(service, itemId, new PropertySet(AppointmentSchema.AppointmentType));
    Appointment recurrMaster = new Appointment(service);
    PropertySet props = new PropertySet(AppointmentSchema.AppointmentType,
                                        AppointmentSchema.Subject,
                                        AppointmentSchema.FirstOccurrence,
                                        AppointmentSchema.LastOccurrence,
                                        AppointmentSchema.ModifiedOccurrences,
                                        AppointmentSchema.DeletedOccurrences);
    // If the item ID is not for a recurring master, retrieve the recurring master for the series.
    switch (calendarItem.AppointmentType)
    {
        // Calendar item is a recurring master so use Appointment.Bind
        case AppointmentType.RecurringMaster:
            recurrMaster = Appointment.Bind(service, itemId, props);
            break;
        // The calendar item is a single instance meeting, so there are no instances to modify or delete.
        case AppointmentType.Single:
            Console.WriteLine("Item id must reference a calendar item that is part of a recurring series.");
            return;
        // The calendar item is an occurrence in the series, so use BindToRecurringMaster.
        case AppointmentType.Occurrence:
            recurrMaster = Appointment.BindToRecurringMaster(service, itemId, props);
            break;
        // The calendar item is an exception to the series, so use BindToRecurringMaster.                
        case AppointmentType.Exception:
            recurrMaster = Appointment.BindToRecurringMaster(service, itemId, props);
            break;
    }
    // View the first occurrence, last occurrence, and number of modified and deleted occurrences associated with the recurring master.
    Console.WriteLine("Information for the {0} recurring series:", recurrMaster.Subject);
    Console.WriteLine("The start time for the first appointment with id \t{0} was on \t{1}.", 
                        recurrMaster.FirstOccurrence.ItemId.ToString().Substring(144), 
                        recurrMaster.FirstOccurrence.Start.ToString());
    Console.WriteLine("The start time for the last appointment with id \t{0} will be on \t{1}.", 
                        recurrMaster.LastOccurrence.ItemId.ToString().Substring(144), 
                        recurrMaster.LastOccurrence.Start.ToString());
    Console.WriteLine("There are {0} modified occurrences and {1} deleted occurrences.", 
                        recurrMaster.ModifiedOccurrences == null ? "no" : recurrMaster.ModifiedOccurrences.Count.ToString(), 
                        recurrMaster.DeletedOccurrences == null ? "no" : recurrMaster.DeletedOccurrences.Count.ToString());
    // Bind to the first occurrence of a series by using its index.
    Appointment firstOccurrence = Appointment.BindToOccurrence(service, 
                                                                recurrMaster.Id, 
                                                                1, // Index of first item is 1, not 0.
                                                                new PropertySet(AppointmentSchema.AppointmentType,
                                                                                AppointmentSchema.Start));
    Console.WriteLine("Compare the start times for a recurring master's first occurrence " + 
                        "and the occurrence found at index 1 using the BindToOccurrence method:");
    Console.WriteLine("The appointment at index 1 has a start time of\t\t\t\t {0}\n" +
                        "Which matches that of the first occurrence on the recurring master: \t {1}",
                        firstOccurrence.Start.ToString(),
                        recurrMaster.FirstOccurrence.Start.ToString());
}

Acessar itens de calendário em uma série recorrente usando o EWS

Acessar itens de calendário em uma série recorrente é muito semelhante ao acesso a instâncias individuais de itens de calendário. Você usa uma solicitação de operação GetItem , especificando as propriedades desejadas, com o OccurrenceItemId da instância de nomeação de que você precisa. O OccurrenceItemId contém o ItemID do mestre recorrente da ocorrência, bem como seu valor de índice na série.

O XML a seguir mostra a solicitação GetItem usada para retornar uma ocorrência em uma série especificada por seu índice. Observe que o ItemID do mestre recorrente foi abreviado 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="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2010" />
  </soap:Header>
  <soap:Body>
    <m:GetItem>
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="calendar:CalendarItemType" />
          <t:FieldURI FieldURI="calendar:Start" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:ItemIds>
        <t:OccurrenceItemId RecurringMasterId="AAMkA" InstanceIndex="1" />
      </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 criado com êxito e o ItemId da mensagem recém-criada.

Confira também