MAPI mail reader
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 22.04.03 13:36
Оценка: 6 (2)
Уж не знаю, будет ли интересна кому-нибудь данная поделка (действительно поделка за пару часов, к тому-же с частичным заимствованием кода). Будем считать ее отправной точкой для изучения MAPI интересующимися

Итак, собственно, класс для чтения писем из Outlook, Outlook Express и остального MAPI-ориентированного. Тестировать долго не пришлось, так что AS IS

Хидер (MAPIMailReader.h):


#ifndef MAPIMailReaderH
#define MAPIMailReaderH
//---------------------------------------------------------------------------
#include <mapix.h>
#include <mapi.h>
#include <windows.h>
//---------------------------------------------------------------------------
#ifndef _DEBUG
#define NDEBUG
#endif
#include <assert>
//---------------------------------------------------------------------------
#include <string>
using namespace std;
//---------------------------------------------------------------------------
struct TSingleMail
{
  string Date;
  string Name;
  string Address;
  string Subject;
  string Body;
  string ID;
  void Clear()
  {
  Address  = "";
  Date     = "";
  Body     = "";
  Subject  = "";
  Name     = "";
  ID       = "";
  }
};
//---------------------------------------------------------------------------
class TMAPIMailReader
{
private:
  bool             m_bInited;
  bool             m_bLoggedOn;
  string           m_szCurrMsgID;
  TSingleMail      m_stMail;

  HINSTANCE        m_MAPILib;
  LHANDLE          m_Session;
  LPMAPILOGON      m_MAPILogon;
  LPMAPIFINDNEXT   m_MAPIFindNext;
  LPMAPIREADMAIL   m_MAPIReadMail;
  LPMAPILOGOFF     m_MAPILogoff;
  LPMAPIFREEBUFFER m_MAPIFreeBuffer;
  LPMAPIDELETEMAIL m_MAPIDeleteMail;

   bool  Logon();
   void  Logoff();

public:
   int   GetCountMessages(); // общее кол-во писем
   bool  Init(); // инициализация
   void  DeInit(); // деинициализация
   bool  ReadFirstMailID(string *ID); // читает первый идентификатор письма
   bool  ReadNextMailID(string *ID); // читает все следующие
   bool  ReadMail(unsigned int Number); // читает письмо по номеру
   bool  ReadMail(string ID); // читает письмо по идентификатору
   bool  DeleteMail(const string& ID); // удаляет письмо по идентификатору
   const TSingleMail& GetMail(); // возвращает ссылку на заполненную структуру

public:
    TMAPIMailReader();
   ~TMAPIMailReader();

};
//---------------------------------------------------------------------------
#endif


Сырец (MAPIMailReader.cpp):

