Мапішний Постмачтер або як включити підтримку пошти у свою програму

Михайло плакун, "Софтерра"

Інтро

В останні роки електронна пошта є невід'ємною складовою персональних інформаційних засобів. З великим ступенем імовірності правда те, що, якщо у людини на столі стоїть комп'ютер, то на ньому встановлена та чи інша система електронної пошти. Разом з тим типові програми для роботи з електронною поштою в чистому вигляді далеко не завжди відповідають вимогам автоматизації трудової діяльності користувача. У зв'язку з цим існує потреба у створенні різного роду додатків, які не є частиною поштових систем, але разом з тим надають користувачеві деякі засоби для роботи з електронною поштою. Програмний інтерфейс MAPI, про який піде мова в цій статті, є одним із засобів, що дозволяє створювати подібні додатки на платформі Windows.

Що є MAPI?

У широкому розумінні MAPI (Messaging Application Programming Interface) – це ціла архітектура, специфицируются процеси взаємодії окремих додатків з різними поштовими системами. Архітектура MAPI описує так звану підсистему MAPI, яка забезпечує взаємодію клієнтських додатків з різними службами поштової системи, такими як служба зберігання інформації, служба адресної книги, служба транспорту і т.д. З іншого боку MAPI – це прикладний інтерфейс, який був створений для того, щоб розробники на С, С + +, Visual Basic (а згодом і Visual Basic Script) мали можливість додавати в свої додатки функціональність для роботи з електронною поштою. З точки зору прикладної програми підсистема MAPI – це набір динамічних бібліотек, які містять функції й об'єктно-орієнтовані інтерфейси, завдяки яким взаємодіють клієнтські та серверні частини поштових додатків. Про MAPI можна говорити багато і довго (благо компанія Microsoft постаралася зробити з MAPI чергового програмного «Монстра»), але найбільший інтерес для розробників представляють так звані клієнтські прикладні програмні інтерфейси, серед яких слід виділити в першу чергу Simple MAPI, MAPI і CDO.

Почнемо з простого – Simple MAPI

Simple MAPI надає в розпорядження розробників всього 12 найпростіших функцій. Вони дозволяють виконувати такі дії, як «сформувати повідомлення», «вказати адресу одержувача», «відправити», «отримати». Причому всі операції з повідомленнями можна робити тільки в рамках однієї папки, що є папкою для вхідних повідомлень поточного контейнера доставки (у поштовій системі MS Exchange Server це зазвичай «Inbox» або «Вхідні» в російськомовній версії). Розробник не має доступу до повної структурі папок поштового сервера, тобто може контролювати повідомлення лише до тих пір, поки користувач не перемістить його з папки «Inbox» в яку-небудь іншу.

Іншим недоліком Simple MAPI є те, що він дозволяє працювати тільки зі стандартними полями повідомлення, такими як «Тема», «Відправник», «Одержувач», «Дата відправлення», «Текст повідомлення», «Клас повідомлення », а також з вкладеними файлами. При всій своїй обмеженості Simple MAPI підкуповує имено простотою в освоєнні і використанні. Тому, хто має навіть невеликий досвід програмування на С або Visual Basic достатньо кількох хвилин для, того щоб навчитися використовувати цей інтерфейс.

Наступний фрагмент коду на мові С дозволить переконатися в цьому (для простоти несуттєві ділянки коду, такі як оголошення змінних і обробка помилок опущені).

 MAPILogon (0, "My Profile", NULL, MAPI_NEW_SESSION, 0, & pSession);
MAPIResolveName (pSession, 0, "Bill Gates", 0, 0, & pRecipient);

ZeroMemory(&pMessage, sizeof(pMessage))
pMessage.lpszSubject = ” Greeting”;
pMessage.lpszNoteText = “Hello Bill!”;
pMessage.nRecipCount = 1;
pMessage.lpRecips = Recipient;

MAPISendMail(pSession, 0, &pMessage, 0, 0);
MAPILogoff(pSession, 0, 0, 0);

У наведеному прикладі формується повідомлення з темою «Greeting», що містить текст «Hello Bill!» І відправляється адресату, видиме ім'я якого в адресній книзі «Bill Gates». Зараз ми розберемо по кроках як це робиться.

Першим ділом клієнтської програмі необхідно почати сеанс роботи з поштовою системою, для чого за допомогою функції MAPILogon відкривається сесія Simple MAPI. Потім з видимого імені ("Bill Gates") функція MAPIResolveName формує структуру, що містить точну і повну інформацію про адресата (зокрема його електронна адреса). Отримана інформація про адресата поряд з темою і текстом формує структуру, містить поштове повідомлення, готове до відправки. Функція MAPISendMail відправляє повідомлення по електронній пошті. Нарешті, функція MAPILogoff завершує сеанс роботи з поштовою системою, закриваючи сесію Simple MAPI.

