воскресенье, 14 ноября 2010 г.

Доступ к Exchange почте по протоколу Mapi

Хочу рассказать сегодня как получить список писем, аттачей из Windows Exchange и программно отсылать письма через протокол Simple MAPI.
Для этого нам понадобится небольшой класс. Он слегка недоделан: отправка почты и получение списка аттачей, но это доделать не так сложно.
Описание протокола Simple MAPI можно почитать по адресу: http://msdn.microsoft.com/en-us/library/dd296728(v=VS.85).aspx

Итак, описание класса на C++ (Builder):
#ifndef SimpleMapiH
#define SimpleMapiH

using namespace std;

#include <windows.h>
#include <windowsx.h>
#include <mapi.h>
#include <winbase.h>
#include <vector>

//структура с информацией о письме
struct TMail {
  AnsiString from;
  AnsiString subj;
  unsigned int files;
  TDateTime date;
  //указатели на письмо
  LPSTR lpszMessageID;
  MapiMessage *lpMessage;
};

class SimpleMapi {
   private:
      //библиотека и указатели на нужные нам функции
      HANDLE hMAPILib;
      LPMAPILOGON lpfnMAPILogon;
      LPMAPIFINDNEXT lpfnMAPIFindNext;
      LPMAPILOGOFF lpfnMAPILogoff;
      LPMAPIREADMAIL lpfnMAPIReadMail;
      LPMAPIFREEBUFFER lpfnMAPIFreeBuffer;

      //текущая сессия
      LHANDLE lhSession;

      //буфферы
      char szSeedMessageID[512];
      char szMessageID[512];
      LPSTR lpszSeedMessageID;
      LPSTR lpszMessageID;

      //указатель на письмо
      MapiMessage *lpMessage;

      //тип ошибки
      ULONG err;

      //разбор даты
      TDateTime __fastcall ParseDate(AnsiString date);
      
   public:
        //полный список писем
        vector<tmail> MailList;

        __fastcall SimpleMapi();
        //подключение к Exchenge
        bool __fastcall Connect();
        //перейти к первому письму из списка
        bool __fastcall GetFirst();
        //перейти к следующему письму из списка
        bool __fastcall GetNext();
        //получить указатель на полную информацию о текущем письме
        bool __fastcall GetElement();
        //заполнить структуру текущим письмом
        TMail __fastcall Fetch();
        //получить список всех писем (заполняем вектор)
        bool __fastcall GetList();
        //отключаемся от Exchange
        void __fastcall Disconnect();
        //отправить письмо - не реализовано
        void __fastcall SendMail();
        //получить список приложений письма по указателю
        vector<ansistring> __fastcall GetAttachs(LPSTR lmID, MapiMessage *lpMes);
};

#endif