In previous section, I introduced how to retrieve email from Hotmail/MSN Live account. In this section, I will introduce how to retrieve email with event handler in Delphi.
After Connect method, GetMail method or other methods are invoked, if you want to know the progress of the email receiving, you should use Event Handler. The following sample codes demonstrate how to use Event Handler to monitor the progress of email receiving.
Note
Remarks: All of examples in this section are based on first section: A simple Delphi project. To compile and run the following example codes successfully, please click here to learn how to create the test project and add reference to your project.
The following example codes demonstrate how to use EAGetMail POP3 component to retrieve
email with event handler. In order to run it correctly, please change
email server
, user
, password
, folder
, file name
values.
Please add a TLable control named Label1
.
Note
To get the full sample projects, please refer to Samples section.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, EAGetMailObjLib_TLB; // Add EAGetMail unit
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
// EAGetMail event handler
procedure OnIdle(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
procedure OnConnected(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
procedure OnQuit(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
procedure OnSecuring(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
procedure OnAuthorized(ASender: TObject; const oSender: IDispatch;
var Cancel: WordBool);
procedure OnSendingDataStream(ASender: TObject; const oSender: IDispatch;
Sent: Integer; Total: Integer;
var Cancel: WordBool);
procedure OnReceivingDataStream(ASender: TObject; const oSender: IDispatch;
const oInfo: IDispatch;
Received: Integer; Total: Integer;
var Cancel: WordBool);
public
{ Public declarations }
end;
const
MailServerPop3 = 0;
MailServerImap4 = 1;
MailServerEWS = 2;
MailServerDAV = 3;
MailServerMsGraph = 4;
var
Form1: TForm1;
implementation
{$R *.dfm}
// EAGetMail event handler
procedure TForm1.OnIdle(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
begin
Application.ProcessMessages();
end;
procedure TForm1.OnConnected(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
begin
Label1.Caption := 'Connected';
end;
procedure TForm1.OnQuit(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
begin
Label1.Caption := 'Disconnecting ...';
end;
procedure TForm1.OnSecuring(ASender: TObject; const oSender: IDispatch; var Cancel: WordBool);
begin
Label1.Caption := 'Securing ...';
end;
procedure TForm1.OnAuthorized(ASender: TObject; const oSender: IDispatch;
var Cancel: WordBool);
begin
Label1.Caption := 'Authorized';
end;
procedure TForm1.OnSendingDataStream(ASender: TObject; const oSender: IDispatch;
Sent: Integer; Total: Integer;
var Cancel: WordBool);
begin
//implementation code for IMAP4 appending event
end;
procedure TForm1.OnReceivingDataStream(ASender: TObject; const oSender: IDispatch;
const oInfo: IDispatch;
Received: Integer; Total: Integer;
var Cancel: WordBool);
var
info: IMailInfo;
begin
info := oInfo as IMailInfo;
Label1.Caption := Format( 'Receiving %d, %d/%d ...',
[info.Index, Received, Total]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
oServer: TMailServer;
oClient: TMailClient;
oTools: TTools;
oMail: IMail;
infos: IMailInfoCollection;
oInfo: IMailInfo;
localInbox, fileName: WideString;
i: Integer;
begin
try
// set current thread code page to system default code page.
SetThreadLocale(GetSystemDefaultLCID());
oTools := TTools.Create(Application);
// Create a folder named "inbox" under
// current directory to store the email files
localInbox := GetCurrentDir() + '\inbox';
oTools.CreateFolder(localInbox);
oServer := TMailServer.Create(Application);
oServer.Server := 'pop3.emailarchitect.net';
oServer.User := 'test@emailarchitect.net';
oServer.Password := 'testpassword';
oServer.Protocol := MailServerPop3;
// Enable SSL/TLS Connection, most modern email server require SSL/TLS connection by default.
oServer.SSLConnection := true;
// Set 995 SSL POP3 port
oServer.Port := 995;
// If your POP3 server doesn't deploy SSL connection
// Please use
// oServer.SSLConnection := false;
// oServer.Port := 110;
oClient := TMailClient.Create(Application);
oClient.LicenseCode := 'TryIt';
// Add eagetmail event handler
oClient.OnIdle := OnIdle;
oClient.OnConnected := OnConnected;
oClient.OnQuit := OnQuit;
oClient.OnSecuring := OnSecuring;
oClient.OnAuthorized := OnAuthorized;
oClient.OnSendingDataStream := OnSendingDataStream;
oClient.OnReceivingDataStream := OnReceivingDataStream;
Label1.Caption := 'Connecting ...';
oClient.Connect1(oServer.DefaultInterface);
Label1.Caption := 'Connected!';
infos := oClient.GetMailInfoList();
Label1.Caption := Format('Total %d email(s)', [infos.Count]);
for i := 0 to infos.Count - 1 do
begin
oInfo := infos.Item[i];
Label1.Caption := Format('Index: %d; Size: %d; UIDL: ' + oInfo.UIDL,
[oInfo.Index, oInfo.Size]);
// Generate a random file name by current local datetime,
// You can use your method to generate the filename if you do not like it
fileName := localInbox + '\' + oTools.GenFileName(i) + '.eml';
// Receive email from POP3 server
oMail := oClient.GetMail(oInfo);
Label1.Caption := 'From: ' + oMail.From.Address + #13#10 +
'Subject: ' + oMail.Subject;
// Save email to local disk
oMail.SaveAs(fileName, true);
// Mark email as deleted from POP3 server
oClient.Delete(oInfo);
end;
// Quit and expunge emails marked as deleted from POP3 server
oClient.Quit;
Label1.Caption := 'Completed!';
except
on ep:Exception do
Label1.Caption := 'Error: ' + ep.Message;
end;
end;
end.
Next Section
At next section I will introduce how to use UIDL function to mark the email has been downloaded.
Appendix
Comments
If you have any comments or questions about above example codes, please click here to add your comments.