Просто, чи не так? Трохи модифікувавши програму, можна дати їй можливість відправляти повідомлення, що містять не тільки текст, але і вкладені файли. Вивчивши ще пару-трійку функцій Simple MAPI, можна з легкістю запрограмувати отримання аналіз і видалення повідомлень, що містяться в поштовій скриньці користувача.

Simple MAPI дозволяє запрограмувати дві основні функції електронної пошти – відправлення і отримання повідомлень. Найчастіше це вся функціональність, необхідна додатком для роботи з електронною поштою. Типовими прикладами використання Simple MAPI є додатки, що виробляють розсилку повідомлень (можливо однотипних, за шаблоном) безлічі адресатів, а також додатки, час від часу скануючі поштову скриньку користувача і виробляють аналіз і обробку надходить нього кореспонденції.

Програмісти на С знайдуть визначення всіх функцій, структур і констант Simple MAPI у файлі MAPI.H, що входить до складу Microsoft Visual Studio. Його аналогом для Visual Basic є файл MAPI.BAS. Самі функції знаходяться у динамічній бібліотеці MAPI.DLL. Як правило Simple MAPI входить до складу клієнтських поштових програм, причому не тільки працюючих в архітектурі "клієнт-сервер" (MS Outlook, MS Exchange Client), але і звичайних (MS Outlook Express, Eudora Pro, а в недалекому майбутньому і The Bat!).

MAPI 1.0 – для просунутих

Simple MAPI на те й «Simple», що накладає серйозні обмеження на розробника як в плані функціональності, так і в плані продуктивності додатка. Повністю зняти ці кайдани дозволяє гнучкий і потужний програмний інтерфейс MAPI 1.0 (в минулому – Extended MAPI за аналогією з Simple MAPI). MAPI 1.0 – це сукупність більш ста функцій і декількох десятків COM-інтерфейсів, що надають програмістам на С і С + + багатий інструментарій для створення додатків, що працюють з електронною поштою. Simple MAPI можна назвати обгорткою MAPI 1.0, яка приховує безліч деталей і нюансів взаємодії додатків з поштовими системами.

MAPI 1.0 надає розробнику не тільки можливість реалізації таких простих функцій як відправка або прийом поштових повідомлень, а й механізми для більш тісної взаємодії з окремими частинами систем електронної пошти – з адресною книгою, ієрархічною структурою папок на поштовому сервері, службою транспорту і т.д. Більш того, за допомогою MAPI 1.0 можна створювати навіть частини поштових систем – програмні шлюзи, різні служби обробки інформації, які є частиною MAPI-сумісних поштових серверів. Не буде перебільшенням сказати, що, використовуючи MAPI 1.0 можна створити свою власну клієнтську поштову програму, аналогічну MS Oulook з усіма її багатими можливостями.

Разом з тим створення додатків на базі MAPI 1.0 – більш трудомісткий процес, ніж програмування з використанням Simple MAPI. MAPI 1.0 вимагає від розробника додаткової кваліфікації, зокрема знання технології COM. Перепишемо вже наявний приклад з використанням MAPI 1.0. Для наочності кожен блок коду підтверджено відповідним фрагментом з попереднього прикладу.

// Begin MAPILogon(:);
MAPILogonEx (0, "My Profile", NULL, MAPI_NEW_SESSION, & lpSession);
// End MAPILogon(:);

lpSession->GetMsgStoresTable(0, &StoresTable);

HrQueryAllRows (StoresTable, (LPSPropTagArray) & tagDefaultStore,
NULL, NULL, 0, &lpRow);

for(i = 0; i < lpRow -> cRows; i++)
{
if(lpRow->aRow[i].lpProps[0].Value.b == TRUE)
break;
}

lpSession->OpenMsgStore(0,
lpRow->aRow[i].lpProps[1].Value.bin.cb,
(LPENTRYID)lpRow->aRow[i].lpProps[1].Value.bin.lpb,
NULL, MDB_WRITE, &lpMDB);

lpMDB->OpenEntry(lpPropValue -> Value.bin.cb,
(LPENTRYID)lpPropValue -> Value.bin.lpb,
NULL, MAPI_MODIFY, &ulObjType,
(LPUNKNOWN *)&lpFolder);

lpFolder->CreateMessage(NULL, 0, &lpMsg);
SInitPropValue MsgProps[] =
{
{PR_DELETE_AFTER_SUBMIT, 0, TRUE},
{PR_MESSAGE_CLASS, 0, (ULONG)”IPM.NOTE “},
{PR_SUBJECT, 0, (ULONG)”Greeting”},
{PR_BODY, 0, (ULONG)” Hello Bill!”}
};
lpMsg->SetProps(4, (LPSPropValue)&MsgProps, NULL);

