Compartir a través de


Obtener fotos de usuario mediante EWS en Exchange

Obtenga información sobre cómo obtener fotos de usuario asociadas a un buzón de correo o contacto mediante la API administrada de EWS o EWS en Exchange.

Es agradable poner una cara a un nombre. Si a los usuarios les gusta colocar nombres en caras, la aplicación puede solicitar una imagen, normalmente una foto, de Exchange que represente una cuenta de correo electrónico. Puede obtener una foto de usuario almacenada en un servidor de Exchange para un buzón de correo, o puede obtener una foto de contacto de los contactos almacenados en el buzón.

Puede usar varias tecnologías diferentes para obtener fotos de buzones o Servicios de dominio de Active Directory (AD DS). La mejor manera de obtener una foto depende del tipo de contacto del que quiera obtener una foto.

Tabla 1. Tecnologías que se usan para obtener fotos de usuario en función del tipo de contacto

Tipo de contacto Tecnologías que se van a usar
Foto de usuario del buzón
Obtención de una foto de usuario de buzón mediante REST

Obtención de una foto de usuario mediante EWS
Foto de usuario de contacto
Obtener una foto de usuario de contacto mediante la API administrada de EWS

Obtención de una foto de usuario mediante EWS

Obtención de una foto de usuario de buzón mediante REST

Puede solicitar fotos de usuario desde un servidor exchange mediante una solicitud GET HTTPS estándar. En la solicitud, especifique la dirección de cuenta de correo electrónico y un código de tamaño para la imagen, como se muestra en el ejemplo siguiente.

https://Exchange Server/ews/Exchange.asmx/s/GetUserPhoto?email=email address&size=size code

Use la operación GetUserSettings del servicio de detección automática para recuperar la configuración ExternalEwsUrl , que contiene la dirección URL del punto de conexión de Exchange Web Services (EWS) y la ubicación del controlador HTTP Exchange.asmx que devuelve las fotos del usuario.

Cada código de tamaño indica el alto y el ancho de la imagen en píxeles. Por ejemplo, el código de tamaño HR48x48 devuelve una imagen de 48 píxeles de alto por 48 píxeles de ancho. Los valores posibles para el parámetro de código size son los mismos que los valores posibles para el elemento SizeRequested . Si la solicitud especifica un tamaño que no está disponible, se devolverá la foto más grande disponible. Si no se almacena ninguna foto en el servidor de Exchange, se devolverá la imagen en miniatura almacenada en AD DS para la cuenta.

Nota:

El código de tamaño HR48x48 siempre devuelve la imagen en miniatura de AD DS si está disponible.

En el ejemplo siguiente se muestra cómo puede usar la solicitud GET para recuperar la foto de usuario de Sadie y guardarla en el equipo local.

// Create the web request with the REST URL.
HttpWebRequest request = 
   WebRequest.Create("https://www.contoso.com/ews/exchange.asmx/s/GetUserPhoto?email=sadie@contoso.com&size=HR240x240") 
   as HttpWebRequest;
// Submit the request.
using (HttpWebResponse resp = request.GetResponse() as HttpWebResponse)
{
   // Take the response and save it as an image.
   Bitmap image = new Bitmap(resp.GetResponseStream());
   image.Save("Sadie.jpg");
}

La solicitud devolverá una respuesta HTTP.

Tabla 2. Códigos de respuesta para una solicitud GetUserPhoto

Código de respuesta Descripción
200
Una imagen está disponible para la cuenta de correo electrónico especificada y la imagen binaria está contenida en la respuesta.
304
La imagen no ha cambiado desde la última vez que se devolvió la ETag a la aplicación.
404
No hay ninguna imagen disponible para la cuenta de correo electrónico especificada.

Almacenar en caché las fotos de usuario

Exchange devuelve los datos con un tipo de contenido image/jpeg, junto con una colección de valores de encabezado. El encabezado ETag es similar a una clave de cambio. El valor es una cadena que representa la última vez que se actualizó la foto. La ETag sigue siendo la misma para la foto del usuario hasta que se cambia la foto. Puede enviar este valor ETag al servidor en la solicitud HTTPS GET en un encabezado If-None-Match . Si la foto no ha cambiado desde la última solicitud, el servidor responderá con una respuesta HTTP 304 que indique como tal. Esto significa que puede usar la foto de usuario que solicitó y guardó anteriormente en lugar de procesar una nueva.

Obtener una foto de usuario de contacto mediante la API administrada de EWS

La aplicación puede usar la API administrada de EWS para recuperar las fotos de los contactos, si el contacto se almacena en una carpeta de contactos en el buzón del usuario. Para ello, en primer lugar, busque el ItemId para el contacto que desea usar. A continuación, después de enlazar a ese contacto, cárguelo en la colección de datos adjuntos. Si el contacto tiene una foto, la foto será uno de los datos adjuntos. Recorre en bucle la colección de datos adjuntos, comprobando el valor de la propiedad IsContactPhoto . Cuando encuentre la foto de contacto, puede guardarla en el equipo local y la aplicación puede acceder a ella.

