Hi Arno

One other thing:

- The ICS code is running in a COM component that is running within a Server 
powered by RTC (realthinclient.com). 
- RTC does an awful lot of similar things to ICS (uses winsock etc), except 
that it does not have an SMTP component.
- Is it possible that ICS and RTC are interferring with each other?

Here's the code (event handlers, followed by the setup code):

Thanks for helping by the way, I'm going out of my mind right now.

procedure TGatewayPhoenix.handleSMTPRequestDone(asoSender: TObject;
  ausRqType: TSmtpRequest; aiError: Word);
begin
    touch();

    if obDebugLogging then
    begin
        if (aiError > 0) and  (aiError < 10000) then
            osoModule.osoDebugLogger.DoDebugLog(
                asoSender, loDestFile,
                'RequestDone Rq=' + IntToStr(Ord(ausRqType)) +
                ' Error='+ osoEmailWriter.ErrorMessage)
        else
            osoModule.osoDebugLogger.DoDebugLog(
                asoSender, loDestFile,'RequestDone Rq=' + 
IntToStr(Ord(ausRqType)) +
                       ' Error='+ IntToStr(Error));
    end;

    if (aiError > 0) and  (aiError < 10000) then
    begin
        if (ousStatus<>gpErrorNoRetry) and (ousStatus<>gpErrorRetry) then
        begin
            // 400 series errors are supposedly non-fatal or 'intermittent'
            if (aiError>=400) and (aiError<500) then
                ousStatus := gpErrorRetry
            else ousStatus := gpErrorNoRetry;
            osAdditional := 'Request='+IntToStr(Ord(ausRqType)) +
                ' Error='+ osoEmailWriter.ErrorMessage +
                ' ' + oslastEmailAddress + ' ' + osLastTitle;
            abort();
            exit;
        end;
    end;

    case ausRqType of
        smtpConnect:
            begin
                if osoEmailWriter.AuthType = smtpAuthNone then
                    osoEmailWriter.Helo
                else osoEmailWriter.Ehlo;
            end;
        smtpHelo:
            osoEmailWriter.MailFrom;
        smtpEhlo:
            osoEmailWriter.Auth;
        smtpAuth:
            osoEmailWriter.MailFrom;
        smtpMailFrom:
            osoEmailWriter.RcptTo;
        smtpRcptTo:
            osoEmailWriter.Data;
        smtpData:
            begin
                ousStatus := gpSent;
                osoEmailWriter.Quit;
            end;

        smtpQuit:
    end;

end;

procedure TGatewayPhoenix.handleSmtpGetData(asoSender: TObject;
  aiLineNum: Integer; apMsgLine: Pointer; aiMaxLen: Integer;
  var abMore: Boolean);
var
    lsLine, lsPart1, lsPart2: string;
    lbIsSplit: boolean;
    liMaxLen: integer;
begin
    // This is an event called from the ics lib component to get the text of the
    // message.
    touch();
    if aiLineNum > osoMessage.Count then
    begin
        abMore := FALSE;
    end else
    begin
        // Break the text into lines of reasonable length, wrapping
        // as appropriate
        liMaxLen := min(aiMaxLen, oiMaxLineChars);
        lsLine := osoMessage[aiLineNum - 1];
        TSerioUtilities.splitLongString(lsLine, liMaxLen - 1, lbIsSplit,
            lsPart1, lsPart2);
        if lbIsSplit then
        begin
            StrPCopy(apMsgLine, lsPart1);
            osoMessage.Insert(aiLineNum, lsPart2);
        end else
        begin
            StrPCopy(apMsgLine, lsLine);
        end;
    end;
end;

procedure TGatewayPhoenix.handleSMTPHeaderLine(asoSender: TObject;
  apMsg: Pointer; aiSize: Integer);
var
    lsAccountMsg: string;
begin
    touch();
    if StrLIComp(apMsg, 'From:', 5) = 0 then
    begin
        lsAccountMsg := #13#10 + 'Account code:' + osAccountCode;
        StrCat(apMsg, PChar(lsAccountMsg));
    end;