// Begin MAPIResolveName(:);

lpSession->OpenAddressBook(0, NULL,
AB_NO_DIALOG, &lpAdrBook);

MAPIAllocateBuffer(CbNewADRLIST(1), (LPVOID*)&lpAdrList);
MAPIAllocateBuffer(2*sizeof(SPropValue),
(LPVOID*)&(lpAdrList -> aEntries -> rgPropVals));

ZeroMemory(lpAdrList -> aEntries -> rgPropVals,
2*sizeof(SPropValue));

lpAdrList->cEntries = 1;
lpAdrList->aEntries[0].ulReserved1 = 0;
lpAdrList->aEntries[0].cValues = 2;
lpAdrList-> aEntries [0]. rgPropVals [0]. ulPropTag = PR_DISPLAY_NAME;
lpAdrList-> aEntries [0]. rgPropVals [0]. Value.lpszA = "Bill Gates";
lpAdrList-> aEntries [0]. rgPropVals [1]. ulPropTag = PR_RECIPIENT_TYPE;
lpAdrList->aEntries[0].rgPropVals[1].Value.l = MAPI_TO;

lpAdrBook->ResolveName(0, 0, NULL, lpAdrList);
lpMsg->ModifyRecipients(MODRECIP_ADD, lpAdrList);
// End MAPIResolveName(:);

// Begin MAPISendMail(:);
lpMsg->SubmitMessage(0);
// End MAPISendMail(:);

// Begin MAPILogoff (:);
lpSession->Logoff(0, 0, 0);
// End MAPILogoff (:);

Як видно з цього прикладу більшість операцій, які є примітивними для Simple MAPI, в MAPI 1.0 складаються з послідовностей викликів тих чи інших методів різних інтерфейсів. Так, для того, щоб створити повідомлення в MAPI 1.0 потрібно отримати доступ і відкрити контейнер з повідомленнями, відшукати в ньому папку для вихідних повідомлень і тільки потім власне створити в ній саме повідомлення і начинити його всією необхідною інформацією. У Simple MAPI всі ці проміжні кроки приховані від розробника. З іншого боку MAPI 1.0 дозволяє створювати повідомлення в будь-якій папці (та й не тільки повідомлення, а об'єкти календаря, завдання і т.д.). Таким чином, замість простоті використання з'являються нові можливості.

Інтерфейс MAPI 1.0, на відміну від Simple MAPI можна використовувати при створенні служб Windows NT. Це дуже корисна властивість дозволяє створювати різного роду поштові монітори. Типове завдання поштового монітора може полягати в скануванні поштової скриньки користувача на предмет надходить нього кореспонденції, її розбір, аналіз та подальші дії за результатами цього аналізу.

Окремого обговорення заслуговує така можливість MAPI 1.0 як створення всіляких розширень (extensions) до клієнтським програмам поштової системи MS Exchange Server (MS Outlook або MS Exchange Client). Розширення дозволяють автоматизувати різні функції обробки повідомлень, не реалізовані в базовому наборі функцій клієнтської програми. Зокрема, механізм розширень дозволяє створювати модулі для обробки вхідних повідомлень, так звані правила (rules), додавати до клієнтської програмі додаткові команди та пункти меню, а також обробники подій, що змінюють поведінку системи при певних події та багато іншого.

CDO – розумний компроміс

Інтерфейс CDO (Collaboration Data Objects), раніше відомий як OLE Messaging і Active Messaging являє собою бібліотеку, що забезпечує доступ додатків до дещо обмеженого набору функція MAPI 1.0 через виклики Automation. Функції роботи з повідомленнями можуть бути вбудовані в додатки, створені за допомогою будь-якого засобу розробки, що є контролером Automation. До таких належать C / C + +, Visual Basic, Visual Basic for Applications, VBScript, Javascript. Використання CDO істотно спрощує розробку додатків, що працюють з електронною поштою, разом з тим залишаючи розробнику широкі можливості MAPI. Найбільше застосування CDO знаходить в скриптових мовах. Так, наприклад, в комбінації з APS використання CDO дозволяє досить легко створити поштового Web-клієнта.

Сухий залишок

Отже, ми коротко розглянули 3 програмних інтерфейсу, що дозволяють вбудовувати в додатки на платформі Windows функціональність для роботи з електронною поштою. У кожного з них є свої переваги і недоліки. Нічого універсального не існує – остаточний вибір того чи іншого засобу залежить від конкретної задачі і є прерогативою розробника. Більш детальну інформацію на цю тему можна отримати на http://msdn.microsoft.com/library/psdk/mapi/.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*