Extended MAPI in DELPHI
LazyMAPI # 1
Test MAPI Folder/Message functions
This “test” application show how developer can uses functions GetMAPISession, GetDefaultStore, ReleaseMapiSession, ReleaseMsgStore, GetInbox, GetSentBox, GetDefaultFolder, GetMessageList, GetMapiMessage, CreateMapiMessage, TMsgHeadList…
and
GetMsgBodyPlain, GetMsgBodyRTF, GetMsgBodyHTML, ShowHTMLBodyRendered, GetMsgSenderName, GetMsgToNames, GetMsgCcNames, GetMsgSubject, GetMsgSentTime, GetMsgSize, GetMsgHasAttachment, GetBestBodyFormat, GetMsgInetCodePage, GetMsgAttCount, GetMsgAttList, GetRecipientsFromAB, GetMsgRecipients, GetMsgAfterSendAction, AddMsgAttachment, SetMsgRecipients, SetMsgSubject, GetNamedPropString, SetNamedPropString, TAttHeadList…
uses “shared” forms:
TFrmMessage, TFrmNewMsg, TFrmAttachments, TFrmPropPage, TFrmProperty
unit uMain;
interface
{$I IMI.INC}
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtendedMAPI, ComCtrls;
type
TfrmMain = class(TForm)
Panel1: TPanel;
btLogOff: TButton;
MessageListView: TListView;
StatusBar: TStatusBar;
rgFolders: TRadioGroup;
btCreateMsg: TButton;
procedure btLogOffClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MessageListViewData(Sender: TObject; Item: TListItem);
procedure MessageListViewDblClick(Sender: TObject);
procedure rgFoldersClick(Sender: TObject);
procedure btCreateMsgClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
MAPISession: IMAPISession;
MsgStore: IMsgStore;
Inbox: IMAPIFolder;
SentBox: IMAPIFolder;
DraftBox: IMAPIFolder;
procedure LoadInboxMessages;
procedure LoadSentItemsMessages;
procedure LoadDraftItems;
procedure ReleaseAll;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses IMIEMTypes, MAPISessionUtils, MAPIFldUtils, MAPIMsgUtils, MessageFrm,
NewMessageFrm;
{$R *.dfm}
const
strLogOff: array [Boolean] of string = ('Log On', 'Log Off');
var
MsgHeadList: TMsgHeadList = nil;
MsgHeadListCount: Integer = 0;
procedure TfrmMain.btCreateMsgClick(Sender: TObject);
var
MAPIMessage: IMessage;
begin
if rgFolders.ItemIndex <> 2 then
rgFolders.ItemIndex := 2;
if not Assigned(DraftBox) then
Exit;
// Create a new message in Draft items folder
MAPIMessage := CreateMapiMessage(DraftBox);
if not Assigned(MAPIMessage) then
Exit;
try
with TfrmNewMsg.Create(Self) do
begin
SetMAPIObjects(MAPISession, MsgStore, DraftBox, MAPIMessage);
ShowModal;
Free;
end;
finally
MAPIMessage := nil;
end;
// refresh a Draft Items
LoadDraftItems;
end;
procedure TfrmMain.btLogOffClick(Sender: TObject);
begin
if btLogOff.Tag = 0 then
// Log On
begin
// Get MAPI Session
MAPISession := GetMAPISession(Self.Handle, '', MAPI_LOGON_UI);
// Get default message store for current MAPI/Outlook profile
MsgStore := GetDefaultStore(MAPISession);
// Get InBox, SentBox or DraftBox
rgFoldersClick(Self);
end
else
// Log Off
begin
// Clear all MAPI Interfaces
ReleaseAll;
// Close and clear MAPI Session
ReleaseMapiSession(MAPISession);
end;
btLogOff.Tag := Integer(Assigned(MAPISession));
btLogOff.Caption := strLogOff[Bool(btLogOff.Tag)];
end;
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Clear all MAPI Interfaces
ReleaseAll;
// Close and clear MAPI Session
ReleaseMapiSession(MAPISession);
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
{$IF DEFINED (WIN64)}
Self.Caption := Self.Caption + ' - WIN64';
{$ELSE}
Self.Caption := Self.Caption + ' - WIN32';
{$IFEND}
MessageListView.Items.Count := 0;
end;
procedure TfrmMain.LoadInboxMessages;
begin
// Get Inbox
if not Assigned(Inbox) then
Inbox := GetInbox(MsgStore);
// Get list of messages
MsgHeadList := GetMessageList(Inbox);
MsgHeadListCount := Length(MsgHeadList);
StatusBar.SimpleText := 'Message Count: ' + IntToStr(MsgHeadListCount) + ' in Inbox';
// Force virtual ListView to render items
MessageListView.Items.Count := MsgHeadListCount;
MessageListView.Refresh;
end;
procedure TfrmMain.LoadSentItemsMessages;
begin
// Get Sent items
if not Assigned(SentBox) then
SentBox := GetSentBox(MsgStore);
// Get list of messages
MsgHeadList := GetMessageList(SentBox);
MsgHeadListCount := Length(MsgHeadList);
StatusBar.SimpleText := 'Message Count: ' + IntToStr(MsgHeadListCount) +
' in Sent items';
// Force virtual ListView to render items
MessageListView.Items.Count := MsgHeadListCount;
MessageListView.Refresh;
end;
procedure TfrmMain.LoadDraftItems;
begin
// Get draft items
if not Assigned(DraftBox) then
DraftBox := GetDefaultFolder(MsgStore, oFolderDrafts, True, False);
// Get list of messages
MsgHeadList := GetMessageList(DraftBox);
MsgHeadListCount := Length(MsgHeadList);
StatusBar.SimpleText := 'Message Count: ' + IntToStr(MsgHeadListCount) +
' in Draft items';
// Force virtual ListView to render items
MessageListView.Items.Count := MsgHeadListCount;
MessageListView.Refresh;
end;
procedure TfrmMain.MessageListViewData(Sender: TObject; Item: TListItem);
begin
// Render virtual ListView
if Item.Index > MsgHeadListCount - 1 then
Exit;
Item.Caption := BoolToStr(MsgHeadList[Item.Index].HasAttachment, True);
Item.SubItems.Add(MsgHeadList[Item.Index].Subject);
Item.SubItems.Add(MsgHeadList[Item.Index].Sender);
Item.SubItems.Add(DateTimeToStr(MsgHeadList[Item.Index].SentTime));
Item.SubItems.Add(ShowCustomSize(MsgHeadList[Item.Index].Size));
end;
procedure TfrmMain.MessageListViewDblClick(Sender: TObject);
var
MAPIMessage: IMessage;
Index: Integer;
isUnSent: Boolean;
begin
if not Assigned(MessageListView.Selected) then
Exit;
Index := MessageListView.Selected.Index;
// Get MAPI Message from folder by EntryID
case rgFolders.ItemIndex of
0:
MAPIMessage := GetMapiMessage(Inbox, MsgHeadList[Index].ID);
1:
MAPIMessage := GetMapiMessage(SentBox, MsgHeadList[Index].ID);
2:
MAPIMessage := GetMapiMessage(DraftBox, MsgHeadList[Index].ID, False);
end;
if not Assigned(MAPIMessage) then
Exit;
// Whether the message is still a draft?
isUnSent := Bool(MsgHeadList[Index].Flags and MSGFLAG_UNSENT);
try
if isUnSent and (rgFolders.ItemIndex = 2) then
// Open a compose message
with TfrmNewMsg.Create(Self) do
begin
SetMAPIObjects(MAPISession, MsgStore, DraftBox, MAPIMessage);
ShowModal;
Free;
end
else
// open a received or sent message
with TfrmMessage.Create(Self) do
begin
SetMessage(MAPIMessage);
ShowModal;
end;
finally
// clear interface
MAPIMessage := nil;
end;
if (rgFolders.ItemIndex = 2) then
// refresh a Draft Items
LoadDraftItems;
end;
procedure TfrmMain.ReleaseAll;
begin
MessageListView.Items.Count := 0;
MsgHeadList := nil;
DraftBox := nil;
SentBox := nil;
Inbox := nil;
// Close message store
ReleaseMsgStore(MsgStore);
MsgStore := nil;
end;
procedure TfrmMain.rgFoldersClick(Sender: TObject);
begin
if not Assigned(MAPISession) then
Exit;
case rgFolders.ItemIndex of
0:
LoadInboxMessages;
1:
LoadSentItemsMessages;
2:
LoadDraftItems;
end;
end;
end.