end;

procedure TGatewayPhoenix.handleSMTPOnResponse(asoSender: TObject;
  asMsg: String);
begin
    touch();

    if obDebugLogging then
    begin
        osoModule.osoDebugLogger.DoDebugLog(asoSender, loDestFile, asMsg);
    end;
end;

procedure TGatewayPhoenix.init(const aiTimeoutSecs: integer;  const 
asAccountCode: string;
        const auoOM: TObjectory; const aiThreadID: cardinal );
Const
    // Registry settings used to give control to change things under
    // direction for Serio support
    MAX_CHARS_PER_LINE = 80;
    REG_SMTP_SECTION = 'seg_smtp';
    REG_CHARS_PER_LINE = 'chars_line';
var
    lsoReg: TRegIniFile;
begin

    ouoOM := auoOM;

    oiThreadID := aiThreadID;

    osAccountCode := asAccountCode;
    ouoServiceConfig := TServiceConfig.Create();
    ouoOM.addObject(ouoServiceConfig);
    ouoServiceConfig.init(auoOM);
    ouoServiceConfig.xsAccountCode := asAccountCode;

    osoEmailWriter := osoModule.osoEMailWriter;

    osoEmailWriter.OnCommand := handleSMTPOnCommand;
    osoEmailWriter.OnGetData := handleSmtpGetData;
    osoEmailWriter.OnHeaderLine := handleSMTPHeaderLine;
    osoEmailWriter.OnRequestDone := handleSMTPRequestDone;
    osoEmailWriter.OnResponse := handleSMTPOnResponse;
    osoEmailWriter.OnDisplay := handleSMTPOnDisplay;

    oiTimeoutSecs := aiTimeoutSecs;

    lsoReg := nil;
    try
    lsoReg := TRegIniFile.Create('Serio');
    oiMaxLineChars := lsoReg.ReadInteger(REG_SMTP_SECTION, REG_CHARS_PER_LINE,
            MAX_CHARS_PER_LINE);
    oiMaxLineChars := max(oiMaxLineChars, 20);

    finally
        if lsoReg<>nil then lsoReg.free();
    end;
end;

Here is a snipper from the thread message pump

    if initGateway() < 0 then
    begin
        Terminate();
        exit;
    end;

    while terminated=FALSE do
    begin
        GetMessage( lssMsg, 0, 0, 0);

        if obInitialised then
        begin
            case lssMsg.message of
                EMAIL_GATEWAY_TICK:
                    begin
                        try

                        case ouoGateway.xusStatus of
                            gpReady:
                                // ready to send
                                processEmails();
// snipped
....
// Snipped
                        except on e1: exception do
                            begin
                                getSessionMgr(ouoOM).xuoConsole.addAlert('Email 
Gateway',
                                    TSvrRoot.loadString(1904) + ' : ' + 
e1.classname() + ' : ' +
                                    e1.Message, asHigh);
                                // try resetting the email object
                                ouoGateway.reset();
                            end;
                        end;

                    end;
                EMAIL_GATEWAY_QUIT:
                    begin
                        if ouoGateway.xusStatus=gpBusy then
                            ouoGateway.reset();
                        Terminate();
                        exit;
                    end;
            end;
        end;

        TranslateMessage(lssMsg);
        DispatchMessage(lssMsg);
    end;

> No idea why this happens with your code, maybe in line 2456? ;-)
> Please show us some code.   
> All I can say is that I have been using TSmtpCli V5 in a worker 
> thread with large and very large attachments over many years w/o 
> any problem of that kind (D4 and D7).
> 
> --
> Arno Garrels
> 
> 
> 
> --
> 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

_________________________________________________________________

Upgrade to Internet Explorer 8 Optimised for MSN.  

http://extras.uk.msn.com/internet-explorer-8/?ocid=T010MSN07A0716U
--
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