Поделиться через


Доступ к календарю в качестве делегата с помощью EWS в Exchange

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

Можно использовать EWS или управляемый API EWS, чтобы предоставлять пользователям-делегатам доступ к папке "Календарь" владельца почтового ящика. После этого делегат, в зависимости от предоставленных ему разрешений, сможет создавать приглашения на собрания от имени владельца почтового ящика, создавать встречи, отвечать на приглашения на собрания, а также получать, обновлять и удалять собрания из папки "Календарь" владельца почтового ящика.

Пользователь в роли делегата использует такие же методы и действия для доступа к папке "Календарь" владельца почтового ящика, как и для доступа к собственной папке "Календарь". Основное отличие заключается в том, что необходимо использовать явный доступ для создания элемента календаря или вложенной папки календаря. После этого, после определения идентификатора элемента или папки, можно использовать неявный доступ для получения, обновления или удаления этого элемента.

Таблица 1. Методы управляемого API EWS и операции EWS для доступа к календарю в качестве делегата

Задача Используйте этот метод управляемого API EWS... Используйте эту операцию EWS...
Создание собрания или встречи в качестве делегата
Appointment.Save, где параметр FolderId предоставляет явный доступ к папке "Календарь" владельца почтового ящика
CreateItem, где элемент Mailbox указывает EmailAddress владельца почтового ящика
Создание нескольких собраний или встреч в качестве делегата
ExchangeService.CreateItems, где параметр FolderId предоставляет явный доступ к папке "Календарь" владельца почтового ящика
CreateItem, где элемент Mailbox указывает EmailAddress владельца почтового ящика
Поиск встречи или собрания в качестве делегата
ExchangeService.FindItems, где параметр FolderId предоставляет явный доступ к папке "Календарь" владельца почтового ящика
FindItem, где элемент Mailbox указывает EmailAddress владельца почтового ящика
Получение встречи или собрания в качестве делегата
Appointment.Bind
GetItem
Обновление встречи или собрания в качестве делегата
Appointment.Bind, затем Appointment.Update
GetItem, затем UpdateItem
Удаление встречи или собрания в качестве делегата
Appointment.Bind, затем Appointment.Delete
GetItem, затем DeleteItem

Примечание.

В примерах кода в этой статье primary@contoso.com является владельцем почтового ящика.

Необходимые предварительные задачи

Прежде чем пользователь сможет получить доступ к папке календаря владельца почтового ящика в качестве делегата, необходимо добавить этого пользователя в качестве делегата с разрешениями в папку "Календарь" владельца почтового ящика.

Для обновления календаря владельца почтового ящика к учетной записи делегата должен быть присоединен почтовый ящик.

Если делегату нужно работать лишь с приглашениями на собрания и откликами на такие приглашения, можно добавить этого делегата в папку "Календарь" и использовать значение перечисления управляемого API EWS по умолчанию MeetingRequestsDeliveryScope.DelegatesAndSendInformationToMe или значение DelegatesAndSendInformationToMe элемента EWS DeliverMeetingRequests, чтобы отправлять приглашения делегату, а информационные сообщения — владельцу почтового ящика. После этого не требуется предоставлять делегату доступ к папке "Входящие" в почтовом ящике владельца.

Создание собрания или встречи в качестве делегата с помощью управляемого API EWS

Управляемый API EWS дает возможность использовать объект службы для пользователя-делегата, чтобы создавать элементы календаря для владельца почтового ящика. В этом примере показано, как использовать метод Save, чтобы создать собрание и отправить участникам приглашение на собрание.

В этом примере предполагается, что service является допустимым объектом ExchangeService для делегата, а делегату предоставлены необходимые разрешения для папки "Календарь" владельца почтового ящика.

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

Обратите внимание, что при сохранении элемента метод Save должен идентифицировать папку "Календарь" владельца почтового ящика. Если папка "Календарь" владельца почтового ящика не указана, приглашение на собрание сохраняется в календаре делегата, а не в папке "Календарь" владельца почтового ящика не указана. Включить папку "Календарь" владельца почтового ящика в вызов метода Save можно двумя способами. Рекомендуется создать новый экземпляр объекта FolderId, используя WellKnownFolderName и адрес SMTP-сервера владельца почтового ящика.

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

