Obtenir des photos de l’utilisateur à l’aide d’EWS dans Exchange

Découvrez comment obtenir des photos de l’utilisateur qui sont associées à une boîte aux lettres ou à un contact à l’aide de l’API managée EWS ou d’EWS dans Exchange.

Il est agréable de présenter un visage à un nom. Si vos utilisateurs aiment mettre des noms à des faces, votre application peut demander une image, généralement une photo, à partir d’Exchange qui représente un compte de messagerie. Vous pouvez obtenir une photo d’utilisateur stockée sur un serveur Exchange pour une boîte aux lettres, ou vous pouvez obtenir une photo de contact à partir de contacts stockés dans votre boîte aux lettres.

Vous pouvez utiliser plusieurs technologies différentes pour obtenir des photos à partir de boîtes aux lettres ou de services de domaine Active Directory (AD DS). La meilleure façon d’obtenir une photo dépend du type de contact à partir duquel vous souhaitez obtenir une photo.

Tableau 1. Technologies à utiliser pour obtenir des photos de l’utilisateur en fonction du type de contact

Type de contact Technologies à utiliser
Photo d’utilisateur de boîte aux lettres
Obtenir une photo d’utilisateur de boîte aux lettres à l’aide de REST

Obtenir une photo de l’utilisateur à l’aide d’EWS
Photo de contact pour les utilisateurs
Obtenir une photo d’utilisateur de contact à l’aide de l’API managée EWS

Obtenir une photo de l’utilisateur à l’aide d’EWS

Obtenir une photo d’utilisateur de boîte aux lettres à l’aide de REST

Vous pouvez demander des photos de l’utilisateur à partir d’un serveur Exchange à l’aide d’une requête Get HTTPS standard. Dans la demande, spécifiez l’adresse du compte de messagerie et un code de taille pour l’image, comme illustré dans l’exemple suivant.

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

Utilisez l’opération GetUserSettings du service de découverte automatique pour récupérer le paramètre ExternalEwsUrl , qui contient l’URL du point de terminaison des services Web Exchange (EWS) et l’emplacement du gestionnaire HTTP . asmx Exchange qui renvoie les photos de l’utilisateur.

Chaque code de taille indique la hauteur et la largeur de l’image en pixels. Par exemple, le code de taille HR48x48 renvoie une image de 48 pixels de haut par 48 pixels de large. Les valeurs possibles pour le paramètre de code de taille sont les mêmes que les valeurs possibles pour l’élément SizeRequested . Si la demande spécifie une taille qui n’est pas disponible, la plus grande photo disponible sera renvoyée. Si aucune photo n’est stockée sur le serveur Exchange, l’image miniature stockée dans AD DS pour le compte sera renvoyée.

Notes

Le code de taille HR48x48 renvoie toujours l’image de miniature AD DS si elle est disponible.

L’exemple suivant montre comment utiliser la requête GET pour récupérer la photo de l’utilisateur pour Sadie et l’enregistrer sur votre ordinateur 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 demande renverra une réponse HTTP.

Tableau 2. Codes de réponse pour une demande GetUserPhoto

Code de réponse Description
200
Une image est disponible pour le compte de messagerie spécifié et l’image binaire est contenue dans la réponse.
304
L’image n’a pas changé depuis le dernier renvoi de l' ETag à l’application.
404
Aucune image n’est disponible pour le compte de messagerie spécifié.

Mettre en cache les photos des utilisateurs

Exchange renvoie les données avec un type de contenu image/JPEG, ainsi qu’une collection de valeurs d’en-tête. L’en-tête ETag est similaire à une clé de modification. La valeur est une chaîne qui représente la dernière fois que la photo a été mise à jour. L' ETag reste identique pour la photo de l’utilisateur jusqu’à ce que la photo soit modifiée. Vous pouvez envoyer cette valeur ETag au serveur dans la requête Get https dans un en-tête If-None-Match . Si la photo n’a pas changé depuis la dernière demande, le serveur répond par une réponse HTTP 304 qui indique en tant que telle. Cela signifie que vous pouvez utiliser la photo de l’utilisateur que vous avez précédemment demandée et enregistrée au lieu d’en traiter une nouvelle.

Obtenir une photo d’utilisateur de contact à l’aide de l’API managée EWS

Votre application peut utiliser l’API managée EWS pour récupérer des photos pour des contacts, si le contact est stocké dans un dossier de contacts dans la boîte aux lettres de l’utilisateur. Pour ce faire, recherchez d’abord l' ID ItemId pour le contact que vous souhaitez utiliser. Ensuite, une fois que vous êtes lié à ce contact, chargez-le dans la collection de pièces jointes. Si le contact a une photo, la photo sera l’une des pièces jointes. Parcourez la collection Attachments, en vérifiant la valeur de la propriété IsContactPhoto . Lorsque vous trouvez la photo de contact, vous pouvez l’enregistrer sur votre ordinateur local et votre application peut y accéder.

