Agregar citas mediante la suplantación de Exchange

Obtenga información sobre cómo usar la suplantación con la API administrada de EWS o EWS en Exchange para agregar citas a los calendarios de los usuarios.

Puede crear una aplicación de servicio que inserte citas directamente en un calendario de Exchange mediante una cuenta de servicio que tenga habilitado el rolApplicationImpersonation. Cuando se usa la suplantación, la aplicación actúa como el usuario; es como si el usuario agregara la cita al calendario mediante un cliente como Outlook.

Cuando use la suplantación, tenga en cuenta lo siguiente:

  • El objeto ExchangeService debe estar enlazado a la cuenta de servicio. Puede usar el mismo objeto ExchangeService para suplantar varias cuentas cambiando la propiedad ImpersonatedUserId para cada cuenta que desee suplantar.
  • Cualquier elemento que guarde en una cuenta suplantada solo se puede usar una vez. Si, por ejemplo, desea guardar la misma cita en varias cuentas, tiene que crear un objeto Appointment para cada una.

Requisitos previos

La aplicación necesita una cuenta que se pueda usar para conectarse a Exchange Server antes de poder usar la suplantación. Se recomienda usar una cuenta de servicio para la aplicación a la que se ha concedido el rol de suplantación de aplicación para las cuentas a las que va a acceder. Para obtener más información, consulte Configurar suplantación.

Adición de citas mediante la suplantación con la API administrada de EWS

En el ejemplo siguiente se agrega una cita o reunión al calendario de una o varias cuentas de Exchange. El método toma tres parámetros.

  • service: un objeto ExchangeService enlazado a la cuenta de la aplicación de servicio en Exchange Server.
  • emailAddresses: un objeto System.Listque contiene una lista de cadenas de direcciones de correo electrónico SMTP.
  • factory: objeto que implementa la interfaz IAppointmentFactory. Esta interfaz tiene un método, GetAppointment, que toma un objeto ExchangeService como parámetro y devuelve un objeto Appointment. La interfaz IAppointmentFactory se define interfaz de 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);
    }
  }
}

Al guardar la cita, el código comprueba si se ha agregado algún asistente a la propiedad RequiredAttendees. Si se ha agregado, se llama al método Appointment.Save con el valor de enumeración SendToAllAndSaveCopy para que los asistentes reciban las convocatorias de reunión; de lo contrario, se llama al método Appointment.Save con el valor de enumeración SendToNone para que la cita se guarde en el calendario del usuario suplantado con la propiedad Appointment.IsMeeting establecida en false.

Interfaz IAppointmentFactory

Dado que necesita un nuevo objeto Appointment cada vez que desea guardar una cita en el calendario de un usuario suplantado, la interfaz IAppointmentFactory extrae el objeto usado para rellenar cada objeto Appointment. Esta versión es una interfaz simple que contiene un solo método, GetAppointment, que toma un objeto ExchangeService como parámetro y devuelve un nuevo objeto Appointment enlazado a dicho objeto ExchangeService.

interface IAppointmentFactory
{
  Appointment GetAppointment(ExchangeService service);
}

En el siguiente ejemplo de clase AppointmentFactory se muestra la implementación de la interfaz IAppointmentFactory que devuelve una cita simple que tiene lugar tres días después desde ese momento. Si quita la marca de comentario de la línea appointment.RequiredAttendees.Add, el método GetAppointment devolverá una reunión y la dirección de correo electrónico especificada en dicha línea recibirá una convocatoria de reunión mostrando al usuario suplantado 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;
  }
}

Agregar citas mediante suplantación con EWS

EWS permite a la aplicación usar la suplantación para agregar elementos a un calendario en nombre del propietario de este. En este ejemplo se indica cómo usar la operación CreateItem para agregar una cita al calendario de una cuenta suplantada.

<?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>

Tenga en cuenta que aparte de añadir el elemento ExchangeImpersonation en el encabezado SOAP para especificar la cuenta que se va a suplantar, se trata de la misma solicitud XML utilizada para crear una cita sin usar la suplantación.

En el ejemplo siguiente se muestra el XML de respuesta devuelto por la operación CreateItem.

Nota:

Los atributos itemId y ChangeKey se acortan para mejorar la legibilidad.

<?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>

De nuevo, este es el mismo XML que se devuelve cuando se usa la operación CreateItem sin usar la suplantación.

Vea también