Получение фотографий пользователей с помощью EWS в Exchange
Узнайте, как получить фотографии пользователей, связанные с почтовым ящиком или контактом, с помощью управляемого API EWS или EWS в Exchange.
Приятно поставить лицо к имени. Если пользователям нравится ставить имена на лица, приложение может запросить изображение (обычно фотографию) из Exchange, которая представляет учетную запись электронной почты. Вы можете получить фотографию пользователя, хранящуюся на сервере Exchange Server для почтового ящика, или получить фотографию контакта из контактов, хранящихся в почтовом ящике.
Вы можете использовать несколько различных технологий для получения фотографий из почтовых ящиков или доменные службы Active Directory (AD DS). Лучший способ получить фотографию зависит от типа контакта, из которого вы хотите получить фотографию.
Таблица 1. Технологии, используемые для получения фотографий пользователей на основе типа контакта
Тип контакта | Используемые технологии |
---|---|
Фотография пользователя почтового ящика |
Получение фотографии пользователя почтового ящика с помощью REST Получение фотографии пользователя с помощью EWS |
Контактная фотография пользователя |
Получение фотографии пользователя контакта с помощью управляемого API EWS Получение фотографии пользователя с помощью EWS |
Получение фотографии пользователя почтового ящика с помощью REST
Вы можете запросить фотографии пользователей с сервера Exchange Server с помощью стандартного запроса HTTPS GET . В запросе укажите адрес учетной записи электронной почты и код размера для изображения, как показано в следующем примере.
https://Exchange Server/ews/Exchange.asmx/s/GetUserPhoto?email=email address&size=size code
Используйте операцию GetUserSettings службы автообнаружения, чтобы получить параметр ExternalEwsUrl , который содержит URL-адрес конечной точки веб-служб Exchange (EWS) и расположение обработчика HTTP Exchange.asmx , который возвращает фотографии пользователей.
Каждый код размера указывает высоту и ширину изображения в пикселях. Например, код размера HR48x48 возвращает изображение высотой 48 пикселей и шириной 48 пикселей. Возможные значения для параметра кода размера совпадают с возможными значениями для элемента SizeRequested . Если в запросе указан размер, который недоступен, будет возвращена самая большая доступная фотография. Если на сервере Exchange server не хранится фотография, будет возвращен эскиз, хранящийся в AD DS для учетной записи.
Примечание.
Код размера HR48x48 всегда возвращает изображение эскиза AD DS, если оно доступно.
В следующем примере показано, как с помощью запроса GET получить фотографию пользователя для Сэди и сохранить ее на локальном компьютере.
// 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");
}
Запрос вернет HTTP-ответ.
Табл. 2. Коды ответов для запроса GetUserPhoto
Response code (Код ответа) | Описание |
---|---|
200 |
Для указанной учетной записи электронной почты доступно изображение, а двоичное изображение содержится в ответе. |
304 |
Изображение не изменилось с момента последнего возвращения ETag в приложение. |
404 |
Изображение не доступно для указанной учетной записи электронной почты. |
Кэшировать фотографии пользователей
Exchange возвращает данные с типом контента image/jpeg, а также коллекцией значений заголовков. Заголовок ETag аналогичен ключу изменения. Значение представляет собой строку, представляющую время последнего обновления фотографии. ETag остается неизменным для фотографии пользователя до тех пор, пока фотография не будет изменена. Это значение ETag можно отправить на сервер в запросе HTTPS GET в заголовке If-None-Match . Если фотография не изменилась с момента последнего запроса, сервер ответит ответом HTTP 304, указывающим как таковой. Это означает, что вы можете использовать ранее запрошенную и сохраненную фотографию пользователя, а не обрабатывать новую.
Получение фотографии пользователя контакта с помощью управляемого API EWS
Приложение может использовать управляемый API EWS для получения фотографий контактов, если контакт хранится в папке контактов в почтовом ящике пользователя. Для этого сначала найдите ItemId для контакта, которого вы хотите использовать. Затем после привязки к контакту загрузите его в коллекцию вложений. Если у контакта есть фотография, фотография будет одним из вложений. Выполните цикл по коллекции вложений, проверив значение свойства IsContactPhoto . Когда вы найдете фотографию контакта, вы можете сохранить ее на локальном компьютере, а приложение сможет получить к ней доступ.
В следующем примере показан этот процесс. В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь прошел проверку подлинности на сервере Exchange server.
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);
}
}
Получение фотографии пользователя с помощью EWS
Если вы получаете фотографию пользователя из AD DS, можно использовать операцию GetUserPhoto (если вы знаете адрес электронной почты) или операцию ResolveNames (если вы не знаете адрес электронной почты). Если вы получаете фотографию пользователя из папки контактов в почтовом ящике, используйте операцию GetItem , за которой следует операция GetAttachment . В любом случае фотография возвращается в виде строки в кодировке Base64 в XML-ответе.
Получение фотографии пользователя почтового ящика с помощью операции GetUserPhoto
Использовать операцию GetUserPhoto очень просто. В XML-запросе укажите адрес электронной почты пользователя и размер возвращаемой фотографии (в элементе SizeRequested ). В следующем примере XML-запроса показано, как получить фотографию для Сэди Дэниелс шириной 360 пикселей и высотой 360 пикселей.
<?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>
Ниже приведен XML-ответ. Фотография в кодировке Base64 содержится в элементе PictureData (содержимое сокращено для удобства чтения).
<?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>
Получение фотографии пользователя почтового ящика с помощью операции ResolveNames
Если вы не знаете адрес электронной почты пользователя, для которого вы получаете фотографию, можно использовать операцию ResolveNames , чтобы получить кандидатов на возможное совпадение. Если указать "AllProperties" для атрибута ContactDataShape элемента ResolveNames , для каждого кандидата будет возвращено много данных, включая фотографии пользователей. В следующем примере показан XML-запрос для разрешения имени "Сэди" и возврата всех свойств для каждого кандидата.
<?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>
В ответе будет возвращено много данных. В следующем примере показаны только данные, относящиеся к фотографии пользователя. Элемент Photo содержит фотографию пользователя в кодировке Base64 (содержимое сокращено для удобства чтения).
<?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>
Получение фотографии пользователя контакта с помощью операции GetAttachment
Вы можете использовать EWS для получения фотографий из контактов, хранящихся в почтовом ящике. Во-первых, вы используете операцию GetItem , чтобы вернуть все свойства, чтобы можно было искать фотографии. В следующем примере показан XML-запрос для получения элемента контакта. Идентификатор элемента сокращен для удобства чтения.
<?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>
Найдите элемент HasPicture , чтобы убедиться, что у контакта есть связанная фотография. Затем просмотрите коллекцию вложений для объекта со значением true для элемента IsContactPhoto . В следующем примере ответа показаны только соответствующие данные. Значения идентификаторов сокращаются для удобства чтения.
<?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>
Затем используйте операцию GetAttachment с attachmentId , чтобы запросить вложение с фотографией контакта. В следующем примере показан XML-запрос для получения вложения. Идентификатор сокращается для удобства чтения.
<?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>
В следующем примере показан XML-ответ со сведениями о запрошенных вложениях. Элемент Content содержит строку в кодировке Base64 для фотографии пользователя, сокращенную в этом примере для удобства чтения.
<?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>
Декодирование строки в кодировке Base64
Независимо от операции, используемой для получения фотографии пользователя, необходимо декодировать эту строку, чтобы ее можно было использовать в приложении. В следующем примере показано, как декодировать строку, а затем сохранить ее на локальном компьютере, чтобы приложение получите к ней доступ позже.
// 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();
}