Adicionar compromissos usando a representação do Exchange

Saiba como usar a representação com a API Gerenciada do EWS ou o EWS no Exchange adicionar compromissos aos calendários dos usuários.

Você pode criar um aplicativo de serviço que insere compromissos diretamente em um calendário do Exchange usando uma conta de serviço que tem a função ApplicationImpersonationhabilitada. Quando você usa a representação, o aplicativo age como o usuário; é como se o usuário tivesse adicionado o compromisso ao calendário usando um cliente como Outlook.

Ao usar a representação, tenha em mente o seguinte:

  • Seu objeto ExchangeService deve estar vinculado à conta de serviço. Você pode usar o mesmo objeto ExchangeService para representar várias contas alterando a propriedade ImpersonatedUserId para cada conta que você deseja representar.
  • Qualquer item salvo em uma conta representada só pode ser usado uma vez. Se você deseja salvar o mesmo compromisso em várias contas, por exemplo, você precisa criar um objeto Appointment para cada conta.

Pré-requisitos

Seu aplicativo precisa de uma conta a ser usada para se conectar ao servidor Exchange para poder usar a representação. Sugerimos que você use uma conta de serviço para o aplicativo que recebeu a função Representação de Aplicativo para as contas que ela acessará. Para obter mais informações, consulte Configurar a representação

Adicionar compromissos usando a representação com a API Gerenciada do EWS

O exemplo a seguir adiciona um compromisso ou reunião ao calendário de uma ou mais contas do Exchange. O método usa três parâmetros.

  • service— um objeto ExchangeService associado à conta do aplicativo de serviço no servidor Exchange.
  • emailAddresses — um objeto System.List que contém uma lista de cadeias de caracteres de endereço de email SMTP.
  • factory — um objeto que implementa a interface IAppointmentFactory. Essa interface tem um método, GetAppointment, que tem um objeto ExchangeService como parâmetro e retorna um objeto Appointment. A interfaceIAppointmentFactory é definida interface IAppointmentFactory.
private static void CreateAppointments(ExchangeService service, List<string> emailAddresses, IAppointmentFactory factory)
{
  // Loop through the list of email addresses to add the appointment.
  foreach (var emailAddress in emailAddresses)
  {
    Console.WriteLine(string.Format("  Placing appointment in calendar for {0}.", emailAddress));
    // Set the email address of the account to get the appointment.
    service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailAddress);
    // Get the appointment to add.
    Appointment appointment = factory.GetAppointment(service);
    // Save the appointment.
    try
    {
      if (appointment.RequiredAttendees.Count > 0)
      {
        // The appointment has attendees so send them the meeting request.
        appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);
      }
      else
      {
        // The appointment does not have attendees, so just save to calendar.
        appointment.Save(SendInvitationsMode.SendToNone);
      }
    }
    catch (ServiceResponseException ex)
    {
      Console.WriteLine(string.Format("Could not create appointment for {0}", emailAddress));
      Console.WriteLine(ex.Message);
    }
  }
}

Ao salvar o compromisso, o código verifica se algum participante foi adicionado à propriedade RequiredAttendees. Se tiver, o método Appointment.Save será chamado com o valor de enumeração SendToAllAndSaveCopy para que os participantes recebam solicitações de reunião; caso contrário, o método Appointment.Save é chamado com o valor de enumeração SendToNone para que o compromisso seja salvo no calendário do usuário representado com a propriedade Appointment.IsMeeting definida como false.

Interface IAppointmentFactory

Como você precisa de um novo objeto Appointment sempre que deseja salvar um compromisso no calendário de um usuário representado, a interface IAppointmentFactory abstrai o objeto usado para popular cada objeto Appointment. Esta versão é uma interface simples que contém apenas um método, GetAppointment, que tem um objeto ExchangeService como parâmetro e retorna um novo objeto Appointment vinculado a esse objeto ExchangeService.

interface IAppointmentFactory
{
  Appointment GetAppointment(ExchangeService service);
}

O exemplo de classe AppointmentFactory a seguir mostra uma implementação da interface IAppointmentFactory que retorna um compromisso simples que ocorre daqui a três dias. Se você remover a marca de comentário da linha appointment.RequiredAttendees.Add, o método GetAppointment retornará uma reunião e o endereço de email especificado nessa linha receberá uma solicitação de reunião com o usuário representado listado como organizador.

class AppointmentFactory : IAppointmentFactory
{
  public Appointment GetAppointment(ExchangeService service)
  {
    // First create the appointment to add.
    Appointment appointment = new Appointment(service);
    // Set the properties on the appointment.
    appointment.Subject = "Tennis lesson";
    appointment.Body = "Focus on backhand this week.";
    appointment.Start = DateTime.Now.AddDays(3);
    appointment.End = appointment.Start.AddHours(1);
    appointment.Location = "Tennis club";
    // appointment.RequiredAttendees.Add(new Attendee("sonyaf@contoso1000.onmicrosoft.com"));
    return appointment;
  }
}

Adicionar compromissos usando a representação com o EWS

O EWS permite que o aplicativo use a representação para adicionar itens a um calendário em nome do proprietário do calendário. Este exemplo mostra como usar a operação CreateItem para adicionar um compromisso ao calendário de uma conta representada.

<?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="Exchange2013" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Pacific Standard Time" />
    </t:TimeZoneContext>
    <t:ExchangeImpersonation>
      <t:ConnectingSID>
        <t:SmtpAddress>alfred@contoso.com</t:SmtpAddress>
      </t:ConnectingSID>
    </t:ExchangeImpersonation>
  </soap:Header>
  <soap:Body>
    <m:CreateItem SendMeetingInvitations="SendToNone">
      <m:Items>
        <t:CalendarItem>
          <t:Subject>Tennis lesson</t:Subject>
          <t:Body BodyType="HTML">Focus on backhand this week.</t:Body>
          <t:ReminderDueBy>2013-09-19T14:37:10.732-07:00</t:ReminderDueBy>
          <t:Start>2013-09-21T19:00:00.000Z</t:Start>
          <t:End>2013-09-21T20:00:00.000Z</t:End>
          <t:Location>Tennis club</t:Location>
          <t:MeetingTimeZone TimeZoneName="Pacific Standard Time" />
        </t:CalendarItem>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

Observe que, além da adição do elemento ExchangeImpersonation no cabeçalho SOAP para especificar a conta que estamos representando, essa é a mesma solicitação XML usada para criar um compromisso sem usar a representação.

O exemplo a seguir mostra o XML de resposta retornado pela operação CreateItem.

Observação

Os atributos ItemId e ChangeKey são reduzidos 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="775" MinorBuildNumber="7" Version="V2_4" 
 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: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:CalendarItem>
              <t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
            </t:CalendarItem>
          </m:Items>
        </m:CreateItemResponseMessage>
      </m:ResponseMessages>
    </m:CreateItemResponse>
  </s:Body>
</s:Envelope>

Novamente, esse é o mesmo XML retornado quando você usa a operação CreateItem sem usar a representação.

Confira também