Добавление встреч с помощью олицетворения Exchange

Узнайте, как использовать олицетворение с управляемым API EWS или EWS в Exchange для добавления встреч в календари пользователей.

Вы можете создать приложение службы, которое вставляет встречи непосредственно в календарь Exchange, используя учетную запись службы с включенной рольюApplicationImpersonation. При использовании олицетворения приложение действует как пользователь; это как если бы пользователь добавил встречу в календарь с помощью клиента, такого как Outlook.

При использовании олицетворения необходимо учитывать следующее:

  • Объект ExchangeService должен быть связан с учетной записью службы. Можно использовать один и тот же объект ExchangeService для олицетворения нескольких учетных записей, изменяя свойство ImpersonatedUserId для каждой олицетворяемой учетной записи.
  • Любой элемент, сохраняемый в олицетворенной учетной записи, можно использовать только один раз. Например, чтобы сохранить одну и ту же встречу в нескольких учетных записях, необходимо создать объект Appointment для каждой учетной записи.

Предварительные требования

Приложению требуется учетная запись для подключения к серверу Exchange, прежде чем использовать олицетворение. Рекомендуется использовать учетную запись службы для приложения, которому предоставлена роль олицетворения в приложении для учетных записей, к которым оно будет обращаться. Дополнительные сведения см. в разделе Настройка олицетворения

Добавление встреч с помощью олицетворения с управляемым API EWS

В следующем примере показано добавление встречи или собрания в календарь одной или нескольких учетных записей Exchange. Метод реализуется в трех параметрах.

  • service — это объект ExchangeService, связанный с учетной записью приложения-службы на сервере Exchange.
  • emailAddresses — это объект System.List, содержащий список строк адресов электронной почты SMTP.
  • factory — это объект, реализующий интерфейс IAppointmentFactory. Этот интерфейс имеет один метод GetAppointment, который принимает объект ExchangeService в качестве параметра и возвращает объект Appointment. Интерфейс IAppointmentFactory определяется интерфейсом 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);
    }
  }
}

При сохранении встречи код проверяет, добавлены ли участники в свойство RequiredAttendees. Если да, вызывается метод Appointment.Save со значением перечисления SendToAllAndSaveCopy, чтобы участники получали приглашения на собрания; в противном случае метод Appointment.Save вызывается со значением перечисления SendToNone, чтобы встреча была сохранена в календаре олицетворенного пользователя со свойством Appointment.IsMeeting, для которого задано значение false.

Интерфейс IAppointmentFactory

Так как при каждом сохранении встречи в календаре олицетворенного пользователя требуется новый объект Appointment, интерфейс IAppointmentFactory выделяет объект, используемый для заполнения каждого объекта Appointment. Эта версия представляет собой простой интерфейс, содержащий только один метод GetAppointment, который принимает объект ExchangeService в качестве параметра и возвращает новый объект Appointment, связанный с этим объектом ExchangeService.

interface IAppointmentFactory
{
  Appointment GetAppointment(ExchangeService service);
}

В следующем примере класса AppointmentFactory показана реализация интерфейса IAppointmentFactory, который возвращает простую встречу, которая состоится через три дня. Если раскомментировать строку appointment.RequiredAttendees.Add, метод GetAppointment возвращает собрание, а указанный в этой строке адрес электронной почты получает приглашение на собрание с олицетворенным пользователем, указанным в качестве организатора.

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;
  }
}

Добавление встреч с помощью олицетворения с EWS

EWS позволяет приложению использовать олицетворение для добавления элементов в календарь от имени владельца календаря. В этом примере показан порядок использования операции CreateItem для добавления встречи в календарь олицетворенной учетной записи.

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

Обратите внимание, что помимо добавления элемента ExchangeImpersonation в заголовок SOAP для указания олицетворяемой учетной записи, это тот же XML-запрос, используемый для создания встречи без использования олицетворения.

В следующем примере показан XML-отклик, возвращаемый операцией CreateItem.

Примечание.

Атрибуты ItemId и ChangeKey сокращены для удобства чтения.

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

Опять же, это тот же XML, который возвращается при использовании операции CreateItem без использования олицетворения.

См. также