En el ejemplo siguiente se muestra este proceso. En este ejemplo se supone que service es un objeto ExchangeService válido y que el usuario se ha autenticado en un servidor Exchange.

private static void GetContactPhoto(ExchangeService service, string ItemId)
{
   // Bind to an existing contact by using the ItemId passed into this function.
   Contact contact = Contact.Bind(service, ItemId);
   // Load the contact to get access to the collection of attachments.
   contact.Load(new PropertySet(ContactSchema.Attachments));
   // Loop through the attachments looking for a contact photo.
   foreach (Attachment attachment in contact.Attachments)
   {
      if ((attachment as FileAttachment).IsContactPhoto)
      {
         // Load the attachment to access the content.
         attachment.Load();
      }
   }
   FileAttachment photo = contact.GetContactPictureAttachment();
   // Create a file stream and save the contact photo to your computer.
   using (FileStream file = new FileStream(photo.Name, FileMode.Create, System.IO.FileAccess.Write))
   {
      photo.Load(file);
   }
}

Obtención de una foto de usuario mediante EWS

Si obtiene una foto de usuario de AD DS, puede usar la operación GetUserPhoto (si conoce la dirección de correo electrónico) o la operación ResolveNames (si no conoce la dirección de correo electrónico). Si obtiene una foto de usuario de una carpeta de contactos en el buzón de correo, use la operación GetItem seguida de la operación GetAttachment . En cualquier caso, la foto se devuelve como una cadena codificada en Base64 en la respuesta XML.

Obtención de una foto de usuario de buzón mediante la operación GetUserPhoto

El uso de la operación GetUserPhoto es sencillo. En la solicitud XML, especifique la dirección de correo electrónico del usuario y el tamaño de la foto que se va a devolver (en el elemento SizeRequested ). En el siguiente ejemplo de solicitud XML se muestra cómo obtener una foto para Sadie Daniels de 360 píxeles de ancho por 360 píxeles de alto.

<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
   <soap:Header>
      <t:RequestServerVersion Version="Exchange2013 "/>
   </soap:Header>
   <soap:Body>
      <m:GetUserPhoto>
         <m:Email>sadie@contoso.com</m:Email>
         <m:SizeRequested>HR360x360</m:SizeRequested>
      </m:GetUserPhoto>
   </soap:Body>
</soap:Envelope>

