Mega Code Archive

 
Categories / Delphi / Ide Indy
 

Using simple MAPI from Delphi

Title: Using simple MAPI from Delphi Question: How can read emails from OutlookExpress, Outlook or Eudora from a Delphi program? Answer: We can read emails from any MAPI compliant email client using MAPI. The bad news is that we cannot read formatted email using simple MAPI, but only the plain text and attachments. Thats because MAPI was created before HTML formatted emails were created. But MAPI can bevery useful anyway. To run this program create a blank form (on IDE point to "File/Close all", then "File/New Application"), put a button on it, a Label (both on standard tab)and a RichEdit (on Win32 tab; I used a RichEdit because Memo can only handle 32k of text). I hope this will be useful to you! // ----------------- Cut source code from here ----------------- unit Unit1; {***************************************************************** * Simple MAPI sample * * Source written by Rafael Cotta (rcotta.geo@yahoo.com) * * July 26th, 2001 * *****************************************************************} // To run this sample, place on a blank form a TRichEdit, a TLabel // and a TButton interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, MAPI; type TForm1 = class(TForm) RichEdit1: TRichEdit; Button1: TButton; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1 : TForm1; hndMAPISession : Cardinal; v_CurrentMsgID : array[0..512] of char; // Ill use long IDs here implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin // Initializing components and variables v_CurrentMsgID[0] := #0; hndMAPISession := 0; Button1.Caption := 'Read Next'; RichEdit1.Lines.Clear; Label1.Caption := 'Subject : '; end; procedure TForm1.Button1Click(Sender: TObject); var dwRet : Cardinal; v_Out : array[0..512] of char; oMsg : PMapiMessage; begin Label1.Caption := 'Retrieving... wait'; if hndMAPISession = 0 then begin dwRet := MapiLogOn( Handle, // This windows handle '', // If you want to use another profile thats '', // not the default, set these two parameters MAPI_LOGON_UI,// Will prompt for logon if necessary 0, // Reserve, must be 0 @hndMAPISession); // An error occurred if (dwRet SUCCESS_SUCCESS) then begin MessageBox(Handle, PChar('Error ' + IntToHex(dwRet, 8) + ' while trying to logon'), PChar('Error'), MB_OK + MB_ICONERROR); Application.Terminate; Exit; end; end; dwRet := MapiFindNext( hndMAPISession, Handle, nil, // All messages @v_CurrentMsgID, MAPI_GUARANTEE_FIFO {sort by date; you can use "or MAPI_UNREAD_ONLY"}, 0, @v_Out // The messageId of message next to v_Current will be here ); // Reached the end, so, going to first message if dwRet = MAPI_E_NO_MESSAGES then begin v_CurrentMsgID[0] := #0; MessageBox(Handle, PChar('Last message reached. Going to first one in InBox'), PChar('MAPI sample'), MB_OK + MB_ICONEXCLAMATION); dwRet := MapiFindNext( hndMAPISession, Handle, nil, // All messages @v_CurrentMsgID, MAPI_GUARANTEE_FIFO {sort by date; you can use "or MAPI_UNREAD_ONLY"}, 0, @v_Out // The messageId of message next to v_Current will be here ); end; StrCopy(@v_CurrentMsgID, @v_Out); dwRet := MapiReadMail( hndMAPISession, Handle, @v_CurrentMsgID, MAPI_PEEK, // Wont mark message as read 0, oMsg ); if dwRet = SUCCESS_SUCCESS then begin RichEdit1.SetTextBuf(oMsg.lpszNoteText); Label1.Caption := 'Subject : ' + StrPas(oMsg.lpszSubject); end; if Assigned(oMsg) then MapiFreeBuffer(oMsg); end; end.