Также можно сначала использовать метод Bind для папки "Календарь", а затем использовать идентификатор этой папке в вызове метода Save. Тем не менее, помните, что при этом создается дополнительный вызов EWS.

    // 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);

Создание собрания или встречи в качестве делегата с помощью EWS

EWS дает возможность использовать объект службы для пользователя-делегата, чтобы создавать элементы календаря для владельца почтового ящика. В этом примере показано, как использовать операцию CreateItem, чтобы создать собрание и отправить участникам приглашение на собрание.

Это тоже XML-запрос, который управляемый API EWS отправляет, когда вы используете метод Save, чтобы создать собрание или встречу в качестве делегата.

Загон SOAP был удален из следующего примера для краткости.

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

Сервер отвечает на запрос CreateItem сообщением CreateItemResponse , которое содержит значение элемента ResponseCodeNoError, указывающее, что собрание было успешно создано. Ответ также содержит идентификатор элемента только что созданного собрания.

Поиск собрания или встречи в качестве делегата с помощью управляемого API EWS

Чтобы найти собрание, необходимо использовать один из методов ExchangeService.FindItems, включающий параметр FolderId, чтобы можно было указать папку "Календарь" владельца почтового ящика.

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

Когда вызов FindItems возвратит отклик с идентификатором, можно будет получить, обновить или удалить это собрания, используя этот идентификатор и неявный доступ. При этом не требуется указывать адрес SMTP-сервера владельца почтового ящика.

Поиск собрания или встречи в качестве делегата с помощью EWS

EWS дает возможность использовать объект службы для пользователя-делегата, чтобы искать встречи и собрания, соответствующие заданным условиям поиска. В этом примере показано, как использовать операцию FindItem для поиска сообщений в папке "Календарь" владельца почтового ящика, содержащих слово "building" в теме.

Это тоже XML-запрос, который управляемый API EWS отправляет, когда вы используете метод FindItem, чтобы найти собрание или встречу в качестве делегата.

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

В ответ на запрос FindItem сервер отправляет сообщение FindItemResponse, содержащее значение NoError элемента ResponseCode. Оно указывает, что поиск успешно завершен. Отклик содержит CalendarItem для всех встреч и собраний, соответствующих условиям поиска. В этом случае найдено только одно собрание.

Значение элемента ItemId сокращено для удобочитаемости.

<?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="http://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="http://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="http://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="http://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>

Теперь, когда есть идентификатор ItemId собрания, соответствующего условиям поиска, можно получить, обновить или удалить это собрание, используя этот идентификатор ItemId и неявный доступ. При этом не требуется указывать адрес SMTP-сервера владельца почтового ящика.

Получение, обновление и удаление элементов календаря в качестве делегата с помощью управляемого API EWS

С помощью управляемого API EWS можно получать, обновлять и удалять собрания и встречи таким же образом, как и без делегирования доступа. Единственное отличие состоит в том, что объект службы предназначен для пользователя-делегата. Идентификатор элемента, включенный в вызов метода Bind, уникальным образом идентифицирует элемент в хранилище почтовых ящиков в папке "Календарь" владельца почтового ящика.

Табл. 2. Методы управляемого API EWS для работы с встречами и собраниями в качестве делегата

Задача Метод управляемого API EWS Пример кода
Получение встречи или собрания
Bind
Получение элемента с помощью управляемого API EWS
Обновление встречи или собрания
Bind, затем Update
Обновление собрания с помощью управляемого API EWS
Удаление встречи или собрания
Bind, затем Delete
Удаление собрания с помощью управляемого API EWS

Получение, обновление и удаление элементов календаря в качестве делегата с помощью EWS

С помощью EWS можно получать, обновлять и удалять собрания и встречи таким же образом, как и без делегирования доступа. Единственное отличие состоит в том, что объект службы предназначен для пользователя-делегата. Идентификатор элемента, включенный в вызов метода GetItem, уникальным образом идентифицирует элемент в хранилище почтовых ящиков в папке "Календарь" владельца почтового ящика.

Табл. 3. Операции EWS для работы с встречами и собраниями в качестве делегата

Задача Операция служб EWS Пример кода
Получение встречи или собрания
GetItem
Получение элемента с помощью веб-служб Exchange
Обновление встречи или собрания
GetItem, затем UpdateItem
Обновление собрания с помощью EWS
Удаление встречи или собрания
GetItem, затем DeleteItem
Удаление собрания с помощью EWS

См. также