Всем привет. В этой статье я хотел бы поговорить о технологии взаимодействия Delphi-приложений с общеизвестными приложениями MS Office. Я затронул эту тему, потому что мне на работе необходимо было решить одну проблему: я написал на сайте Белпочты форму онлайн заявок для вызова курьера (для отправления международных и внутренних отправлений), к данной форме я прикрутил php-скрипт, который отправляет эту форму в виде таблицы на наш почтовый сервер, конкретному получателю. Почтовый сервер у нас на основе Microsoft Exchange. Далее мне сказали сделать учет заявок, я думал все это организовать в веб-интерфейсе, чтобы они ложились в Базу данных и уже на основе всего это вести этот самый учет, но в связи с тем, что полного доступа к серверу, где расположен наш сайт я не имел, поэтому решил обойтись таким образом: то есть отправлять на почту заявки, а потом написать дополнительное программное обеспечение, которое будет доставать из Microsoft Outlook эти самые заявки и вести учет уже в локальной базе и при локальном компьютере, для всех это было само простым вариантов, а для меня организовать это все в веб-интерфейсе (просмотр заявок, учет заявок, редактирование заявок и так далее).
Но мне пришлось писать еще и стороннее приложение для локального учета заявок. Ну как говорится с начальством не поспоришь. Тут я начал немного «ковыряться» в программном интерфейсе MAPI, немного изучать его и применять именно в Delphi, тут и у меня все получилось то, что мне и необходимо было. Вообще MAPI – это программный интерфейс, который позволяет и помогает работать с различными системами передачи электронных сообщений. MAPI позволяет получать, создавать, читать, отправлять сообщения (то есть то что мне и нужно было), а также присоединять к ним различные файлы (к сообщениям) и получать к ним доступ. Как раз Microsoft Outlook и использует данный интерфейс.
В Delphi есть отличная вкладка для работы с приложениями Microsoft Office – это Servers. Из данной вкладки мне понадобились только компоненты для работы с Microsoft Outlook, а если быть точным, то только один компонент – это TOutlookApplication. Через него я получал только лишь все сообщения и выбирал мне нужные (то есть от конкретного отправителя, от которого приходят все заявки с формы онлайн заявок) преобразовывал в нужный вид и записывал необходимые данные в Базу данных и уже дальше оставалось дело техники (организовать все нужные процедуры и функции). В данной статье я не буду рассказывать, как я именно организовывал учет заявок, а лишь поделюсь некоторыми возможностями MAPI: получить список папок Microsoft Outlook, получить список контактов, получить список папок контактов, открывать необходимые папки и многое другое.
Ну что, давайте приступим немного разбираться в MAPI. Я Вам покажу то, что я насобирал за короткий промежуток времени по MAPI, а Вы уже можете дальше развивать в этом свои мысли, если что я помогу.
Ну что, для начала давайте получим список всех писем, что в принципе мне и необходимо было сделать для моего учета заявок. Создадим проект в Delphi и установим на главной форме следующие компоненты:
- TOutlookApplication
- TButton
- TListBox
В TListBox мы будем выводить список наших сообщений, которые получим в Microsoft Outlook. Вид моего проекта получился следующим:
Теперь давайте получим наш список сообщений, на событие OnClick нашей кнопки напишем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
mail:MailItem;
mapi: NameSpace;
Folder:MAPIFolder;
begin
mapi:=OutlookApplication1.GetNamespace('MAPI');
Folder:=mapi.GetDefaultFolder(olFolderInbox);
for i:=1 to Folder.Items.Count do
ListBox1.Items.Add((Folder.Items.Item(i) as MailItem).Body);
end;
Теперь запускаем нашу программы на исполнение и нажимаем на кнопку «Получить», после чего должно появиться окно:
То есть Microsoft Outlook думает, прежде всего, о безопасности, поэтому и предупреждает Вас. После того как мы разрешим доступ нашей программы к Microsoft Outlook, то в TListBox у меня получился примерно следующий список:
Как видите текст сообщений полностью не форматированный, то есть, нету переносов и так далее, а это и не удивительно, все-таки мы же выводили эти все данные в компонент TListBox, для форматированного вывода воспользуйтесь соответствующими компонентами, например TRichEdit.
Как Вы уже поняли, что свойство Body позволяет вывести сам текст сообщения, а существует еще и другие свойства, которые позволяют получить другие данные, например:
- Subject – получить тему сообщения;
- HTMLBody – получить сообщение в html-виде;
- SenderName – от кого было отослано сообщение;
- To_ — кому было послано сообщение (необязательно именно только Вам).
Вообще тут все понятно, то есть сам смысл, как получить какие-то поля самого сообщения. С помощью Folder:=mapi.GetDefaultFolder(olFolderInbox); мы устанавливаем папку, откуда мы будем считывать информации, в данном случае это папка входящий сообщений. Для того, чтобы показать эту папку Outlooka, то нам достаточно дописать Folder.Display и это можно делать абсолютно со всеми папками.
С помощью данного кода:
for i:=1 to mapi.Folders.Count do
begin
ListBox1.Items.Add(mapi.Folders.Item(i).Name);
end;
Мы можем получить список всех наших папок, которые присутствуют в Microsoft Outlook. Для того, чтобы скопировать некоторую папку, в нужную Вам, неоходимо воспользоваться примерно следующим кодом:
Folder:=mapi.GetDefaultFolder(olFolderInbox);
mapi.PickFolder.CopyTo(Folder);
А для того, чтобы переместить, то вместо CopyTo, используется MoveTo.
Переходим дальше. Для того, чтобы получить список контактов, нам необходимо для начала установить по умолчанию папку контактов и затем уже считывать оттуда необходимые нам данные, это делается примерно следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
mail:MailItem;
mapi: NameSpace;
Folder:MAPIFolder;
begin
mapi:=OutlookApplication1.GetNamespace('MAPI');
Folder:=mapi.GetDefaultFolder(olFolderContacts);
for i:=1 to Folder.Items.Count do
ListBox1.Items.Add((Folder.Items.Item(i) as ContactItem).FullName);
end;
Кроме всего этого, для конкретного контакта можно получить более подробную информацию: телефон, адрес и так далее.
Ну и наконец, давайте получим список папок наших контактов, для этого необходимо написать следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
mail:MailItem;
mapi: NameSpace;
Folder:MAPIFolder;
begin
mapi:=OutlookApplication1.GetNamespace('MAPI');
for i:=1 to mapi.AddressLists.Count do
ListBox1.Items.Add(mapi.AddressLists.Item(i).Name);
end;
Вот примерно так работать с интерфейсом Microsoft Outlook. Это конечно только самый минимум, но мне было достаточно этого, чтобы решить свою проблему, если есть какие-то вопросы, то, пожалуйста, будем разбираться вместе, например, отправить сообщение, получить вложения сообщений и так далее.