Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Программирование в Microsoft Office для пользователей
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

13.4 Объект Namespace

Объект Outlook.Namespace, свойства и методы объекта Outlook.Namespace, получение почты и обработка полученных сообщений из VBA, подключение к папке

Как уже говорилось выше, в Outlook используется понятие пространств имен — нечто вроде драйверов, которые, по замыслу разработчиков Outlook, должны обеспечивать доступ к различным хранилищам пользовательских данных. У каждого такого драйвера должны быть свои возможности. Однако уже на протяжение долгого времени в Outlook используется единственное пространство имен — MAPI, и пока нет никакой информации о том, что должно появиться что-то еще. Для наших целей пространство имен Outlook можно рассматривать просто как специальный служебный объект, в который "переехали" некоторые свойства и методы объекта Application.

Если в вашей программе вам нужны свойства или методы объекта Namespace, получить ссылку на этот объект можно двумя способами:

  • Воспользоваться методом GetNameSpace() объекта Application:

Set oNameSpace =Application.GetNamespace("MAPI")

  • Воспользоваться свойством Session того же объекта Application:

Set oNameSpace = Application.Session

Эти две строки кода по функциональности полностью равнозначны, но в документации обычно всегда используется только первый способ.

Зачем нам нужен объект Namespace? Для выполнения самых распространенных операций с электронной почтой: установка соединения с сервером электронной почты, отправки и получения электронной почты, выбора нужной папки, работы со адресными книгами. Кроме того, объект Namespace представляет еще и виртуальный корень всех папок Exchange, при помощи которого можно циклом проходить по всем папкам в Exchange. Объект Namespace в практической работе используется очень часто.

Например, предположим, что вам нужно из Outlook скачать почтовые сообщения для всех учетных записей электронной почты и что-то сделать с каждым полученным сообщением. В нашем примере мы будем просто выводить тему каждого сообщения, на практике, возможно, мы "разбирали" бы каждое сообщение в стандартном формате и помещали из него информацию в базу данных. Такое решение может пригодится при обработке информации, получаемой из филиалов, с Web-сайта предприятия, который находится у провайдера, от торговых представителей, которые находятся в командировке и т.п.

Как может выглядеть подобное сообщение?

Представим себе, что мы работаем из внешнего приложения. Удобнее всего нам будет использовать форму Word или Excel — чтобы работа с событиями производилась из окна редактора кода. Первое, что нужно сделать — поместить в проект ссылку на объектную библиотеку Microsoft Outlook 11.0 Object Library.

Затем мы занимаемся привычным делом — создаем самую обычную форму VBA и помещаем в нее кнопку с именем по умолчанию CommandButton1. После этого можно писать код для нашей формы. Необходимый код для формы с комментариями может выглядеть так:

'Региструем события для некоего абстрактного объекта Outllok.Items

'в разделе ( General ) ( Declarations )

'После этого объект oItems с событиями появится в окне редактора кода

Public WithEvents oItems As Outlook.Items

Private Sub CommandButton1_Click()

'Запускаем Outlook

Dim oOutlook As New Outlook.Application

'Очень важно: объясняем, что события oItems  — это события папки Inbox в Outlook

Set oItems = oOutlook.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items

'Дальше просто запускаем прием почты со всех учетных записей

Dim oNamespace As Outlook.NameSpace

Set oNamespace = oOutlook.GetNamespace("MAPI")

oNamespace.SyncObjects("Все учетные записи").Start

End Sub

'… и ловим события появления нового сообщения

Private Sub oItems_ItemAdd(ByVal Item As Object)

MsgBox Item.Subject

End Sub

В документации Microsoft для события ItemAdd указано, что оно может не срабатывать, если в папку разом добавляется большое количество элементов, но у меня он всегда работал надежно.

Конечно, если у вас на предприятии установлен Exchange Server, то для обработки всей входящей электронной почты правильнее использовать серверные скрипты Exchange и его событийную модель. Но реальная жизнь, как всегда, сложнее. Например, часто за Exchange Server отвечает администратор сети, который совершенно не собирается разрешать разработчикам настраивать на нем какие-то скрипты. Другой вариант — на вашем предприятии работает не Exchange, а, к примеру, почтовая система на Unix — SendMail, PostFix, CommunigatePro или что-нибудь в этом роде. Чтобы разобраться с их событиями, может потребоваться много времени и усилий, а Outlook под рукой всегда.

А теперь, как обычно — информация о самых важных свойствах и методах объекта Namespace:

  • AddressLists — это свойство возвращает коллекцию AddressLists, в которой находятся объекты AddressList, представляющие все адресные книги, доступные в настоящий момент. Например, получить список всех доступных в настоящий момент для пользователя адресных книг можно так (подразумевается, что вы работаете с Outlook из внешнего приложения):

Dim oOutlook As New Outlook.Application

Dim oNameSpace As Outlook.NameSpace

Dim oAddress As Outlook.AddressList

Set oNameSpace = oOutlook.GetNamespace("MAPI")

For Each oAddress In oNameSpace.AddressLists

Debug.Print oAddress.Name

Next

