Подключение к Exchange через MAPI библиотеки

24.04.2014

Существует способ работы с почтовым ящиком MS Exchnage с сервера MS Windows 2008 без установки MS Outlook на сервер. Для обращения к почтовому серверу по MAPI протоколу можно использовать библиотеки Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1, которые позволяют создавать сессии к почтовому серверу из программных средств через COM-объекты CDO. Это удобно и более совершенно, чем использовать на сервере MS Outlook, который не позволяет автоматизировать работу из-за политик безопасности программы - происходит блокировка запросов из внешних программ при обращении к COM-объектам Outlook.

Для того, чтобы работать с почтовым ящиком MS Exchange с сервера необходимо выполнить несколько подготовительных шагов:

  1. Убедиться, что на сервере нет MS Outlook.
  2. Установить библиотеки Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1.
  3. Создать профиль (или несколько профилей) подключения к почтовому серверу через программу MFCMAPI. (Инструкцию по созданию профиля можно посмотреть на сайте Microsoft, а сам профиль можно найти в реестре по пути HCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\MS Exchange Settings).

После подготовительных шагов можно приступать к программированию. Например, можно обрабатывать почтовый ящик с помощью VB.NET или VBScript.

Пример программы на VB.NET

Module Module1

   Sub Main()
       Dim oMAPISession As New MAPI.Session
       Dim oFolder As MAPI.Folder
       Dim oMessages As MAPI.Messages
       Dim oMessage As MAPI.Message
       Dim iUnread, iRead As Integer

       ' вход в почтовый ящик по имени настроенного профиля
       oMAPISession.Logon("MS Exchange Settings")

       ' открытие папки Inbox
       oFolder = oMAPISession.Inbox
       Console.WriteLine("Folder name: " & oFolder.Name)

       ' получение количества сообщений в папке
       Try
           oMessages = oFolder.Messages
           Console.WriteLine("Number of messages: " & oMessages.Count)
           iUnread = 0
           iRead = 0
           oMessage = oMessages.GetFirst
           While Not oMessage Is Nothing
               If oMessage.Unread = True Then
                   iUnread = iUnread + 1
               Else
                   iRead = iRead + 1
               End If
               oMessage = oMessages.GetNext
           End While
           Console.WriteLine("Number of unread messages = " & iUnread)
           Console.WriteLine("Number of read messages = " & iRead)
       Catch ex As Exception
           Console.WriteLine("Error: " & ex.Message)
       End Try

       Console.WriteLine()
       Console.WriteLine("Press ENTER to continue")
       Console.ReadLine()

       ' получение текста последнего сообщения
       Try
           oMessages = oFolder.Messages
           oMessage = oMessages.GetLast
           Console.WriteLine("The message text: " & oMessage.Text)
       Catch ex As Exception
           Console.WriteLine("Error: " & ex.Message)
       End Try

       Console.WriteLine()
       Console.WriteLine("Press ENTER to continue")
       Console.ReadLine()

       ' выход из почтового ящика
       oMAPISession.Logoff()

   End Sub

End Module
Примечание. В ссылки библиотек проекта необходимо добавить библиотеку Microsoft CDO 1.21 Library.

Пример сценария на VBScript

Set oMAPISession = CreateObject("MAPI.Session")
' вход в почтовый ящик по имени настроенного профиля
oMAPISession.Logon("MS Exchange Settings")
' открытие папки Inbox
Set oFolder = oMAPISession.GetDefaultFolder(1)
wscript.echo "Folder name: " & oFolder.Name
' получение количества сообщений в папке
Set oMessages = oFolder.Messages
wscript.echo "Number of messages: " & oMessages.Count
' выход из почтового ящика
oMAPISession.Logoff
Внимание! Обработчик VBS надо запускать в 32-битном режиме. То есть использовать исполняемый файл из C:\Windows\SysWOW64\cscript.exe.