Bjørnar Nielsen wrote:
> Arno,
> 
> I think you know this bether than me, but I think you are right.
> Calling RequestDone with errormessage would also solve the problem
> for me.  

A "500" status code were probably more suitable indicating a persistent
error, like '500 Internal client error ..'.

I changed DoHighLevelAsync in my copy as below, anybody any veto?
My projects only use the non-highlevel methods, so I never hit that.


procedure TCustomSmtpClient.DoHighLevelAsync;
begin
{$IFDEF TRACE} TriggerDisplay('! HighLevelAsync ' + IntToStr(FRequestResult)); 
{$ENDIF}
    if FState = smtpAbort then begin
        {$IFDEF TRACE} TriggerDisplay('! Abort detected'); {$ENDIF}
        FFctSet := [];
        FHighLevelResult := 426;
        FRequestResult   := 426;  { SJF }
        FErrorMessage    := '426 Operation aborted.';
    end;

    FNextRequest := DoHighLevelAsync;

    if FRequestResult <> 0 then begin
        { Previous command had errors }
        { EHLO wasn't supported, so just log in with HELO }
        if FFctPrv = smtpFctEhlo then
            FFctSet := [smtpFctHelo]
        else begin
            FHighLevelResult := FRequestResult;
            if (FFctPrv = smtpFctQuit) or (not (smtpFctQuit in FFctSet)) then
                FFctSet := []
            else
                FFctSet := [smtpFctQuit];
        end;
    end;

    try
        if smtpFctConnect in FFctSet then begin
            FFctPrv := smtpFctConnect;
            FFctSet := FFctSet - [FFctPrv];
            Connect;
            Exit;
        end;

        if smtpFctHelo in FFctSet then begin
            FFctPrv := smtpFctHelo;
            FFctSet := FFctSet - [FFctPrv];
            Helo;
            Exit;
        end;

        if smtpFctEhlo in FFctSet then begin
            FFctPrv := smtpFctEhlo;
            FFctSet := FFctSet - [FFctPrv];
            Ehlo;
            Exit;
        end;

        if smtpFctAuth in FFctSet then begin
            FFctPrv := smtpFctAuth;
            FFctSet := FFctSet - [FFctPrv];
            Auth;
            Exit;
        end;

        if smtpFctVrfy in FFctSet then begin
            FFctPrv := smtpFctVrfy;
            FFctSet := FFctSet - [FFctPrv];
            Vrfy;
            Exit;
        end;

        if smtpFctMailFrom in FFctSet then begin
            FFctPrv := smtpFctMailFrom;
            FFctSet := FFctSet - [FFctPrv];
            MailFrom;
            Exit;
        end;

        if smtpFctRcptTo in FFctSet then begin
            FFctPrv := smtpFctRcptTo;
            FFctSet := FFctSet - [FFctPrv];
            RcptTo;
            Exit;
        end;

        if smtpFctData in FFctSet then begin
            FFctPrv := smtpFctData;
            FFctSet := FFctSet - [FFctPrv];
            Data;
            Exit;
        end;

        if smtpFctQuit in FFctSet then begin
            FFctPrv := smtpFctQuit;
            FFctSet := FFctSet - [FFctPrv];
            Quit;
            Exit;
        end;

    except
        on E : Exception do begin
          {$IFDEF TRACE}
            TriggerDisplay('! ' + E.ClassName + ': "' + E.Message + '"');
          {$ENDIF}
            FHighLevelResult := 500;
            FRequestResult   := 500;
            FErrorMessage    := '500 Internal client error ' +
                                E.ClassName + ': "' + E.Message + '"';
        end;
    end;

    {$IFDEF TRACE} TriggerDisplay('! HighLevelAsync done'); {$ENDIF}
    FFctSet          := [];
    FNextRequest     := nil;
    FRequestDoneFlag := FALSE;
    TriggerRequestDone(FHighLevelResult);
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  


> 
> Regards Bjørnar
> 
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of Arno Garrels 
> Sent: 7. april 2008 12:15
> To: ICS support mailing
> Subject: Re: [twsocket] SMTPProt.pas
> 
> Bjørnar,
> 
> Won't it be smarter to trigger RequestDone with an error and the
> exception message?
> Someting like:
> 
> procedure TCustomSmtpClient.DoHighLevelAsync;
> [..]
>     try
>         [..]
>     except
>         on E:Exception do begin
>           {$IFDEF TRACE}
>             TriggerDisplay('! ' + E.ClassName + ': "' + E.Message +
> '"'); 
>           {$ENDIF}
>             FHighLevelResult := 427; // Just invented this error
> number hopefully not in use 
>             FRequestResult   := 427;
>             FErrorMessage    := '427 ' + E.ClassName + ': "' +
> E.Message + '"'; 
>         end;
>     end;                                     {Bjørnar}
> 
>     {$IFDEF TRACE} TriggerDisplay('! HighLevelAsync done'); {$ENDIF}
>     FFctSet          := [];
>     FNextRequest     := nil;
>     FRequestDoneFlag := FALSE;
>     TriggerRequestDone(FHighLevelResult);
> end;
> 
> Bjørnar Nielsen wrote:
>> I think there is a wakness/bug in the smtpprot.pas:
>> 
>> procedure TCustomSmtpClient.RcptTo;
>> 
>> begin
>> 
>>     if FRcptName.Count <= 0 then
>> 
>>         raise SmtpException.Create('RcptName list is empty');
>> 
>> 
>> 
>>     FItemCount := -1;
>> 
>>     RcptToNex
>> 
>> 
>> 
>> When this exception is raised, I cant catch it anywhere. No
>> bgexception, no requestdone. I added try/except in this procedure
>> (all the code in this procedure inside the try):
>> 
>> procedure TCustomSmtpClient.DoHighLevelAsync;
>> 
>>  like this:
>> 
>>     except                                  {Bjørnar}
>> 
>>       on E:Exception do                     {Bjørnar}
>> 
>>           HandleBackGroundException(E);     {Bjørnar}
>> 
>>     end;                                    {Bjørnar}
>> 
>> 
>> 
>> then I was able to catch it and shut down and release the
>> smtp-component. Any comments on this change?
>> 
>> 
>> 
>> Regards Bjørnar
>> 
>> 
>> No virus found in this outgoing message.
>> Checked by AVG.
>> Version: 7.5.519 / Virus Database: 269.22.5/1356 - Release Date:
>> 02.04.2008 16:14
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
> 
> No virus found in this incoming message.
> Checked by AVG.
> Version: 7.5.519 / Virus Database: 269.22.8/1362 - Release Date:
> 06.04.2008 11:12 
> 
> 
> No virus found in this outgoing message.
> Checked by AVG.
> Version: 7.5.519 / Virus Database: 269.22.8/1362 - Release Date:
> 06.04.2008 11:12 
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to