Use the TThread
class instead of the CreateThread()
function, then you can use methods of the class as event handlers, eg:
unit Manage77c;
interface
procedure SendAMail (const AFileName: string);
implementation
uses
SysUtils, Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP, IdIOHandler,
IdIOHandlerSocket, IdSSL, IdIOHandlerStack, IdMessage, IdSSLOpenSSL;
type
TEmailThread = class(TThread)
private
FFileName: string;
FHost: string;
FPassword: string;
FUsername: string;
...
procedure DoInitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
procedure DoStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
...
protected
procedure Execute; override;
public
constructor Create(const AFileName, AHost, APassword, AUsername: string); reintroduce;
end;
constructor TEmailThread.Create(const AFileName, AHost, APassword, AUsername: string);
begin
inherited Create(False);
FreeOnTerminate := True;
FFileName := AFileName;
FHost := AHost;
FPassword := APassword;
FUsername := AUsername;
...
end;
procedure TEmailThread.Execute;
var
smtp: TIdSMTP;
ssl: TIdSSLIOHandlerSocketOpenSSL;
email: TIdMessage;
begin
email := TIdMessage.Create(nil);
try
email.LoadFromFile(FFileName);
email.OnInitializeISO := DoInitializeISO;
DeleteFile (FFileName);
smtp := TIdSMTP.Create(nil);
try
ssl := TIdSSLIOHandlerSocketOpenSSL.Create(smtp);
ssl.SSLOptions.SSLVersions := [sslvTLSv1];
smtp.OnStatus := DoStatus;
smtp.IOHandler := ssl;
smtp.Host := FHost;
smtp.Password := FPassword;
smtp.Username := FUsername;
smtp.UseTLS := utUseExplicitTLS;
smtp.Port := 587;
smtp.Connect;
try
smtp.Send(email);
finally
smtp.Disconnect;
end;
finally
smtp.Free;
end;
finally
email.Free;
end;
end;
procedure TEmailThread.InitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
...
end;
procedure TEmailThread.DoStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
begin
...
end;
procedure SendAMail (const AFileName: string);
var
host, user, pass: string;
begin
repeat
// this part gets the SMTP definitions from the database
dm.qGetSMTP.Open;
try
host := dm.qGetSMTP.FieldByName('smtphost').AsString;
username := dm.qGetSMTP.FieldByName('smtpuser').AsString;
password := dm.qGetSMTP.FieldByName('smtppass').AsString;
finally
dm.qGetSMTP.Close;
end;
if (host <> '') and (user <> '') and (pass <> '') then
Break;
with TGetSMTP.Create(nil) do // manage77a
try
Execute;
finally
Free;
end;
until False;
TEmailThread.Create(AFileName, host, pass, user);
end;
end.