I found that SmtpProt (v5, v5 beta, and v6 beta) has a memory leak in TSmtpCli.PrepareEMail. Memory is allocated but not released for each email Sent: unencoded: slightly larger than the body of the email, encoded: slightly larger than twice the body of the email.
The current source is: {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} procedure TSmtpCli.PrepareEMail; {var I : Integer;} begin FBodyFlag := TRUE; FCurrentFile := 0; FBodyLine := 0; FFileStarted := FALSE; FEncoding := FDefaultEncoding; {AG} {AG start} { FMailMessage.Text is being encoded/wrapped later on the fly, } { see also TriggerGetData and DoGetMsgTextLine } {if Length(FMailMessage.Text) > 0 then} { FP 05/03/06 } if FMailMessage.GetText^ <> #0 then FMailMsgTextPos := 1 else FMailMsgTextPos := 0; { Check if we have to change Encoding. } if (FMailMsgTextPos > 0) and (FEncoding in [smtpEnc7bit, smtpEnc8bit]) and (not FAllow8bitChars) then if NeedsEncodingPChar(FMailMessage.GetText) then {FP} if NeedsEncoding(FMailMessage.Text) then FEncoding := smtpEncQuotedPrintable; {AG end} ... {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} The "GetText" is the culprit, it is described in Delphi help for TStrings.GetText: "Call GetText to obtain a dynamically allocated character buffer containing all of the strings in the list. Individual strings are separated by a carriage return and (on Windows) line feed. The caller is responsible for freeing the returned value using the StrDispose procedure." A pointer to the buffer created by GetText was not saved so you could not free it. The problem can be fixed one of two ways: 1) store the pointer to the Character buffer then free it when it is no longer needed, or 2) or change the code as follows: {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} procedure TSmtpCli.PrepareEMail; {var I : Integer;} begin FBodyFlag := TRUE; FCurrentFile := 0; FBodyLine := 0; FFileStarted := FALSE; FEncoding := FDefaultEncoding; {AG} {AG start} { FMailMessage.Text is being encoded/wrapped later on the fly, } { see also TriggerGetData and DoGetMsgTextLine } {if Length(FMailMessage.Text) > 0 then} { FP 05/03/06 } //CE if FMailMessage.GetText^ <> #0 then if FMailMessage.Count > 0 then //CE FMailMsgTextPos := 1 else FMailMsgTextPos := 0; { Check if we have to change Encoding. } if (FMailMsgTextPos > 0) and (FEncoding in [smtpEnc7bit, smtpEnc8bit]) and (not FAllow8bitChars) then //CE if NeedsEncodingPChar(FMailMessage.GetText) then {FP} if NeedsEncoding(FMailMessage.Text) then {FP} //CE if NeedsEncoding(FMailMessage.Text) then FEncoding := smtpEncQuotedPrintable; {AG end} ... {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} Carl Efird -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be