Основы разработки под Microsoft Exchange Server
На форуме TechNet Microsoft каждый день появляются новые вопросы, касающиеся разработки для Exchange\Exchange Online. Актуальными на сегодняшний день являются два метода разработки: с использованием веб-сервисов (EWS Exchange и другие) и без их использования. В этой статье рассмотрим оба варианта и обозначим их плюсы и минусы.

Передаю слово автору.
Microsoft Exchange Server — серверный программный продукт для обмена сообщениями и совместной работы. Exchange предоставляет не просто очень мощную систему обмена сообщениями E-Mail, но качественно более обширный диапазон функционала. Помимо функции почтового сервера, Exchange можно использовать для обмена документами, создания общих календарей, обмена голосовыми сообщениями и многое другое. Более подробно о Exchange Server можно узнать на сайте.
История продукта более подробно описана по ссылке.
В современном динамически-меняющемся мире очень важно быть на плаву. Требования к продукту, который компания будет использовать, могут не поддерживаться производителем. Служба безопасности частенько ставит нерешаемые задачи.
Основные цели для разработки следующие:
- Выполнение требований-ограничений
- Предоставление нового функционала, часто на стыке нескольких продуктов (например, автоматическое назначение или перенаправление заявок в ServiceDesk через почту)
- Предоставление другого интерфейса (например, мобильное приложение)

На сегодняшний день основные способы разработки ведутся с использованием EWS Exchange, REST API и других веб- и не веб-сервисов.
Про миграцию со старых способов разработки на более новые можно почитать тут.
А пока поговорим немного подробнее о каждом из них.
Разработка с помощью EWS
EWS Exchange и другие веб-сервисы позволяют получить доступ к данных почтового ящика в Exchange Online или в локальной версии Exchange, начиная с Exchange Server 2007. Предоставляют возможность создания пользовательских или серверных приложений с непосредственным доступом к пользовательским данным.
Таких технологий в данный момент несколько:
- EWS, EWS Managed API и EWS Java API
- Autodiscover POX/SOAP
- REST APIs for Office 365
- Unified Messaging (UM) (старый сервис, лучше использовать EWS Managed API)
Операции EWS можно вызвать из любой операционной системы и с помощью любого языка, потому что при обработке запросов и откликов EWS используется протокол SOAP. Важная составляющая кода — это XML-код, который используется для создания запросов EWS и возврата XML-откликов с сервера.
Теперь Managed API EWS доступен в виде проекта с открытым кодом на сайте GitHub.
С помощью библиотеки с открытым кодом вы можете:
- добавлять исправления ошибок и улучшения в API;
- получать исправления ошибок и улучшения до того, как они станут доступны в официальном выпуске;
- получать доступ к самой полной и актуальной реализации API, которую можно использовать для справки или для создания новых библиотек на новых платформах.
Служба Autodiscover предоставляет информацию о конфигурации, которую приложение использует для создания соединения с сервером Exchange. Вы можете использовать службу Autodiscover SOAP для отправки сообщений между клиентским приложением и сервером Exchange для определения параметров, которые приложение будет использовать для подключения к Exchange. Служба Autodiscover SOAP (в отличие от Autodiscover POX) предоставляет пакетные запросы настройки Autodiscover и более подробный контроль над тем, какие параметры возвращаются в ответ. Autodiscover SOAP более современная версия и рекомендуется использовать ее.
REST API (API почты, календарей и контактов) упрощают программирование на Exchange, предоставляя знакомый синтаксис, разработанный с открытым доступом (например, поддержка открытых стандартов JSON, OAUTH, ODATA) и гибкость (например, гранулированный доступ к данным пользователя). Эти API-интерфейсы позволяют разработчикам подключаться с любой платформы, будь то веб-сайт, ПК или мобильный клиент. SDK существуют для .NET, iOS, Android, NodeJS, Ruby, Python, Cordova и CORS для использования в одностраничных веб-приложениях JavaScript.
Это дает следующие преимущества:
- Поскольку эти API требуют OAuth для аутентификации, ваше приложение не должно обрабатывать или хранить учетные данные пользователя.
- OAuth позволяет запрашивать разрешенным пользователем только определенные данные. Например, вы можете создать свое приложение для запроса чтения только календаря пользователя.
Разработка без использования веб-служб Exchange
Разработку без использования веб-сервисов или с минимальным использованием можно разделить на несколько направлений:
- Кастомные транспортные агенты, которые расширяют встроенный функционал (например, пересылка всех сообщений в другую организацию для внутренних пользователей перед отправкой или отправка сообщений, опираясь на домен отправителя)
- Программы или интерфейсы, использующие Powershell (например, программа для ServiceDesk с определенными скриптами или интерфейс для хостинга Exchange)
- Мобильные клиенты или приложения, использующие ActiveSync
- Утилиты Enterprise уровня (резервное копирование, антиспам\антивирус, миграции)
- Утилиты более узкого назначения (низкого уровня, например, на C\C++)
На следующем рисунке показано, где в транспортном конвейере транспортные агенты могут регистрироваться на события.