L’exemple suivant illustre ce processus. Cet exemple suppose que le service est un objetExchangeService valide et que l’utilisateur a bien été authentifié pour un serveur 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);
   }
}

Obtenir une photo de l’utilisateur à l’aide d’EWS

Si vous obtenez une photo d’utilisateur à partir d’AD DS, vous pouvez utiliser l’opération GetUserPhoto (si vous connaissez l’adresse de messagerie) ou l’opération ResolveNames (si vous ne connaissez pas l’adresse de messagerie). Si vous obtenez une photo de l’utilisateur à partir d’un dossier de contacts dans la boîte aux lettres, utilisez l’opération GetItem suivie de l’opération GetAttachment . Dans les deux cas, la photo est renvoyée sous la forme d’une chaîne codée en Base64 dans la réponse XML.

Obtenir une photo d’utilisateur de boîte aux lettres à l’aide de l’opération GetUserPhoto

L’utilisation de l’opération GetUserPhoto est simple. Dans la requête XML, spécifiez l’adresse de messagerie de l’utilisateur et la taille de la photo à renvoyer (dans l’élément SizeRequested ). L’exemple de requête XML suivant montre comment obtenir une photo pour Sadie Daniels d’une largeur de 360 pixels sur une hauteur de 360 pixels.

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

Voici la réponse XML. La photo codée en base64 est contenue dans l’élément PictureData (le contenu a été raccourci pour des raisons de lisibilité).

<?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="https://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>

Obtenir une photo d’utilisateur de boîte aux lettres à l’aide de l’opération ResolveNames

Si vous ne connaissiez pas l’adresse de messagerie de l’utilisateur pour lequel vous obtenez une photo, vous pouvez utiliser l’opération ResolveNames pour obtenir les candidats pour une correspondance possible. Si vous spécifiez « AllProperties » pour l’attribut ContactDataShape de l’élément ResolveNames , beaucoup de données, y compris les photos des utilisateurs, seront renvoyées pour chaque candidat. L’exemple suivant montre la requête XML pour résoudre le nom « Sadie » et renvoyer toutes les propriétés de chaque candidat.

<?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="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="https://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>

Un grand nombre de données seront renvoyées dans la réponse. L’exemple suivant montre uniquement les données relatives à la photo de l’utilisateur. L’élément photo contient la photo de l’utilisateur encodé en base64 (le contenu a été raccourci pour des raisons de lisibilité).

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

Obtenir une photo d’utilisateur de contact à l’aide de l’opération GetAttachment

Vous pouvez utiliser EWS pour obtenir des photos à partir de contacts stockés dans votre boîte aux lettres. Tout d’abord, vous utilisez l’opération GetItem pour renvoyer toutes les propriétés afin de pouvoir Rechercher des photos. L’exemple suivant montre une requête XML pour obtenir un élément de contact. L’ID de l’élément a été raccourci pour des raisons de lisibilité.

<?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="https://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <GetItem xmlns='https://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>

Recherchez l’élément haspicture, pour vérifier que le contact a une photo associée. Recherchez ensuite dans la collection de pièces jointes une valeur de true pour l’élément IsContactPhoto . L’exemple de réponse suivant montre uniquement les données pertinentes. Les valeurs d’ID sont raccourcies pour des raisons de lisibilité.

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

Ensuite, utilisez l’opération GetAttachment avec le attachmentid pour demander la pièce jointe contenant la photo de contact. L’exemple suivant montre la requête XML permettant d’obtenir la pièce jointe. L’ID est raccourci pour des raisons de lisibilité.

<?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="https://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <GetAttachment xmlns="https://schemas.microsoft.com/exchange/services/2006/messages"
    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <AttachmentShape/>
      <AttachmentIds>
         <t:AttachmentId Id="1LGlhgpgoA="/>
      </AttachmentIds>
    </GetAttachment>
  </soap:Body>
</soap:Envelope>

L’exemple suivant montre la réponse XML avec les informations sur la pièce jointe que vous avez demandée. L’élément content contient la chaîne codée en base 64 pour la photo de l’utilisateur, raccourcie dans cet exemple pour des raisons de lisibilité.

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

Décoder une chaîne codée en base64

Quelle que soit l’opération que vous utilisez pour obtenir une photo de l’utilisateur, vous devez décoder cette chaîne afin de pouvoir l’utiliser dans votre application. L’exemple suivant montre comment décoder la chaîne, puis l’enregistrer sur votre ordinateur local afin que votre application puisse y accéder ultérieurement.

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

Voir aussi