A continuación se muestra la respuesta XML. La foto codificada en Base64 está contenida en el elemento PictureData (el contenido 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:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <GetUserPhotoResponse ResponseClass="Success" 
         xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
      <ResponseCode>NoError</ResponseCode>
      <HasChanged>true</HasChanged>
      <PictureData>/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAg... wATRRRSuB//2Q==</PictureData>
    </GetUserPhotoResponse>
  </s:Body>
</s:Envelope>

Obtención de una foto de usuario de buzón mediante la operación ResolveNames

Si no conoce la dirección de correo electrónico del usuario para el que obtiene una foto, puede usar la operación ResolveNames para obtener candidatos para una posible coincidencia. Si especifica "AllProperties" para el atributo ContactDataShape del elemento ResolveNames , se devolverán una gran cantidad de datos, incluidas las fotos de usuario, para cada candidato. En el ejemplo siguiente se muestra la solicitud XML para resolver el nombre "Sadie" y devolver todas las propiedades de cada candidato.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>  
<soap:Body>
  <m:ResolveNames ReturnFullContactData="true" ContactDataShape="AllProperties">
      <m:UnresolvedEntry>sadie</m:UnresolvedEntry>
    </m:ResolveNames>
  </soap:Body>
</soap:Envelope>

Se devolverán muchos datos en la respuesta. En el ejemplo siguiente se muestran solo los datos que son relevantes para la foto del usuario. El elemento Photo contiene la foto de usuario codificada en Base64 (el contenido 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:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:ResolveNamesResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
         xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:ResolveNamesResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:ResolutionSet TotalItemsInView="1" IncludesLastItemInRange="true">
            <t:Resolution>
              <t:Mailbox>
                <t:Name>Sadie Daniels</t:Name>
                <t:EmailAddress>sadie@contoso.com</t:EmailAddress>
                <t:RoutingType>SMTP</t:RoutingType>
                <t:MailboxType>Mailbox</t:MailboxType>
              </t:Mailbox>
              <t:Contact>
                <t:DisplayName>Sadie Daniels</t:DisplayName>
                <t:GivenName>Sadie</t:GivenName>
                <t:Initials/>
                <t:CompanyName>CONTOSO</t:CompanyName>
......
                <t:Photo>/9j/4AAQSkZJRgABAQE...qKKKAP/2Q==</t:Photo>
......
              </t:Contact>
            </t:Resolution>
          </m:ResolutionSet>
        </m:ResolveNamesResponseMessage>
      </m:ResponseMessages>
    </m:ResolveNamesResponse>
  </s:Body>
</s:Envelope>

Obtener una foto de usuario de contacto mediante la operación GetAttachment

Puede usar EWS para obtener fotos de los contactos almacenados en el buzón. En primer lugar, se usa la operación GetItem para devolver todas las propiedades y así poder buscar fotos. En el ejemplo siguiente se muestra una solicitud XML para obtener un elemento de contacto. El identificador de elemento 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:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <GetItem xmlns='http://schemas.microsoft.com/exchange/services/2006/messages'>
      <ItemShape>
        <t:BaseShape>AllProperties</t:BaseShape>
      </ItemShape>
      <ItemIds>
        <t:ItemId Id="AAAAGECXAAA=" ChangeKey="EQAAABYAAAD2WuN+TpqwSrNP9JCCMKC0AABLzXRv"/>
      </ItemIds>
    </GetItem>
  </soap:Body>
</soap:Envelope>

Busque el elemento HasPicture para comprobar que el contacto tiene una foto asociada. A continuación, busque en la colección de datos adjuntos uno que tenga un valor de true para el elemento IsContactPhoto . En el ejemplo de respuesta siguiente se muestran solo los datos pertinentes. Los valores de identificador se acortan para mejorar la legibilidad.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
         xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:GetItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Items>
            <t:Contact>
              <t:ItemId Id="AAAAGECXAAA=" ChangeKey="EQAAABYAAAD2WuN+TpqwSrNP9JCCMKC0AABLzXRv"/>
              <t:ParentFolderId Id="nIxIAAA=" ChangeKey="AQAAAA=="/>
              <t:ItemClass>IPM.Contact</t:ItemClass>
              <t:Subject>Hope Gross</t:Subject>
              <t:Sensitivity>Normal</t:Sensitivity>
......
              <t:Attachments>
                <t:FileAttachment>
                  <t:AttachmentId Id="1LGlhgpgoA="/>
                  <t:Name>ContactPicture.jpg</t:Name>
                  <t:Size>6260</t:Size>
                  <t:LastModifiedTime>2011-03-09T16:55:55</t:LastModifiedTime>
                  <t:IsInline>false</t:IsInline>
                  <t:IsContactPhoto>true</t:IsContactPhoto>
                </t:FileAttachment>
              </t:Attachments>
......
              <t:HasPicture>true</t:HasPicture>
            </t:Contact>
          </m:Items>
        </m:GetItemResponseMessage>
      </m:ResponseMessages>
    </m:GetItemResponse>
  </s:Body>
</s:Envelope>

A continuación, use la operación GetAttachment con AttachmentId para solicitar los datos adjuntos que tienen la foto de contacto. En el ejemplo siguiente se muestra la solicitud XML para obtener los datos adjuntos. El identificador se acorta para mejorar la legibilidad.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <GetAttachment xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
    xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <AttachmentShape/>
      <AttachmentIds>
         <t:AttachmentId Id="1LGlhgpgoA="/>
      </AttachmentIds>
    </GetAttachment>
  </soap:Body>
</soap:Envelope>

En el ejemplo siguiente se muestra la respuesta XML con la información sobre los datos adjuntos que solicitó. El elemento Content contiene la cadena codificada en Base64 para la foto del usuario, acortada en este ejemplo para mejorar la legibilidad.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:GetAttachmentResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
         xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:GetAttachmentResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Attachments>
            <t:FileAttachment>
              <t:AttachmentId Id="+KsDBEr1LGlhgpgoA="/>
              <t:Name>ContactPicture.jpg</t:Name>
              <t:Content>/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAg...D//2Q==</t:Content>
            </t:FileAttachment>
          </m:Attachments>
        </m:GetAttachmentResponseMessage>
      </m:ResponseMessages>
    </m:GetAttachmentResponse>
  </s:Body>
</s:Envelope>

Descodificación de una cadena codificada en Base64

Independientemente de la operación que use para obtener una foto de usuario, deberá descodificar esa cadena para poder usarla en la aplicación. En el ejemplo siguiente se muestra cómo descodificar la cadena y, a continuación, guardarla en el equipo local para que la aplicación pueda acceder a ella más adelante.

// Convert the encoded string into a byte array.
byte[] data = System.Convert.FromBase64String(Photo);
// Create a memory stream to read the data.
MemoryStream ms = new MemoryStream(data);
// Save the data on your local computer as a JPG image.
using (FileStream file = new FileStream(ContactName + ".jpg", FileMode.Create, System.IO.FileAccess.Write))
{
   byte[] bytes = new byte[ms.Length];
   ms.Read(bytes, 0, (int)ms.Length);
   file.Write(bytes, 0, bytes.Length);
   ms.Close();
}

Consulte también