Когда сообщение входит в транспортный конвейер, агент транспорта, полученный из класса SmtpReceiveAgent, может воздействовать на сообщение во время любого из событий SMTP, для которых зарегистрирован агент. Агент, полученный из класса RoutingAgent, может действовать на любом из четырех событий классификатора, для которых он зарегистрировался. Агент, полученный из класса DeliveryAgent, может воздействовать на сообщение во время любого из событий доставки, на которые он зарегистрировался.
Exchange Management Shell предоставляет богатый набор команд на платформе Windows PowerShell для управления Exchange Online или локальную версию Exchange, начиная с Exchange 2013. Вы можете использовать Exchange Management Shell для создания двух видов инструментов: сценарии командной строки, которые работают в среде Windows PowerShell, и инструменты, которые используют командлеты Exchange Management Shell через управляемый интерфейс. Вы можете использовать управляемые приложения для создания стандартного пользовательского интерфейса Windows или веб-интерфейса для администрирования сервера Exchange.
Как пример такого приложения можно посмотреть GUI интерфейс для миграции данных в облако по ссылке.
Протокол Exchange ActiveSync предназначен для прямой синхронизации мобильных устройств с Exchange, включая легкие клиенты, такие как приложение Windows 8 Mail и Calendar, которое может использоваться в мобильных сценариях. Exchange ActiveSync оптимизирован для приложений с низкой пропускной способностью, таких как приложения для обмена сообщениями, которые выполняются на мобильных устройствах. Усовершенствования протокола Exchange ActiveSync в первую очередь поддерживают стабильность и надежность для сценариев мобильных устройств. ActiveSync открытый протокол, более подробную информацию о нем можно посмотреть по ссылке.
Если зайти на google play и набрать в поиске Exchange activesync, то мы получим более 100 результатов приложений, написанных для Exchange, использующих activesync.
Несмотря на то, что почти каждый телефон имеет встроенную поддержку AS, большинство заказчиков хочет расширить его функциональность такими вещами, как двухфакторная аутентификация, контейнеры и т.д.
Для крупных фирм важно иметь высокую доступность данных, организованность процессов и возможность точного планирования. В связи с этим на рынке ПО есть огромное количество приложений, обеспечивающий подобный функционал. По направлениям, например, утилит архивирования почты более сотни, можно посмотреть информацию о самых крупных компаниях на странице Magic Quadrant for Enterprise Information Archiving.
При этом для каждого ПО выбираются свои языки программирования и способы реализации. Компании могут использовать множество предоставленных возможностей для составления архитектуры и принципов работы приложений. Например, для утилит резервного копирования и восстановления есть раздел на MSDN, описывающий подробно все процессы по ссылке.
Также для многих служб и процессов существуют дополнительные API для написания программ на С\С++ для более узконаправленных запросов и программ. Например, для ESE можно посмотреть по ссылке.
Программировать или не программировать решать каждой компании самой, но стоит признать, что Exchange имеет огромные возможности для расширения функционала и предоставляет все средства для этого.
Что такое Microsoft Exchange и как он работает?

Если вы когда-либо работали в офисе, вы, вероятно, слышали о Microsoft Exchange, но вы можете не знать, что это такое. В этой статье мы опишем, что такое MS Exchange, и как вы можете взаимодействовать с ним прямо сейчас, даже не зная об этом.
Что такое Microsoft Exchange?
Exchange — это сервер Microsoft для групповой работы, изначально разработанный для корпоративных клиентов. Как и другие решения для групповой работы, он включает в себя коммуникационные и организационные функции, в том числе:
- Почтовый хостинг
- Компонент календаря, включая функции совместной работы, такие как приглашения на собрания, общие календари и доступные для бронирования ресурсы.
- Управление контактами, обеспечивающее общеорганизационную адресную книгу, а также хранилища личных контактов
- Совместное управление задачами, например, возможность делегировать задачи другому пользователю
- Липкие заметки, файлы и другие
Сам Exchange является серверным приложением, которое хранит и управляет всеми этими данными для вас. Итак, как серверная программа, как это влияет на вас? Ну, это движок, который поддерживает два инструмента, которые вам могут быть знакомы: Microsoft Outlook и его двоюродная сестра в Интернете, Outlook Web Access.
Microsoft Outlook и Exchange
Вы можете настроить Microsoft Outlook для сбора электронной почты из различных источников, от почтенных почтовых ящиков IMAP до Gmail. Но с самого начала Outlook был разработан для корпоративных пользователей, чтобы они могли подключаться к серверам Exchange и собирать электронную почту или обновлять календари своих компаний.

