Уж не знаю, будет ли интересна кому-нибудь данная поделка (действительно поделка за пару часов, к тому-же с частичным заимствованием кода). Будем считать ее отправной точкой для изучения 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);
}
//---------------------------------------------------------------------------