Acceso al correo electrónico como delegado mediante EWS en Exchange

Obtenga información sobre cómo acceder al correo electrónico como delegado mediante la API administrada de EWS o EWS en Exchange.

Puede usar la API administrada de EWS o EWS para conceder a un usuario delegado acceso a la carpeta Bandeja de entrada del propietario de un buzón. A continuación, el delegado puede crear convocatorias de reunión en nombre del propietario del buzón de correo, buscar correo electrónico y recuperar, actualizar y eliminar correo electrónico de la carpeta Bandeja de entrada del propietario del buzón, en función de sus permisos.

Como delegado, se usan los mismos métodos y operaciones para acceder a la carpeta Bandeja de entrada de un propietario de buzón de correo que se usa para acceder a una carpeta Bandeja de entrada sin acceso delegado. La principal diferencia es que tiene que usar el acceso explícito para buscar o crear un elemento de correo electrónico y, después de identificar el identificador de elemento, puede usar el acceso implícito para obtener, actualizar o eliminar el elemento.

Tabla 1. Métodos de API administrada de EWS y operaciones de EWS para acceder al correo electrónico como delegado

Si quiere... Usar este método de API administrada de EWS... Use esta operación EWS...
Creación y envío de un correo electrónico como delegado
EmailMessage.Save donde el parámetro FolderId proporciona acceso explícito a la carpeta Borradores del propietario del buzón
EmailMessage.SendAndSaveCopy , donde el parámetro FolderId proporciona acceso explícito a la carpeta Elementos enviados del propietario del buzón
CreateItem donde el elemento Mailbox especifica el EmailAddress del propietario del buzón
SendItem donde el elemento Mailbox especifica el emailaddress del propietario del buzón
Creación de varios mensajes de correo electrónico como delegado
ExchangeService.CreateItems donde el parámetro FolderId proporciona acceso explícito a la carpeta Bandeja de entrada del propietario del buzón
CreateItem donde el elemento Mailbox especifica el EmailAddress del propietario del buzón
Buscar o buscar un correo electrónico como delegado
ExchangeService.FindItems donde el parámetro FolderId proporciona acceso explícito a la carpeta Bandeja de entrada del propietario del buzón
FindItem donde el elemento Mailbox especifica el EmailAddress del propietario del buzón
Obtención de un correo electrónico como delegado
EmailMessage.Bind
GetItem
Actualización de un correo electrónico como delegado
EmailMessage.Bind seguido de EmailMessage.Update
GetItem seguido de UpdateItem
Eliminación de un correo electrónico como delegado
EmailMessage.Bind seguido de EmailMessage.Delete
GetItem seguido de DeleteItem

Tenga en cuenta lo siguiente al trabajar con correos electrónicos como delegado:

  • Si un delegado solo necesita trabajar con solicitudes y respuestas de reunión, el delegado no necesita acceso a la carpeta Bandeja de entrada. Para obtener más información, vea Tareas de requisitos previos para acceder a calendarios como delegado.

  • Cuando un destinatario recibe un mensaje que se envió en nombre de un propietario de buzón de correo, el remitente aparece como "Delegado en nombre del propietario del buzón".

Nota:

En los ejemplos de código de este artículo, primary@contoso.com es el propietario del buzón.

Tareas de requisitos previos

Antes de que un usuario pueda acceder a la carpeta Bandeja de entrada del propietario del buzón como delegado, el usuario debe agregarse como delegado con permisos a la carpeta Bandeja de entrada del propietario del buzón.

Creación y envío de un correo electrónico como delegado mediante la API administrada de EWS

La API administrada de EWS permite usar el objeto de servicio para que el usuario delegado cree y envíe correo electrónico en nombre del propietario del buzón. En este ejemplo se muestra cómo usar el método Save para guardar el mensaje en la carpeta Borradores del propietario del buzón y, a continuación, el método SendAndSaveCopy para enviar el correo y guardar el mensaje en la carpeta Elementos enviados del propietario del buzón.

En este ejemplo se supone que el servicio es un objeto ExchangeService válido para el delegado y que al delegado se le han concedido los permisos adecuados para la carpeta Bandeja de entrada, Borradores y Elementos enviados del propietario del buzón.

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

Creación y envío de un correo electrónico como delegado mediante EWS

EWS permite usar el objeto de servicio para que el usuario delegado cree y envíe correo electrónico en nombre del propietario del buzón. En este ejemplo se muestra cómo usar la operación CreateItem para crear un correo electrónico y la operación SendItem para enviar el tiempo y guardarlo en la carpeta Elementos enviados del propietario del buzón.

