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

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

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

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

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

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

При работе с электронной почтой в качестве делегата учитывайте следующие моменты:

  • Если делегату нужно работать только с приглашениями на собрания и ответами, ему не нужен доступ к папке "Входящие". Дополнительные сведения см. в разделе Предварительные задачи для доступа к календарям в качестве делегата.

  • Когда получатель получает сообщение, отправленное от имени владельца почтового ящика, отправитель отображается как "Делегировать от имени владельца почтового ящика".

Примечание.

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

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

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

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

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

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

public static void DelegateAccessCreateEmail(ExchangeService service)
{
    // Create an email message and provide it with connection 
    // configuration information by using an ExchangeService 
    // object named service.
    EmailMessage message = new EmailMessage(service);
    // Set properties on the email message.
    message.Subject = "Company Soccer Team";
    message.Body = "Are you interested in joining?";
    message.ToRecipients.Add("sadie@contoso.com");
    // Save the email to the mailbox owner's Drafts folder.
    // This method call results in a CreateItem call to EWS.
    // The FolderId parameter contains the context for the 
    // mailbox owner's Inbox folder. Any additional actions 
    // taken on this message will be performed in the mailbox 
    // owner's mailbox. 
    message.Save(new FolderId(WellKnownFolderName.Drafts, new Mailbox("primary@contoso.com")));
    // Send the email and save the message in the mailbox owner's 
    // Sent Items folder.
    // This method call results in a SendItem call to EWS.
    message.SendAndSaveCopy(new FolderId(WellKnownFolderName.SentItems, new Mailbox("primary@contoso.com")));
    Console.WriteLine("An email with the subject '" + message.Subject + "' has been sent to '" 
    + message.ToRecipients[0] + "' and saved in the Sent Items folder of the mailbox owner.");
}

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

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

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

<?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=" Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:CreateItem MessageDisposition="SaveOnly">
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="drafts">
          <t:Mailbox>
            <t:EmailAddress>primary@contoso.com</t:EmailAddress>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:SavedItemFolderId>
      <m:Items>
        <t:Message>
          <t:Subject>Company Soccer Team</t:Subject>
          <t:Body BodyType="HTML">Are you interested in joining?</t:Body>
          <t:ToRecipients>
            <t:Mailbox>
              <t:EmailAddress>sadie@contoso.com</t:EmailAddress>
            </t:Mailbox>
          </t:ToRecipients>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

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

Значение 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="17"
                         Version="V2_10"
                         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>
    <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:Message>
              <t:ItemId Id="iNRaAAA="
                        ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQPU" />
            </t:Message>
          </m:Items>
        </m:CreateItemResponseMessage>
      </m:ResponseMessages>
    </m:CreateItemResponse>
  </s:Body>
</s:Envelope>

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

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

<?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=" Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:SendItem SaveItemToFolder="true">
      <m:ItemIds>
        <t:ItemId Id="iNRaAAA="
                  ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQPU" />
      </m:ItemIds>
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="sentitems">
          <t:Mailbox>
            <t:EmailAddress>primary@contoso.com</t:EmailAddress>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:SavedItemFolderId>
    </m:SendItem>
  </soap:Body>
</soap:Envelope>

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

<?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="17"
                         Version="V2_10"
                         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>
    <m:SendItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:SendItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
        </m:SendItemResponseMessage>
      </m:ResponseMessages>
    </m:SendItemResponse>
  </s:Body>
</s:Envelope>

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

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

static void DelegateAccessSearchEmailWithFilter(ExchangeService service)
{
    // Limit the result set to 10 items.
    ItemView view = new ItemView(10);
    // Define the search filter.
    SearchFilter.ContainsSubstring filter = new SearchFilter.ContainsSubstring(ItemSchema.Subject, 
        "soccer", ContainmentMode.Substring, ComparisonMode.IgnoreCase);
    view.PropertySet = new PropertySet(ItemSchema.Subject,
                                       ItemSchema.DateTimeReceived,
                                       EmailMessageSchema.IsRead);
    // Item searches do not support deep traversal.
    view.Traversal = ItemTraversal.Shallow;
    // Sorting.
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
    try
    {
        // Call FindItems to find matching Inbox items. 
        // The parameters of FindItems must denote the mailbox owner,
        // mailbox, and Inbox folder.
        // This call results in a FindItem call to EWS.
        FindItemsResults<Item> results = service.FindItems(new 
            FolderId(WellKnownFolderName.Inbox, "primary@contoso.com"), 
            filter, view);
        foreach (Item item in results.Items)
        {
            Console.WriteLine("Subject: {0}", item.Subject);
            Console.WriteLine("Id: {0}", item.Id.ToString());
            if (item is EmailMessage)
            {
                EmailMessage message = item as EmailMessage;
                Console.WriteLine("Read: {0}", message.IsRead.ToString());
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception while enumerating results: {0}", ex.Message);
    }
}

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

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

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

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

<?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=" 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="soccer" />
        </t:Contains>
      </m:Restriction>
      <m:SortOrder>
        <t:FieldOrder Order="Descending">
          <t:FieldURI FieldURI="item:DateTimeReceived" />
        </t:FieldOrder>
      </m:SortOrder>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="inbox">
          <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. Оно указывает, что поиск успешно завершен. Ответ содержит элемент Message для всех сообщений электронной почты, которые соответствуют условиям поиска. В этом случае найдено только одно сообщение электронной почты.

Значение элемента 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="17"
                         Version="V2_10"
                         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>
    <m:FindItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="https://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:Message>
                <t:ItemId Id="iNwoAAA="
                          ChangeKey="CQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiQuu" />
                <t:Subject>Soccer team</t:Subject>
                <t:DateTimeReceived>2014-03-10T06:16:55Z</t:DateTimeReceived>
                <t:IsRead>false</t:IsRead>
              </t:Message>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

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

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

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

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

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

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

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

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

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

См. также