Copyright © 2024 IMIBO. Privacy Statement
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.