Componentes.Terceros.RemObj.../internal/5.0.23.613/1/RemObjects SDK for Delphi/Source/uROIndyEmailChannel.pas
david 2824855ea7 - Modificación del paquete RemObjects_Core_D10 para que sea un paquete de runtime/designtime (antes era designtime sólo)
- Recompilación en Delphi10 de todos los paquetes de RO para generar las DCU's en Lib\D10
- Recompilación en Delphi10 de todos los paquetes de DA para generar las DCU's en Lib\D10

git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.RemObjects@9 b6239004-a887-0f4b-9937-50029ccdca16
2007-09-10 14:06:19 +00:00

320 lines
10 KiB
ObjectPascal

unit uROIndyEmailChannel;
{----------------------------------------------------------------------------}
{ RemObjects SDK Library - Indy Components }
{ }
{ compiler: Delphi 5 and up, Kylix 2 and up }
{ platform: Win32, Linux }
{ }
{ (c)opyright RemObjects Software. all rights reserved. }
{ }
{ Using this code requires a valid license of the RemObjects SDK }
{ which can be obtained at http://www.remobjects.com. }
{----------------------------------------------------------------------------}
{$I RemObjects.inc}
interface
uses
Classes,
IdBaseComponent,
{$IFDEF RemObjects_INDY10} IdAttachment, {$ENDIF}
uROClient, uROClientIntf, uROAsync, IdSMTP, IdPOP3;
type
TROCustomEmailChannel = class(TROTransportChannel, IROTransport, IROAsyncTransportChannel)
private
fClientEmail: string;
fServerEmail: string;
fSmtpClient: TIdSMTP;
fPop3Client: TIdPOP3;
fDeleteOldResponses: boolean;
procedure SetSmtpClient(const Value: TIdSMTP);
function GetSmtpServerAddress: string;
procedure SetSmtpServerAddress(const Value: string);
procedure SetPopClient(const Value: TIdPOP3);
function GetPop3ServerAddress: string;
procedure SetPop3ServerAddress(const Value: string);
function GetPop3Password: string;
function GetPop3username: string;
procedure SetPop3password(const Value: string);
procedure SetPop3Username(const Value: string);
protected
{ IROTransport }
function GetTransportObject: TObject; override;
{ IROAsyncTransport }
function CheckStatus(const iMessageID:string):Boolean;
function InvokeRequest(aRequest:TStream; iGetResponse:boolean=true):string;
procedure RetrieveResponse(const aMessageID:string; aResponse:TStream);
procedure IntDispatch(aRequest, aResponse : TStream); override;
public
constructor Create(aOwner:TComponent); override;
destructor Destroy; override;
public { for publishing in descendand classes }
property Pop3ServerAddress:string read GetPop3ServerAddress write SetPop3ServerAddress;
property SmtpServerAddress:string read GetSmtpServerAddress write SetSmtpServerAddress;
property ServerEmail:string read fServerEmail write fServerEmail;
property ClientEmail:string read fClientEmail write fClientEmail;
property SmtpClient:TIdSMTP read fSmtpClient write SetSmtpClient;
property Pop3Client:TIdPOP3 read fPop3Client write SetPopClient;
property Pop3Username: string read GetPop3username write SetPop3Username;
property Pop3Password: string read GetPop3Password write SetPop3password;
property DeleteOldResponses:boolean read fDeleteOldResponses write fDeleteOldResponses default false;
procedure CheckProperties; override;
end;
TROEmailChannel = class(TROCustomEmailChannel)
published
property Pop3ServerAddress;
property SmtpServerAddress;
property ServerEmail;
property ClientEmail;
property SmtpClient;
property Pop3Client;
property Pop3Username;
property Pop3Password;
property DeleteOldResponses;
published
property SynchronizedProbing;
property OnSendStream;
property OnReceiveStream;
property ServerLocators;
property DispatchOptions;
property OnServerLocatorAssignment;
property ProbeServers;
property ProbeFrequency;
property OnBeforeProbingServers;
property OnAfterProbingServers;
property OnBeforeProbingServer;
property OnAfterProbingServer;
property OnLoginNeeded;
end;
implementation
uses
{$IFDEF DELPHI5}Windows,{$ENDIF}
SysUtils, IdMessage, uROClasses, {$IFDEF RemObjects_INDY9}IdMessageCoder,{$ENDIF}
uROIndyEmail;
{ TROCustomEmailChannel }
constructor TROCustomEmailChannel.Create(aOwner: TComponent);
begin
inherited;
fSmtpClient := TIdSMTP.Create(self);
fSmtpClient.Name := 'InternalSmtpClient';
fPop3Client := TIdPOP3.Create(self);
fPop3Client.Name := 'InternalPop3Client';
{$IFDEF VER140UP}
fSmtpClient.SetSubComponent(true);
fPop3Client.SetSubComponent(true);
{$ENDIF VER140UP}
end;
destructor TROCustomEmailChannel.Destroy;
begin
FreeAndNil(fSmtpClient);
FreeAndNil(fPop3Client);
inherited;
end;
function TROCustomEmailChannel.GetTransportObject: TObject;
begin
result := self;
end;
procedure TROCustomEmailChannel.SetSmtpClient(const Value: TIdSMTP);
begin
fSmtpClient.Assign(Value);
end;
function TROCustomEmailChannel.GetSmtpServerAddress: string;
begin
result := fSmtpClient.Host;
end;
procedure TROCustomEmailChannel.SetSmtpServerAddress(const Value: string);
begin
fSmtpClient.Host := Value;
end;
procedure TROCustomEmailChannel.SetPopClient(const Value: TIdPOP3);
begin
fPop3Client.Assign(Value);
end;
function TROCustomEmailChannel.GetPop3Password: string;
begin
result := fPop3Client.Password;
end;
function TROCustomEmailChannel.GetPop3ServerAddress: string;
begin
result := fPop3Client.Host;
end;
function TROCustomEmailChannel.GetPop3username: string;
begin
{$IFDEF RemObjects_INDY8}
result := fPop3Client.UserId;
{$ELSE}
result := fPop3Client.Username;
{$ENDIF RemObjects_INDY8}
end;
procedure TROCustomEmailChannel.SetPop3password(const Value: string);
begin
fPop3Client.Password := Value;
end;
procedure TROCustomEmailChannel.SetPop3ServerAddress(const Value: string);
begin
fPop3Client.Host := Value;
end;
procedure TROCustomEmailChannel.SetPop3Username(const Value: string);
begin
{$IFDEF RemObjects_INDY8}
fPop3Client.UserId := Value;
{$ELSE}
fPop3Client.Username := Value;
{$ENDIF RemObjects_INDY8}
end;
procedure TROCustomEmailChannel.IntDispatch(aRequest, aResponse: TStream);
var
lMessageID:string;
begin
lMessageID := InvokeRequest(aRequest);
while not CheckStatus(lMessageID) do Sleep(1000); //ToDo: this is a lame workaround to get synchronous requests running now.
RetrieveResponse(lMessageID,aResponse);
end;
function TROCustomEmailChannel.InvokeRequest(aRequest:TStream; iGetResponse:boolean=true):string;
begin
CheckProperties;
try
result := NewGuidAsString();
uROIndyEmail.SendMessage(fSmtpClient,aRequest,REQUEST_MESSAGE_PREFIX,result,ClientEmail,ServerEmail);
finally
aRequest.Free();
end;
end;
function TROCustomEmailChannel.CheckStatus(const iMessageID:string):Boolean;
var
i:integer;
lMessage:TIdMessage;
begin
CheckProperties;
result := false;
fPop3Client.Connect();
try
for i := 1 to fPop3Client.CheckMessages do begin
lMessage := TIdMessage.Create(fPop3Client);
try
if fPop3Client.RetrieveHeader(i,lMessage) and
(lMessage.Subject = RESPONSE_MESSAGE_PREFIX+' '+iMessageID) then begin
result := true;
exit;
end;
finally
FreeAndNil(lMessage);
end;
end;
finally
fPop3Client.Disconnect();
end;
end;
procedure TROCustomEmailChannel.RetrieveResponse(const aMessageID:string; aResponse:TStream);
var
i,j:integer;
lMessage:TIdMessage;
lAttachment:TIdAttachment;
lTempFile:string;
lFileStream:TFileStream;
lSuccess:boolean;
begin
lSuccess := false;
CheckProperties;
fPop3Client.Connect();
try
for i := 1 to fPop3Client.CheckMessages do begin
lMessage := TIdMessage.Create(fPop3Client);
try
if fPop3Client.RetrieveHeader(i,lMessage) then begin
if (lMessage.Subject = RESPONSE_MESSAGE_PREFIX+' '+aMessageID) then begin
fPop3Client.Retrieve(i,lMessage);
for j := 0 to lMessage.MessageParts.Count-1 do begin
if (lMessage.MessageParts[j] is TIdAttachment) then begin
lAttachment := TIdAttachment(lMessage.MessageParts[j]);
if lAttachment.Filename = aMessageID+MESSAGE_FILE_EXTENSION then begin
lTempFile := GetTempPath+lAttachment.Filename;
lAttachment.SaveToFile(lTempFile);
try
lFileStream := TFileStream.Create(lTempFile,fmOpenRead);
try
aResponse.CopyFrom(lFileStream,lFileStream.Size);
finally
lFileStream.Free();
end;
finally
DeleteFile(lTempFile);
end;
lSuccess := true;
fPop3Client.Delete(i);
if not DeleteOldResponses then exit;
end;
if not lSuccess then RaiseError('Invalid Response email found for this communication: No response message attachment.');
end;
end;
end
else if DeleteOldResponses and (Pos(RESPONSE_MESSAGE_PREFIX+' ', lMessage.Subject) = 1) then begin
fPop3Client.Delete(i);
end;
end;
finally
FreeAndNil(lMessage);
end;
end;
finally
fPop3Client.Disconnect();
end;
if not lSuccess then
raise EROAsyncNoAnswerYet.Create('No Response email found for this communication, yet.');
end;
procedure TROCustomEmailChannel.CheckProperties;
begin
inherited;
Check(Pop3ServerAddress = '', Name + '.Pop3ServerAddress must be set.');
Check(SmtpServerAddress = '', Name + '.SmtpServerAddress must be set.');
Check(ServerEmail = '', Name + '.ServerEmail must be set.');
Check(ClientEmail = '', Name + '.ClientEmail must be set.');
Check(Pop3Username = '', Name + '.Pop3Username must be set.');
Check(Pop3Password = '', Name + '.Pop3Password must be set.');
end;
initialization
RegisterTransportChannelClass(TROEmailChannel);
finalization
UnRegisterTransportChannelClass(TROEmailChannel);
end.