В нем использовалась собственная технология Microsoft ActiveSync , а в последнее время — открытый интерфейс прикладных программ обмена сообщениями (MAPI). Эти протоколы позволяют клиентам Outlook подключаться, синхронизировать различные типы данных и продолжать работу в автономном режиме.
Подключение Outlook к Exchange, как правило, требует очень небольшого взаимодействия с пользователями, поскольку оба они предназначены для совместной работы. Но вы можете подключить другие клиенты к Exchange, например, Gmail, хотя для их настройки может потребоваться различное количество усилий.
Exchange и Outlook Web Access
Помимо использования клиентского приложения вы также можете взаимодействовать с сервером Exchange с помощью браузера, если это разрешено вашим администратором. Outlook Web Access (OWA) — это имя интерфейса браузера для вашего сервера Exchange, которое называется так, потому что предоставляет экраны, которые действительно выглядят как веб-версии приложения Outlook.

Чтобы найти ссылку на ваш сайт OWA, если она существует, выберите « Файлы» > « Параметры учетной записи» в Outlook.
Многие люди использовали OWA для мобильного доступа к данным Exchange до того, как приложения Outlook стали доступны. Теперь удобно использовать для входа в свою электронную почту, например, когда у вас нет доступных устройств. Вы можете перейти по заранее определенному URL-адресу (который часто находится в том же домене, что и основной веб-сайт вашей компании), ввести свой адрес электронной почты и пароль, и начать читать электронную почту, просматривать календарь или отмечать задачи.
What std::exchange does, and how to remember it
std::exchange was introduced in the C++ standard library in C++14 under the header <utility> .
Its name suggests that it’s a general-purpose and useful function, and its template prototype working with any type confirms this impression.
I don’t know about you, but I always had a problem with std::exchange : I couldn’t remember what it was doing. I learnt several times the operations that std::exchange performs, but each time I forgot them soon after.
Then at some point it clicked: std::exchange is a setter returning the old value. Ignoring the name “exchange” but thinking of it as a “setter” helped me make it stick to my mind.
It might just be me having a hard time with std::exchange for some reason. But just in case you also have issues remembering the operations of std::exchange , let’s see why std::exchange has this meaning, and why this meaning is not obvious from its name.
This should help you remember it once and for all.
What std::exchange does
Let’s get down to the operations std::exchange performs. Consider the following code:
After this line of code executes:
- x is assigned the value of y ,
- z is assigned the value that x had initially.
This definition is pretty straightforward. But after some time, I just couldn’t remember which value std::exchange assigns to which.
A setter
The job of a setter in a class is to assign the value it receives to one of a data members of the class. Here is the typical implantation of a setter:
There is an (old) programming convention that suggested to make the setter return the old value:
This is by the way not a good practice for classes because the setter now has two responsibilities: getting and setting the value. This leads to confusing calling code.
Let’s now transpose this concept to a free functions assigning to a local object:
setX does the same thing as operator= : it assigns y to x . Let’s now implement the old conventions for classes to this function, to make it return the old value of x :
std::exchange is like the setX of this example.
Why std::exchange is confusing
Despite its very simple meaning, I think std::exchange can be hard to remember because of its name.
To me, “exchange” sounds like two parties exchanging something: one receives what the other gives it. With this meaning, std::exchange sounds very close to std::swap . But in reality std::exchange does something very different from std::swap .
If we think of std::exchange as it if was named std::set or std::setAndGetOldValue , it is clear that it has nothing to do with std::swap and its meaning becomes obvious, and easy to remember.
How std::exchange can make code more concise
Now that we’re clear on std::exchange , the next step is to see where to use it.
The next post will be a guest post written by Ben Deane, where he’ll show us how to use std::exchange to make code concise and expressive. Stay tuned!
Exchange c что это
The exchange() function is a built-in function in C++ 14 defined in the <utility> header. The exchange() function copies new value to old value and it will return the old value.
Syntax:
Parameters: The function needs two parameters.
- The parameter needs to be set.
- The parameter with which we wanted to set our parameter 1
Return Value: It returns the old value which means the parameter that needs to be set