Esta es también la primera solicitud XML que envía la API administrada de EWS cuando se usa el método Save para crear y enviar un correo electrónico.

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

El servidor responde a la solicitud CreateItem con un mensaje CreateItemResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que el correo electrónico se creó y guardó correctamente. La respuesta también contiene el identificador de elemento del correo electrónico recién creado.

El valor ItemId se ha acortado 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="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>

A continuación, use la operación SendItem para enviar el mensaje en nombre del propietario del buzón y guardarlo en la carpeta Elementos enviados del propietario del buzón.

El valor ItemId se ha acortado para mejorar la legibilidad.

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

El servidor responde a la solicitud SendItem con un mensaje SendItemResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que el correo electrónico se envió y guardó en la carpeta Elementos enviados del propietario del buzón correctamente.

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

Busque un correo electrónico como delegado mediante la API administrada de EWS.

Para buscar un correo electrónico, debe usar uno de los métodos ExchangeService.FindItems que incluye un parámetro FolderId , de modo que pueda especificar la carpeta Bandeja de entrada del propietario del buzón.

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

Una vez que la llamada a FindItems devuelve una respuesta con un identificador, puede obtener, actualizar o eliminar ese correo electrónico mediante el identificador y el acceso implícito , y no es necesario especificar la dirección SMTP del propietario del buzón.

Búsqueda de un correo electrónico como delegado mediante EWS

EWS le permite usar el objeto de servicio para que el usuario delegado busque correos electrónicos que cumplan un conjunto de criterios de búsqueda. En este ejemplo se muestra cómo usar la operación FindItem para buscar mensajes en la carpeta Bandeja de entrada del propietario que contienen la palabra "soccer" en el asunto.

Esta es también la solicitud XML que la API administrada de EWS envía al buscar un correo electrónico.

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

El servidor responde a la solicitud FindItem con un mensaje FindItemResponse que incluye el valor de elemento ResponseCode de NoError, que indica que la búsqueda se completó correctamente. La respuesta contiene un elemento Message para los correos electrónicos que cumplen los criterios de búsqueda. En este caso, solo se encuentra un correo electrónico.

El valor del elemento ItemId se ha abreviado 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="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>

Ahora que tiene el ItemId para el correo electrónico que cumple los criterios, puede obtener, actualizar o eliminar ese correo electrónico mediante el itemid y el acceso implícito , y no es necesario especificar la dirección SMTP del propietario del buzón.

Obtención, actualización o eliminación de elementos de correo electrónico como delegado mediante la API administrada de EWS

Puede usar la API administrada de EWS para obtener, actualizar o eliminar un correo electrónico de la misma manera que realiza estas acciones cuando no usa el acceso delegado. La única diferencia es que el objeto ExchangeService es para el usuario delegado. El identificador de elemento incluido en la llamada al método Bind identifica de forma única el elemento en el almacén de buzones, en la carpeta Bandeja de entrada del propietario del buzón.

Tabla 2. Métodos de API administrada de EWS que funcionan con correo electrónico como delegado

Task Método de la API administrada de EWS Ejemplo de código
Obtener un correo electrónico
Enlazar
Obtener un elemento mediante la API administrada de EWS
Actualización de un correo electrónico
Bind seguido de Update
Actualización de un elemento mediante la API administrada de EWS
Eliminación de un correo electrónico
Bind seguido de Delete
Eliminación de un elemento mediante la API administrada de EWS

Obtener, actualizar o eliminar elementos de correo electrónico como delegado mediante EWS

Puede usar la API administrada de EWS para obtener, actualizar o eliminar un correo electrónico de la misma manera que realiza estas acciones cuando no usa el acceso delegado. La única diferencia es que el objeto de servicio es para el usuario delegado. El identificador de elemento incluido en la solicitud GetItem identifica de forma única el elemento en el almacén de buzones, en la carpeta Bandeja de entrada del propietario del buzón.

Tabla 3. Operaciones de EWS para trabajar con correo electrónico como delegado

Task Operación de EWS Ejemplo de código
Obtener un correo electrónico
GetItem
Obtener un elemento mediante EWS
Actualización de un correo electrónico
GetItem seguido de UpdateItem
Actualización de un elemento mediante EWS
Eliminación de un correo electrónico
GetItem seguido de DeleteItem
Eliminación de un elemento mediante EWS

Recursos adicionales