Как избежать срабатываний системы безопасности при работе программ для Microsoft® Outlook® на Visual Basic
Введение в MAPI
Мы не будем пытаться описывать в этом разделе архитектуру MAPI или особенности ее реализаций (вы можете найти это во многих других источниках, в том числе в MSDN), а сосредоточимся на практических приемах использования MAPI в контексте данной статьи.
Для практического изучения MAPI мы воспользуемся условно-бесплатным плагином OutlookSpy, который можно загрузить с сайта www.dimastr.com. Установите плагин, и вы получите великолепную возможность исследовать как объектную модель Outlook, так и CDO.

Откройте какое-нибудь письмо, нажмите на панели инструментов OutlookSpy кнопку CurrentItem и перед вами предстанет объект _MailItem, представляющий письмо в OOM. Найдите свойство MAPIOBJECT, щелкните по нему и нажмите кнопку “Browse” – и OutlookSpy покажет Вам интерфейс IMessage соответствующего объекта MAPI.
Интерфейс IMessage реализует следующие методы:
| GetAttachmentTable |
Returns the message's attachment table. |
| OpenAttach |
Opens an attachment. |
| CreateAttach |
Creates a new attachment. |
| DeleteAttach |
Deletes an attachment. |
| GetRecipientTable |
Returns the message's recipient table. |
| ModifyRecipients |
Adds, deletes, or modifies message recipients. |
| SubmitMessage |
Saves all changes to the message and marks it as ready for sending. |
| SetReadFlag |
Sets or clears the MSGFLAG_READ flag in the PR_MESSAGE_FLAGS property of the message and manages the sending of read reports. |
|
Фактически, для нас письмо в MAPI представляется таблицей вложений, таблицей получателей и наборов свойств. Список свойств объекта можно получить вызовом IMAPIProp::GetPropList, а сами свойства – IMAPIProp::GetProps. То, что мы видем на закладке “GetProps” в OutlookSpy и предствляет собой результат работы этих двух функций.
Давайте рассмотрим поближе свойство PR_SENDER_EMAIL_ADDRESS, которое уже упоминалось выше. Тэг PR_SENDER_EMAIL_ADDRESS соответствует шестнадцатеричному числу &H0C1F001E, в котором младшая часть &H001E – это тип свойства PT_STRING8, означающей обычную ANSI-строку. С Visual Studio поставляются файлы MAPIDEFS.H и MAPITAGS.H, в первом находятся объявления типов свойств, а во втором – самих свойств. Эти файлы также включены в Microsoft Platform SDK.
Однако, не все свойства можно получить вызовом IMAPIProp::GetProps. Значения таких свойств как PR_BODY (тело письма) могут быть достаточно большими, и при вызове функции будет возвращен код ошибки MAPI_E_NOT_ENOUGH_MEMORY. Для получения значений таких свойств используется метод IMAPIProp::OpenProperty, который открывает свойство как поток (IStream).
Есть также свойства содержащие значения в компрессированном виде, например PR_RTF_COMPRESSED, содержащее компрессированное тело письма в формате RTF. При чтении такого свойства при помощи IMAPIProp::OpenProperty, значение будет загружено “как есть”. Для получения данных непосредственно в формате RTF, нужно для чтения потока воспользоваться функцией MAPI WrapCompressedRTFStream.
Итак, о свойствах объектов мы теперь знаем достаточно, чтобы получить адрес электронной почты отправителя или тело письма без срабатывания системы безопасности. Если, кончено, научимся работать с MAPI из Visual Basic.
Свойства MAPI объекта доступны для программистов на Visual Basic посредством CDO через коллекцию Fields. Поле ID объекта Field представляет собой не что иное, как тэг MAPI-свойства. Вы можете в OutlookSpy, добравшись до письма через CDO, перейти на закладку Script и выполнить следующий код на JScript:
for (a = 1; a <= Fields.Count; a++)
{
Debug.Print(a + " " + Fields.Item(a).ID + " " + Fields.Item(a).Name);
Debug.Print(Fields.Item(a).Value);
Debug.Print("==================================");
}
Этот код распечатает все свойства объекта, которые Вы видели изучая интерфейс IMessage и которые можно получить через IMAPIProp::GetProps. Однако во время исполнения этого кода Вы опять столкнетесь со срабатыванием системы безопасности.
|