В объекте AddressList находится коллекция AddressEntries с объектами AddressEntry , представляющие записи в адресных книгах. При помощи этой объектной "ветви" вы можете программным способом добавлять объекты в адресную книгу, удалять их, изменять свойства и т.п. Если Outlook у вас работает сам по себе, в этом нет никакого смысла — единственной доступной для пользователя адресной книгой будут являться Контакты, с которыми проще работать другим способом (при помощи объектов ContactItem), Но если Outlook подключен к Exchange Server, то эта возможность становится очень интересной.

  • CurrentUser — еще одно очень полезное свойство. Возвращает информацию о текущем пользователе (том, от имени которого открыт Outlook) в виде объекта Recipient, при помощи которого, можно получить, например, об адресе электронной почты данного пользователя, его имени и прочих атрибутах, которые предусмотрены для записи в списке адресов (если они для пользователя определены). Например, получить доступ к информации об адресе электронной почты текущего пользователя можно так:

Set oNameSpace = Application.GetNamespace("MAPI")

Set oRecipient = oNameSpace.CurrentUser

Debug.Print oRecipient.Address

К сожалению, попытка выполнить этот код из внешнего приложения приведет к тому, что появится окно сообщения с вопросом: хотите ли предоставить программе доступ к адресам электронной почты в Outlook? Скорее всего, это окно вам совершенно не нужно, но оно было сделано специально в целях безопасности и избежать его вам не удастся. В вашем распоряжении два варианта: программно имитировать нажатие клавиш <Shift>+<Tab> и <Enter> в этом окне (заботливые разработчики отключили даже горячую клавишу для кнопки Да) или запускать этот код из уже работающего Outlook — тогда предупреждения не возникает. Для программной имитации нажатий клавиш можно использовать объект WshShell объектной библиотеки Windows Script Host, но поскольку при выполнении кода VBA ошибки не происходит, а просто "подвисает" строка Debug.Print oRecipient.Address, то возникают дополнительные сложности.

  • ExchangeConnectionMode — очень важное для практической работы свойство. Оно позволяет определить, настроен ли Outlook для работы с Exchange Server и подключен ли он к Exchange Server в настоящий момент.
  • Folders — видимо, самое главное свойство объекта Namespace. Возвращает коллекцию Folders с объектами MAPIFolder, представляющими папки верхнего уровня в Outlook (у каждой папки есть свое свойство Folders, так что вы вполне сможете пройти циклом по всем без исключения папкам Outlook). Помимо того, что у папок Outlook множество своих собственных важных свойств и методов, через свойство Items папки вы можете получить доступ ко всем элементам папки (сообщениям, контактам, элементам календаря и т.п.). Подробнее про коллекцию Folders и объект MAPIFolder будет рассказано в следующем разделе.
  • Offline — возможность выяснить, подключен ли в настоящее время Outlook к серверу электронной почты или отключен.
  • SyncObjects — возвращает одноименную коллекцию с объектами SyncObject (объекты синхронизации). Сами эти объекты представляют группы отправки (то, что при помощи графического интерфейса Outlook можно найти в меню Сервис -> Отправить/Получить. Самое важное, что можно сделать при помощи объектов SyncObject — возможность программно инициировать соединение с сервером электронной почты или его разорвать.

Обычно в приложениях, использующих объектную модель Outlook, без методов объекта Namespace также не обойтись:

  • AddStore() и AddStoreEx() — возможность программно открыть файл хранилища сообщений Outlook ( .PST) на диске. Обратите внимание: если такого файла на диске нет, Outlook при вызове этого метода просто создаст его. AddStoreEx() отличается тем, что позволяет указать кодировку для файла сообщений. Закрыть файл PST можно при помощи метода RemoveStore().
  • CreateRecipient() — возможность программным образом создать объект Recipient. Обычно используется для передачи метода GetSharedDefaultFolder(), используемым для подключения к папке в чужом почтовом ящике.
  • Dial() — позволяет открыть диалоговое окно Новый звонок, чтобы пользователь мог установить коммутируемое соединение. В качестве необязательного параметра принимает имя контакта, который будет автоматически подставлен в это окно.
  • GetDefaultFolder() — важнейший метод, возвращающий объект MAPIFolder для одной из двенадцати встроенных (используемых по умолчанию) папок Outlook: Входящие, Контакты, Календарь, Отправленные и т.п. Например, подключиться к папке Контакты (и для наглядности открыть ее) можно так:

Dim oOutlook As New Outlook.Application

Set oNameSpace = oOutlook.GetNamespace("MAPI")

Set oInbox = oNameSpace.GetDefaultFolder(olFolderContacts)

oInbox.Display

  • методы Get…FromID() обычно используются только тогда, когда вы переводите свой код, написанный с использованием объектной библиотеки CDO (о ней — ниже в этой главе) на использование объектной модели Outlook.
  • GetSharedDefaultFolder() — этот метод делает то же, что и GetDefaultFolder(), но применяется тогда, когда у пользователя в Outlook открыты, кроме своего, еще и почтовые ящики других пользователей, и получить ссылку, например, на папку Inbox в определенном почтовом ящике.
  • Logon() — позволяет установить соединение по протоколу MAPI (читайте: установить соединение с Exchange Server). В качестве необязательных параметров принимает имя почтового профиля, параметр, определяющий, показывать или пользователю диалоговое окно выбора профиля и т.п. Рассоединение производится при помощи метода Logoff().
  • PickFolder() — открывает диалоговое окно Выбор папки. Если пользователь выбрал папку в этом окне и нажал OK, то возвращает объект MAPIFolder для выбранной папки.

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 
© 2004-2016, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru