Объектная модель Microsoft Outlook реализована в виде набора объектов, собранных в библиотеке Outlook.
Объекты приложения Outlook
В табл. 21.3 приведено описание основных объектов из объектной модели Outlook.
Объект | Тип | Описание |
Application | Обьект | Ссылается на активное приложение Microsoft Outlook. Используется для управления приложением |
NameSpace | Объект | Объект представляет собой абстрактный корневой объект для любого источника данных |
AddressLists (AddressLists) | Семейство и объект | Семейство объектов, представляющих адресные книги |
Folders (MAPIFolders) | Семейство и объект | Семейство MAPIFolders объектов, которое представляет любую из доступных папок в их подмножестве на одном уровне дерева папок |
Items (Item) | Объект MAPIFolder | |
Links (Link) | Объект Item | Представляет объект item, который связан с другим объектом item |
User Proper ties (UserProperty) | Объект Item | Данное семейство хранит информацию о нестандартных свойствах элемента Outlook, созданных пользователем |
FormDescription | Объект Item | Этот объект хранит все стандартные свойства элемента Outlook |
Actions (Action) | Объект Item | В этом семействе хранится информация об ассоциированных с данным элементом Outlook командах. Обратите внимание на то, что команды можно вывести, раскрыв в режиме конструктора вкладку Команды |
Attachments (Attachment) | Объект Item | Семейство представляет все вложения в элементе |
Recepients (Recepint) | Объект Item | Это семейство представляет информацию о получателях элемента Outlook |
ReccurencePattern | Объект Item | Данный объект задает шаблон повторения для встреч и задач |
Proper ty Pages (Proper tyPage) | Семейство и объект | Семейство объектов PropertyPage, которые содержат специальные вкладки со свойствами, добавленные к диалоговому окну Параметры в Outlook |
LanguageSet tings | Объект | Предоставляет информацию о языковых настройках приложения |
AnswerWizard | Объект | Соответствует мастеру ответов Microsoft Office. Все приложения Microsoft Office имеют ровно один мастер ответов, поэтому все изменения этого объекта отразятся на активном приложении |
Assistant | Объект | Ссылается на объект, представляющий активного в данный момент Помощника Office |
Search | Объект | Данный объект представляет как простой поиск, так и расширенный поиск |
Reminders (Reminder) | Семейство и объект | Представляет окно Оповещения для всех напоминаний о встречах, задачах и т. д. |
Explorers (Explorer) | Семейство и объект | Семейство объектов Explorer - набор всех окон, в которых отображается содержимое папки |
Selection (Items) | Объект Explorer | Семейство всех отображаемых элементов в окне просмотра информации |
CommandBars (CommandBar) | Объект Explorer | Представляет обычные и контекстные меню, а также панели инструментов объекта |
Panes (Pane) | Объект Explorer | Семейство панелей (окон) Outlook для данного объекта Explorer |
Inspectors (Inspector) | Семейство и объект | Семейство объектов Inspector - набор всех окон, в которых "отображаются элемен- ты Outlook. Элемент (item) - это основной модуль хранения данных в Outlook (подобно файлу в других программах). В число эле- ментов входят почтовые сообщения, встречи, контакты, задачи и т. д. (рис. 21.4) |
WordEditor и HTMLEditor | Объекты | Представляют объекты, посредством которых выбираются редакторы для объекта Inspector |
Pages (Page) | Объект Inspector | Каждый объект inspector связан со своим семейством Pages, в которое входят все обновленные пользователем страницы формы. Если в форму для элемента не вносились изменения, то семейство Pages является пустым |
Item | Объект Inspector | Представляет стандартный элемент Outlook, расположенный в данной папке |
MAPIFolder | Объект | Представляет папку Outlook |
Таблица 21.3. Основные объекты Outlook
В табл. 21.4-21.6 представлено описание основных свойств, методов и событий объекта Application.
Рис. 21.1.
Таблица 21.4. Основные свойства объекта Application
Таблица 21.5. Основные методы объекта Application
Событие | Описание |
AdvancedSearchComplete | Происходит, когда Расширенный поиск заканчивает свою работу |
ItemSend | Происходит, когда элемент посылается либо посредством Inspector, либо посредством метода Send |
MapiLogonComplete | Происходит, когда пользователь входит в систему |
NewMail | Происходит, когда одно или несколько почтовых сообщений приходит в папку Входящие |
OptionPagesAdd | Происходит, когда открывается диалоговое окно Параметры |
Reminder | Происходит непосредственно перед оповещением о встрече, задаче или собрании |
Startup | Происходит сразу после загрузки приложения Outlook |
Quit | Происходит, когда Outlook закрывается |
Таблица 21.6. События объекта Application
Объекты MAPIFolderv и Mailltem
Поскольку в примерах этой главы и следующей используются свойства и методы объектов MAPIFolder и Mailltem, мы сочли необходимым привести их краткое описание.
Объект MAPiFoider, как было сказано выше, представляет папку Outlook. Объект MAPiFoider может содержать другие MApiFoider-объекты. В этом случае вы можете управлять доступом к вложенным папкам посредством комбинации Folder (индекс), где индекс возвращает объект MAPiFoider.
Outlook имеет специальный набор папок, которые поддерживают заданную по умолчанию функциональность Outlook. Для доступа к этим папкам следует Использовать метод GetDefaultFolder(индекс), где индекс - одна ИЗ констант olDefauitFoiders, например olFoiderinbox возвращает папку Входящие.
В табл. 21.7 приведены основные свойства объекта MAPiFoider, а в табл. 21.8 - его методы.
Таблица 21.7. Свойства объекта MAPiFolder
Таблица 21.8. Методы объекта MAPiFolder
Несколько слов об объекте Mailitem. Он представляет почтовое сообщение в папке Входящие (Inbox). Мы рассмотрим только необходимые для примера свойства и методы этого-объекта.
Свойство Messageciass возвращает или устанавливает класс сообщения для элемента Outlook. Свойство Messageciass связывает элемент с формой, на которой он основан. Когда элемент выбран, Outlook использует класс сообщения, чтобы поместить соответствующую форму и установить свойства элемента.
Свойство RecievedTime возвращает дату и время получения сообщения. Метод Display отображает новый объект inspector для выбранного элемента.
В программе 21.3 открываются все почтовые сообщения, поступившие за последние сутки.
Программа 21.3. Открытие почтовых сообщений
Sub openLastMail () Dim oa As Outlook.Application
Dim ns As NameSpace ; Dim fl As MAPiFolder Dim ob As Object Dim it As Mailitem
Dim i As integer
Set oa = CreateObject("OutLook.Application") Set ns = oa.GetNamespace("MAPI") Set fl = ns.GetDefaultFolder(olFolderlnbox) For i = 1 To f1.Items.Count Set ob = fl.Items(i) On Error GoTo nextitem If ob.MessageClass = "IPM.Note" Then Set it = ob If it.ReceivedTime > Date - 1 Then
it.Display (False) End If End If nextitem:
Замечание
Для семейств Outlook нельзя воспользоваться оператором For Each Next, поэтому применяется цикл For . . . Count.
Как и у всех приложений Office, на вершине объектной модели Outlook находится объект Application. Его можно использовать для запуска Outlook из внешних приложений. Отличительной особенностью объекта Application в Outlook является относительно небольшое количество свойств и методов (за счет того, что часть из них переехала в объект Namespace).
Наиболее часто используемые свойства объекта Application
- Explorers - это свойство возвращает коллекцию Explorers с объектами Explorer, каждый из которых представляет собой папку Outlook, открытую на просмотр пользователем. Назначение - проверка, не открыта ли уже пользователем в Outlook та или иная папка, и, в зависимости от результата, активизация этого окна (Explorer.Activate()) или его закрытие (Explorer.Close()).
- Inspectors - возвращает коллекцию Inspectors с объектами Inspector. Inspector представляют не открытые папки Outlook, как Explorer, а открытые на просмотр и редактирование элементы (например, почтовые сообщения).
- Reminders - позволяет вернуть коллекцию Reminders с объектами Reminder, представляющими текущие оповещения. Обычно это свойство используется для того, чтобы программным образом отключить все оповещения.
- Session - это свойство позволяет вернуть объект Namespace, представляющий пространство имен для текущего сеанса (т. е. пространство имен MAPI). Это свойство можно использовать вместо метода GetNamespace().
Методы
Методы с префиксом Active... - просто возвращают ссылку на активный в настоящее время объект Explorer или Inspector.
- AdvancedSearch () - очень важный метод. Он позволяет производить поиск по папкам Outlook (что на практике требуется достаточно часто).
- CopyFile () - позволяет скопировать файл с диска в папку Outlook. Можно использовать, например, для переноса всех файлов из каталога с документацией по проекту в общую папку Exchange Server или в библиотеку документов SharePoint Portal Server.
- CreateItem () - метод, который используется очень часто. Он позволяет создать новые элементы в Outlook.
- CreateItemFromTemplate () - точно так же создает новый элемент Outlook, но уже на основе шаблона Outlook в файловой системе - файла oft.
- GetNameSpace () - метод, который используется, наверное, в большинстве программ VBA в Outlook. Позволяет получить объект пространства имен MAPI.
- IsSearchSynchronous () - используется для проверки режима поиска
- Quit () - осуществляет выход из Outlook.
13.2. Некоторые особенности программирования в Outlook
Программирование в Outlook имеет ряд интересных особенностей, о которых необходимо упомянуть.
Первая особенность заключается в том, где именно хранятся программные модули Outlook, в которых мы создаем код. Как мы помним, в Word они хранятся вместе с документами (или шаблонами, например, Normal.dot), в Excel - в файлах рабочих книг, в Access - в файлах баз данных MDB.
В Outlook информация стандартных модулей хранится в файле личных папок PST, который по умолчанию создается в профиле данного пользователя.
В результате, с одной стороны, работа с программным кодом VBA в Outlook упрощается: для данного пользователя на этом компьютере он становится доступен из Outlook всегда. С другой стороны, становится труднее предоставить этот код в распоряжение другого пользователя. В этой ситуации можно использовать два выхода:
первый выход - воспользоваться средствами экспорта и импорта про-
граммных модулей , которые доступны из контекстного меню для модуля в
Project Explorer (рис. 13.2);
Рис. 13.2. Средства импорта и экспорта программного кода
второй выход - создать контейнерное приложение , например, файл
Word или книгу Outlook, из которого программным образом запускать Outlook и выполнять в нем необходимые действия.
Вторая особенность работы с VBA в Outlook заключается в том, что в Outlook реализована концепция пространства имен. Пространство имен в Outlook формально определяется как абстрактный корневой объект для любого источника данных (например, папки в почтовом ящике Exchange или PSTфайле на диске). Проще всего представить себе пространство имен Outlook как некий драйвер, который нужно использовать для подключения к данным. В настоящее время Outlook поддерживает только одно пространство имен -
MAPI (Messaging Application Programming Interface, интерфейс прикладного программирования для работы с сообщениями), но разработчики Outlook требуют, чтобы это пространство имен явно указывалось при выполнении самых разных операций. Подробнее про объект Namespace , представляющий пространство имен, будет рассказано вразд. 13.4 . Например, для запуска Outlook и открытия в нем папкиInbox (Входящие) из другой программы придется использовать следующий код (не забудьте подключить ссылку на библиотеку Microsoft Outlook 11.0 Object Library):
Set oNameSpace = oOutlook.GetNamespace("MAPI")
Set oInbox = oNameSpace.GetDefaultFolder(olFolderInbox) oInbox.Display
Третья особенность работы с Outlook заключается в некоторой терминологической путанице. Как правило, в документации по объектным моделям приложений Office термин Item (элемент) применяется к элементам коллекций. В Outlook он получает второе значение:Item - это все, что может храниться в папках Outlook: почтовые сообщения (объектMailItem ), контакты (объектContactItem ), встречи (объектAppointment ) и т. п. Не путайте!
У Outlook есть еще одна особенность. На протяжении многих лет Outlook была программой, которая первой подвергалась атакам вирусов, троянских программ и прочего вредоносного программного обеспечения, приходящего по электронной почте. Иногда такие атаки бывали успешными, и Outlook на компьютере пользователя сам начинал рассылать электронные письма с вирусами (в том числе и при помощи кода VBA). Чтобы снизить вероятность развития событий по такому сценарию, разработчики Outlook сознательно поместили в его объектную модель ограничения, которые должны препятствовать распространению вирусов. Иногда эти ограничения (у них есть специальное название - Outlook Object Model Guard ) мешают и нормальной работе программ VBA. О них будет рассказано в следующих разделах. Иногда по причине таких ограничений бывает удобнее использовать вместо объектной
Программирование в Outlook |
модели Outlook библиотеку CDO, которая имеется на любом компьютере с
Windows 2000, XP или 2003.
Интересной особенностью Outlook является и то, что в отличие от других приложений Office вы не сможете напрямую (при помощи ключевого слова New или командыCreateObject() ) создать ни одного объекта Outlook, кромеApplication . Для создания всех остальных объектов придется использовать соответствующие методы уже созданных объектов.
На всякий случай также заметим, что макрорекордера в Outlook, как и в Access, к сожалению, нет. Всю необходимую дополнительную информацию вам придется искать при помощи документации.
13.3. Объект Application ,
его свойства и методы
Как и у всех приложений Office, на вершине объектной модели Outlook находится объект Application . Его можно использовать для запуска Outlook из внешних приложений (см. пример в предыдущем разделе). Отличительной особенностью объектаApplication в Outlook является относительно небольшое количество свойств и методов (за счет того, что часть из них переехала в объектNamespace ). Наиболее часто используемые свойства объектаApplication представлены далее.
Explorers - это свойство возвращает коллекциюExplorers с объектамиExplorer , каждый из которых представляет собой папку Outlook, открытую на просмотр пользователем. Основное назначение этой коллекции и объектовExplorer - проверка, не открыта ли уже пользователем в Outlook та или иная папка, и, в зависимости от результата, активизация этого окна
(Explorer.Activate()) или его закрытие (Explorer.Close()). Метод
ActiveExplorer() объектаApplication позволяет получить ссылку на окно, активное в настоящий момент, аGetExplorer() - получить ссылку на объектExplorer для указанной папки Outlook (без его автоматической активизации).
Inspectors - свойство, которое очень похоже наExplorers . Оно возвращает коллекциюInspectors с объектамиInspector . Главное отличие в том, что объектыInspector представляют не открытые папки Outlook, какExplorer , а открытые на просмотр и редактирование элементы (например, почтовые сообщения). ОбъектInspector используется для таких же проверок, что и объектExplorer , его свойства и методы почти полностью совпадают со свойствами и методами объектаExplorer . Для тех же целей преду-
смотрены и методы ActiveInspector()и GetInspector()объекта Application.
Reminders - позволяет вернуть коллекциюReminders с объектамиReminder , представляющими текущие оповещения. Обычно это свойство используется для того, чтобы программным образом отключить все оповещения:
Dim oOutlook As New Outlook.Application
Dim oReminder As Outlook.Reminder
For Each oReminder In oOutlook.Reminders
oReminder.Dismiss
Session - это свойство позволяет вернуть объектNamespace , представляющий пространство имен для текущего сеанса (т. е. пространство имен MAPI). Это свойство можно использовать вместо методаGetNamespace() . Подробнее про объектNamespace будет рассказано вразд. 13.4 .
Аналогичное свойство Session предусмотрено для самого объектаNamespace и для множества других объектов Outlook.
Теперь расскажем о методах объекта Outlook.Application .
Методы с префиксом Active... - просто возвращают ссылку на активный в настоящее время объектExplorer илиInspector .
AdvancedSearch() - очень важный метод. Он позволяет производить поиск по папкам Outlook (что на практике требуется достаточно часто). Подробнее про этот метод и сопутствующие ему объектыSearch иResults будет рассказано вразд. 13.7 .
CopyFile() - позволяет скопировать файл с диска в папку Outlook. Можно использовать, например, для переноса всех файлов из каталога с документацией по проекту в общую папку Exchange Server или в библиотеку до-
кументов SharePoint Portal Server.
CreateItem() - метод, который используется очень часто. Он позволяет создать новые элементы в Outlook. Например, создать новый элемент типа контакт, заполнить его свойства, сохранить, а затем открыть для просмотра можно так:
Dim oOutlook As New Outlook.Application Dim oContact As Outlook.ContactItem
Set oContact = oOutlook.CreateItem(olContactItem) oContact.FirstName = "Академия специальных курсов" oContact.Email1Address = "[email protected]" oContact.Save
13.3 Объект Application , его свойства и методы
Объект Outlook.Application, свойства и методы объекта Outlook.Application, отключение оповещений, создание контактов
Как и у всех приложений Office, на вершине объектной модели Outlook находится объект Application. Этот объект можно использовать для запуска Outlook из внешних приложений (см. пример в предыдущем разделе). Отличительной особенностью объекта Application в Outlook является относительно небольшое количество свойств и методов (за счет того, что часть из них переехала в объект Namespace). Наиболее часто используемые свойства объекта Application представлены ниже:
- Explorers - это свойство возвращает коллекцию Explorers с объектами Explorer, каждый из которых представляет папку Outlook, открытую на просмотр пользователем. Основное назначение этой коллекции и объектов Explorer - проверка, не открыта ли уже пользователем в Outlook та или иная папка, и, в зависимости от результатов, к примеру, активизация этого окна (Explorer.Activate() или его закрытие (Explorer.Close()). Метод Application.ActiveExplorer() позволяет получить ссылку на окно, активное в настоящий момент, Application.GetExplorer() - получить ссылку на объект Explorer для указанной папки Outlook (без его автоматической активизации).
- Inspectors - свойство, которое очень похоже на Explorers. Оно возвращает коллекцию Inspectors с объектами Inspector. Главное отличие - объекты Inspector представляют не открытые папки Outlook, как Explorer, а открытые на просмотр/редактирование элементы (например, почтовые сообщения). Объект Inspector используется для тех же целей (проверок), что и объект Explorer, его свойства и методы почти полностью совпадают со свойствами и методами объекта Explorer. Для тех же целей предусмотрены методы ActiveInspector() и GetInspector().
- Reminders - это свойство позволяет вернуть коллекцию Reminders с объектами Reminder, представляющие текущие оповещения. Обычно используется для того, чтобы программным образом быстро отключить все оповещения:
Dim oReminder As Outlook.Reminder
For Each oReminder In oOutlook.Reminders
oReminder.Dismiss
- Session - это свойство позволяет вернуть объект Namespace, представляющий пространство имен для текущего сеанса (читайте - пространство имен MAPI). Это свойство можно использовать вместо метода GetNamespace(). Подробнее про объект Namespace будет рассказано в следующем разделе.
Аналогичное свойство Session предусмотрено и для самого объекта Namespace, и еще для множества объектов Outlook.
Теперь - методах объекта Outlook.Application. Они представляют больший интерес:
- методы Active…() просто возвращают ссылку на активный в настоящее время объект Explorer, Inspector или Window.
- метод AdvancedSearch() - очень важный метод. Он позволяет производить поиск по папкам Outlook (что на практике требуется достаточно часто). Подробнее про этот метод и сопутствующие ему объекты Search и Results будет рассказано ниже.
- CopyFile() - возможность просто скопировать файл с диска в папку Outlook. Можно использовать, к примеру, для переноса всех файлов из каталога с документацией по проекту в общую папку Exchange Server или в библиотеку документов SharePoint Portal Server.
- CreateItem() - метод, который используется очень часто. Он позволяет создать новые элементы в Outlook. Например, создать новый элемент типа контакт, заполнить его свойства, сохранить, а затем открыть для просмотра можно так:
Dim oOutlook As New Outlook.Application
Dim oContact As Outlook.ContactItem
Set oContact = oOutlook.CreateItem(olContactItem)
oContact.FirstName = "Академия специальных курсов"
oContact.Email1Address = "info@сайт"
oContact.Save
oContact.Display
А теперь представьте, что вы создаете объекты контактов в цикле на основе записей из базы данных или строк в таблице Excel. Справочник контактов будет загружен в Outlook очень быстро и эффективно. Только не забывайте после каждого создания и сохранения контакта удалять его объект из оперативной памяти - иначе память на компьютере кончится и это приведет к ошибке!
- CreateItemFromTemplate() - точно так же создается новый элемент Outlook, но уже на основе шаблона Outlook в файловой системе - файла.oft.
- GetNameSpace() - метод, который используется, наверное, в большинстве программ VBA в Outlook. Позволяет получить объект пространства имен MAPI. Подробнее про работу с этим объектом будет рассказано в следующем разделе.
- IsSearchSynchronous() - используется для проверки режима поиска (см. раздел про поиск в Outlook).
- Quit() - просто выход из Outlook.
Работу с почтовой программой Outlook (к сожалению, только с полной программой Outlook, а не с используемой чаще Outlook Express) можно организовать с помощью серверов автоматизации OLE. Создание сервера осуществляется кодом:
Uses ComObj; var Outlook: OleVariant; Outlook:= CreateOleObject("Outlook.Application");
Далее в объекте Outlook можно использовать объекты, содержащиеся в Outlook. Application, их свойства и методы. Все их можно посмотреть во встроенной в программу Outlook справке по программированию. А общие принципы работы с серверами автоматизации OLE рассмотрены в разд. 6.1.3.
Как было показано в разд. 6.2 и 6.4, работа с серверами автоматизации OLE во многих отношениях удобнее, чем работа с серверами СОМ. Однако можно организовать работату с Outlook и на основе серверов СОМ. На странице Servers библиотеки имеется компонент Outlook Application - сервер СОМ программы Outlook. Для работы с ним просто надо перенести этот компонент на форму. Можно при этом установить в true его свойства AutoConnect и AutoQuit. Это обеспечит автоматическое подключение к Outlook при запуске приложения и автоматическое закрытие Outlook при завершении выполнения приложения.
Можно также программно создавать серверы СОМ в приложении, не используя компоненты страницы Servers:
Uses OleServer, OutlookXP; var Outlook: TOutlookApplication; Outlook:= TOutlookApplication.Create(Self) ;
Во всех вариантах приложение получит доступ к объектам, содержащимся в Outlook.Application, к их свойствам и методам.
Ниже приведен пример автоматического создания и отправки почтового сообщения с помощью сервера автоматизации OLE:
Uses ComObj, OutlookXP; var Outlook: OleVariant; Letter: OleVariant; Outlook:= CreateOleObject("Outlook.Application"); Letter:= Outlook.Createltem(olMailItem);
Letter.Recipients.Add("[email protected];[email protected]); // адресаты Letter.CC:= "[email protected]"; // адресат копии
Letter.BCC:= "[email protected]"; // адресат скрытой копии
Letter.Subject:= "Тест"; // тема письма
Letter.Body:= Memol.Text; // текст письма
{ Следующий оператор открывает окно Outlook с загруженным письмом, в котором пользователь может что-то поправить. Если это не требуется, следующий оператор можно удалить} Letter.Display; { Следующий оператор отправляет письмо. Если имеется предыдущий оператор, то пользователь может послать письмо из окна Outlook, так что в этом случае следующий оператор не нужен. Он требуется, если подразумевается автоматическая отправка писем. } Letter.Send; Outlook.Quit;
В оператор uses включена ссылка на модуль ComObj, необходимый в любых приложениях, использующих серверы автоматизации OLE (см. разд. 6.1.3). Модуль OutlookXP или Outlook2000 включается только для использования констант, встречающихся в коде. В версиях младше Delphi 2005 для использования этих констант вместо указанных модулей может подключаться модуль Outlook8.
Первый выполняемый оператор связывает функцией CreateOleObject переменную Outlook с почтовой программой. Второй оператор методом Createltem создает новый объект почтового сообщения Letter. О том, что создается именно почтовое сообщение, свидетельствует параметр olMailltem. Далее в список адресатов сообщения (свойство Recipients) добавляется два адреса: "[email protected]" и "[email protected]". В свойство СС заносится адрес получателя копии письма "[email protected]". В свойство ВСС заносится адрес получателя скрытой копии письма "[email protected]". В свойство Subject заносится тема сообщения. В свойство Body заносится текст сообщения из окна редактирования Memol.