unit ReadMailDemoMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, JclMapi; type TForm1 = class(TForm) HeadersListView: TListView; PreviewRichEdit: TRichEdit; Splitter1: TSplitter; AttachmentsListBox: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure HeadersListViewSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); procedure HeadersListViewCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); private Email: TJclEmail; public procedure PrevievMessage(const SeedMessageID: string); procedure ReadHeaders; end; var Form1: TForm1; implementation {$R *.DFM} uses Mapi, // MAPI_UNREAD constant JclSysUtils; procedure TForm1.FormCreate(Sender: TObject); begin Email := TJclEmail.Create; ReadHeaders; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(Email); end; procedure TForm1.PrevievMessage(const SeedMessageID: string); var HeaderLinesCount: Integer; begin with PreviewRichEdit do begin Lines.BeginUpdate; try Lines.Clear; // Set SeedMessageID before reading Email.SeedMessageID := SeedMessageID; Email.Read; HeaderLinesCount := Email.MessageReport(Lines); // Message header part highlighting SelStart := 0; SelLength := SendMessage(Handle, EM_LINEINDEX, HeaderLinesCount, 0); SelAttributes.Style := [fsBold]; SelLength := 0; SelStart := 0; finally Lines.EndUpdate; end; end; AttachmentsListBox.Items.Assign(Email.Attachments); AttachmentsListBox.Visible := AttachmentsListBox.Items.Count > 0; end; procedure TForm1.ReadHeaders; var NextMessage: Boolean; begin // You have to be logged on before reading messages. LogOff is automatically // called in TJclEmail destructor. Email.LogOn; // SimpleMAPI is limited to read messages from InBox root folder only HeadersListView.Items.BeginUpdate; Screen.Cursor := crHourGlass; try HeadersListView.Items.Clear; NextMessage := Email.FindFirstMessage; while NextMessage do begin Email.Read([roHeaderOnly]); with HeadersListView.Items.Add do begin Caption := Email.Recipients.Originator.Name; SubItems.Add(Email.Subject); SubItems.Add(DateTimeToStr(Email.ReadMsg.DateReceived)); SubItems.Add(Email.SeedMessageID); Data := Pointer(Email.ReadMsg.Flags); // store Flags for custom draw end; NextMessage := Email.FindNextMessage; end; finally HeadersListView.Items.EndUpdate; Screen.Cursor := crDefault; end; end; procedure TForm1.HeadersListViewSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); begin if Selected then PrevievMessage(Item.SubItems[2]); end; procedure TForm1.HeadersListViewCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin if DWORD(Item.Data) and MAPI_UNREAD <> 0 then Sender.Canvas.Font.Style := [fsBold]; end; end.