Всем привет. В этой статье я хотел бы поговорить о технологии взаимодействия 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. Это конечно только самый минимум, но мне было достаточно этого, чтобы решить свою проблему, если есть какие-то вопросы, то, пожалуйста, будем разбираться вместе, например, отправить сообщение, получить вложения сообщений и так далее.

Метки: ,




К записи “Работа с MAPI. Получение писем, контактов” оставлено комментариев: 2.

  1. Тимур:

    Все хорошо. Только откуда выудить почтовый адрес отправителя?
    При попытке прочитать:
    Folder.Items.Item(1) as contactItem.Email1Address выдает
    ‘interface not support’.
    Откуда еще можно извлечь email адрес отправителя, не подскажете?

  2. Тимур:

    Уже решил эту проблемку ). Сложно, но можно.

    Возник другой вопрос как перемещать письма в другую папку?

Оставить комментарий на Тимур

Вы можете использовать следующие теги:

*