If you are having problems after you installed components, like:

File not found *.dcu, or *.pas, try adding path to Tools->Options->Library - Win32 -> Library path

Now, little bit about MAPI.

According to wikipedia MAPI is designed to be independent of the protocol, it is usually used with MAPI/RPC, the proprietary protocol that Microsoft Outlook uses to communicate with Microsoft Exchange. So, I read this like MAPI is a protocol.

To use MAPI you will need MS Outlook MS Exchange or MS Exchange client, which you can download from here, installed on machine.

There are two kind of MAPI, simple MAPI and extended MAPI.

According to Microsoft most of functions of simple MAPI are deprecated, so I focus here on extended MAPI.

Again, according to Microsoft exended MAPI can be difficult to learn.

For Delphi you can use Easier Extended MAPI, like it is described here, but that was also too difficult to learn, too much time I will need, so I found RapWare Easy MAPI components, which completely satisfy me.I don't think that I need to write too much about them, since they have very good examples about everything.

Maps, small example of using different maps. Exe you can download from here, source from here.

One note to my self, this is piece of code which I was using for starting application from command prompt and getting an information, was that succesfull or not.

function CaptureConsoleOutput(DosApp : string; var strLog : String): Boolean;
const
  ReadBuffer = 1048576;  // 1 MB Buffer
var
  Security: TSecurityAttributes;
  ReadPipe,WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: Pchar;
  TotalBytesRead,
  BytesRead: DWORD;
  Apprunning,n,
  BytesLeftThisMessage,
  TotalBytesAvail : integer;
  xCode: Cardinal;
  bolOk: Boolean;
begin
  bolOk := False;

  with Security do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;

  if CreatePipe (ReadPipe, WritePipe, @Security, 0) then
  begin
  // Redirect In- and Output through STARTUPINFO structure

  Buffer := AllocMem(ReadBuffer + 1);
  FillChar(Start,Sizeof(Start),#0);
  start.cb := SizeOf(start);
  start.hStdOutput := WritePipe;
  start.hStdInput := ReadPipe;
  start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
  start.wShowWindow := SW_HIDE;
  start.hStdError := WritePipe;

  // Create a Console Child Process with redirected input and output

  if CreateProcess(nil, PChar(DosApp),
  @Security,@Security,
true, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS,
nil, nil,
  start, ProcessInfo) then
  begin
  n:=0;
  TotalBytesRead:=0;
  repeat
  // Increase counter to prevent an endless loop if the process is dead
  Inc(n,1);

  // wait for end of child process
  Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
  Application.ProcessMessages;

  // it is important to read from time to time the output information
  // so that the pipe is not blocked by an overflow. New information
  // can be written from the console app to the pipe only if there is
  // enough buffer space.

  if not PeekNamedPipe(ReadPipe  ,@Buffer[TotalBytesRead],
  ReadBuffer, @BytesRead,
 @TotalBytesAvail,@BytesLeftThisMessage) then break
  else if BytesRead > 0 then
  ReadFile(ReadPipe,Buffer[TotalBytesRead],BytesRead,BytesRead,nil);
  TotalBytesRead:=TotalBytesRead+BytesRead;
  until (Apprunning <> WAIT_TIMEOUT) or (n > 150);
  GetExitCodeProcess(ProcessInfo.hProcess,xCode);
  if xCode=0 then
  bolOk := True
  else
  bolOk := False;

  Buffer[TotalBytesRead]:= #0;
  OemToChar(Buffer,Buffer);
  strLog := strLog + StrPas(Buffer);
  end;
  FreeMem(Buffer);

  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ReadPipe);
  CloseHandle(WritePipe);
  Result := bolOk;
  end;
end;