#include "MAPIMailReader.h"
//---------------------------------------------------------------------------
TMAPIMailReader::TMAPIMailReader() :
m_bLoggedOn(false)
, m_bInited(false)
{
}
//---------------------------------------------------------------------------
TMAPIMailReader::~TMAPIMailReader()
{
DeInit();
}
//---------------------------------------------------------------------------
const TSingleMail& TMAPIMailReader::GetMail()
{
return m_stMail;
}
//---------------------------------------------------------------------------
bool TMAPIMailReader::Init()
{
  DeInit();
  
  m_MAPILib = LoadLibrary("mapi32.dll");
  if(m_MAPILib == NULL)
    return false;

  m_MAPILogon = (LPMAPILOGON) GetProcAddress(m_MAPILib, "MAPILogon");
  m_MAPIFindNext = (LPMAPIFINDNEXT) GetProcAddress(m_MAPILib, "MAPIFindNext");
  m_MAPIReadMail = (LPMAPIREADMAIL) GetProcAddress(m_MAPILib, "MAPIReadMail");
  m_MAPILogoff = (LPMAPILOGOFF)     GetProcAddress(m_MAPILib, "MAPILogoff");
  m_MAPIFreeBuffer = (LPMAPIFREEBUFFER) GetProcAddress(m_MAPILib, "MAPIFreeBuffer");
  m_MAPIDeleteMail = (LPMAPIDELETEMAIL) GetProcAddress(m_MAPILib, "MAPIDeleteMail");

  if( !m_MAPILogon || !m_MAPIFindNext || !m_MAPIReadMail ||
      !m_MAPILogoff ||  !m_MAPIFreeBuffer || !m_MAPIDeleteMail)
    m_bInited =  false;

   m_bInited = Logon();
return m_bInited;
}
//---------------------------------------------------------------------------
void TMAPIMailReader::DeInit()
{
 Logoff();
 
 if(m_bInited)
  {
   FreeLibrary(m_MAPILib);
   m_MAPILogon = NULL;
   m_MAPIFindNext = NULL;
   m_MAPIReadMail = NULL;
   m_MAPILogoff = NULL;
   m_MAPIFreeBuffer = NULL;
   m_MAPIDeleteMail = NULL;
   m_MAPILib = NULL;
   m_bInited = false;
  }
}
//---------------------------------------------------------------------------
void TMAPIMailReader::Logoff()
{
 if(m_bLoggedOn)
    m_MAPILogoff(m_Session,0L,0L,0L);
 m_bLoggedOn = false;   
}
//---------------------------------------------------------------------------
bool TMAPIMailReader::Logon()
{
m_bLoggedOn = (m_MAPILogon(0L, "", "", 0, 0L, &m_Session) == SUCCESS_SUCCESS);
return m_bLoggedOn;
}
//---------------------------------------------------------------------------
int TMAPIMailReader::GetCountMessages()
{
assert(m_bInited);
assert(m_bLoggedOn);

 if(!m_bInited || !m_bLoggedOn)
   return 0;

  int nCount = 0;

  char szCurrID[513] = "";
  char szMsgID[513];

  for(;;)
    {
    ULONG uRet =  m_MAPIFindNext(m_Session,
                        0L,
                        "",
                        szCurrID,
                        MAPI_LONG_MSGID,
                        0L,
                        szMsgID);

    if( uRet != SUCCESS_SUCCESS)
        break;

    ++nCount;
    strcpy(szCurrID, szMsgID);
  }
  return nCount;
}
//---------------------------------------------------------------------------
bool TMAPIMailReader::ReadFirstMailID(string *ID)
{
assert(m_bInited);
assert(m_bLoggedOn);

  m_szCurrMsgID = "";
  m_stMail.Clear();

  char szMsgID[513];

  ULONG uRet =
    m_MAPIFindNext(m_Session, 0L, "", "",
                     MAPI_LONG_MSGID,
                     0L, szMsgID);

  if( uRet != SUCCESS_SUCCESS)
      return false;
  m_szCurrMsgID = szMsgID;
  *ID = m_szCurrMsgID;

  return true;
}
//---------------------------------------------------------------------------
bool TMAPIMailReader::ReadNextMailID(string *ID)
{
assert(m_bInited);
assert(m_bLoggedOn);

  m_stMail.Clear();

  char szMsgID[513];

  ULONG uRet =
    m_MAPIFindNext(m_Session, 0L, "", (LPTSTR)m_szCurrMsgID.c_str(),
                     MAPI_LONG_MSGID,
                     0L, szMsgID);

  if( uRet != SUCCESS_SUCCESS)
      return false;
  m_szCurrMsgID = szMsgID;
  *ID = m_szCurrMsgID;

  return true;
}
//---------------------------------------------------------------------------
bool TMAPIMailReader::ReadMail(string ID)
{
assert(m_bInited);
assert(m_bLoggedOn);

 char szMsgID[513];
 MapiMessage* message;
 m_stMail.Clear();
 
 ULONG uRet =
      m_MAPIFindNext(m_Session, 0L, "", (LPTSTR)ID.c_str(),
                        MAPI_LONG_MSGID,
                        0L, szMsgID);

   if(MAPI_E_NO_MESSAGES != uRet)
     if(uRet != SUCCESS_SUCCESS)
        return false;

uRet = m_MAPIReadMail(
                 m_Session,0L,(LPTSTR)ID.c_str(),
                 MAPI_SUPPRESS_ATTACH
                 |MAPI_PEEK,
                 0L,&message);
        if(uRet == SUCCESS_SUCCESS)
          {
           m_stMail.Address  = message->lpOriginator->lpszAddress;
           m_stMail.Date     = message->lpszDateReceived;
           m_stMail.Body     = message->lpszNoteText;
           m_stMail.Subject  = message->lpszSubject;
           m_stMail.Name     = message->lpOriginator->lpszName;
           m_stMail.ID       = ID;

          m_MAPIFreeBuffer(message);
          return true;
         }  // if(uRet == SUCCESS_SUCCESS)
return false;         
}
//---------------------------------------------------------------------------
bool TMAPIMailReader::ReadMail(unsigned int Number)
{
assert(m_bInited);
assert(m_bLoggedOn);

  unsigned int nCount = 0;

  MapiMessage* message;
  m_stMail.Clear();

  char szCurrID[513] = "";
  char szMsgID[513];

  for(; ;)
   {
    ULONG uRet =
      m_MAPIFindNext(m_Session, 0L, "", szCurrID,
                        MAPI_LONG_MSGID,
                        0L, szMsgID);

    if( uRet != SUCCESS_SUCCESS) break;
    ++nCount;
    strcpy( szCurrID, szMsgID);

    if( nCount == Number)
       {
        uRet = m_MAPIReadMail(
                 m_Session,0L,szCurrID,
                 MAPI_SUPPRESS_ATTACH
                 |MAPI_PEEK,
                 0L,&message);
        if(uRet == SUCCESS_SUCCESS)
          {
           m_stMail.Address  = message->lpOriginator->lpszAddress;
           m_stMail.Date     = message->lpszDateReceived;
           m_stMail.Body     = message->lpszNoteText;
           m_stMail.Subject  = message->lpszSubject;
           m_stMail.Name     = message->lpOriginator->lpszName;
           m_stMail.ID       = szCurrID;

          m_MAPIFreeBuffer(message);
          return true;
         }  // if(uRet == SUCCESS_SUCCESS)
      break;
     }  // if( nCount == nNumber)
  } // for

 return false;

}
//---------------------------------------------------------------------------
bool TMAPIMailReader::DeleteMail(const string& ID)
{
assert(m_bInited);
assert(m_bLoggedOn);

 UINT uRet
    = m_MAPIDeleteMail(m_Session, 0L, (LPTSTR)ID.c_str(), 0L, 0L);

  return (uRet == SUCCESS_SUCCESS);
}
//---------------------------------------------------------------------------


Пример использования (BCB):

#include "MAPIMailReader.h"
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TMAPIMailReader mr;
 if(mr.Init())
  {

     int MailCount  = mr.GetCountMessages();


     for(int i=1;i<=MailCount;i++)
      {
       if(!mr.ReadMail(i))
         break;
       TSingleMail mail = mr.GetMail();
       Memo1->Lines->Add("Mail ID: " + String(mail.ID.c_str()));
       Memo1->Lines->Add("Mail subject: " + String(mail.Subject.c_str()));
       Memo1->Lines->Add("Mail date: " + String(mail.Date.c_str()));
       Memo1->Lines->Add("Mail name: " + String(mail.Name.c_str()));
       Memo1->Lines->Add("Mail address: " + String(mail.Address.c_str()));
       Memo1->Lines->Add("===============================");
       Memo1->Lines->Add("");
      }

   mr.DeInit();  
  }
 else
   MessageBox(NULL,"Unable to init MAPI!",NULL,MB_OK | MB_ICONEXCLAMATION);


}
//---------------------------------------------------------------------------
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.