Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SMTP Mail, TidMessage im Thread (https://www.delphipraxis.net/187214-smtp-mail-tidmessage-im-thread.html)

haentschman 8. Nov 2015 16:17


SMTP Mail, TidMessage im Thread
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo alle...8-)

folgender Code: (Auszug)
Delphi-Quellcode:
function TdMail.SendMail(Recipients, Body: TStrings; Subject: string): Boolean;
var
  CurrentMessage: TIdMessage;

  function FillMessageRecipients(RecipientsList: TStrings): Boolean;
  var
    I: Integer;
    Item: TIdEMailAddressItem;
  begin
    Result:= (RecipientsList.Count > 0);
    for I := 0 to RecipientsList.Count - 1 do
    begin
      Item:= CurrentMessage.Recipients.Add;
      Item.Address:= RecipientsList[I];
    end;
  end;

begin
  Result:= False;
  CurrentMessage:= TIdMessage.Create(nil);
  try
    if FillMessageRecipients(Recipients) then
    begin
      CurrentMessage.From.Address:= FFromAddress;
      CurrentMessage.Subject:= Subject;
      CurrentMessage.Body.AddStrings(Body);

      Smtp.Password:= TdTools.DecryptPassword(FPasswordEncrypted);
      try
        Smtp.Connect;
        Smtp.Send(CurrentMessage);
        Smtp.Disconnect;
        if Assigned(FOnMailSend) then
        begin
          FOnMailSend(Self, CurrentMessage.Recipients[0].Address, CurrentMessage.Subject);
        end;
        Result:= True;
      except
        on E: Exception do
        begin
          if Assigned(FOnMailError) then
          begin
            FOnMailError(Self, CurrentMessage.Recipients[0].Address, CurrentMessage.Subject, conTextMailSendError + E.Message);
          end;
        end;
      end;
    end;
  finally
    CurrentMessage.Free; // <- bei dieser Freigabe
  end;
end;
... funktioniert normal im Main Thread. Die Mail kommt mit allen "Eintragungen" korrekt an.

Instanziere ich die Klasse TdMail in einem Thread knallt es im destructor von TidMessage beim Freigeben... :shock: Die Mail kommt trotzdem korrekt an.
Delphi-Quellcode:
destructor TIdMessage.Destroy;
begin
  FreeAndNil(FBody);
  FreeAndNil(FRecipients);
  FreeAndNil(FBccList);
  FreeAndNil(FCcList);
  FreeAndNil(FMessageParts);
  FreeAndNil(FNewsGroups);
  FreeAndNil(FHeaders);
  FreeAndNil(FExtraHeaders);
  FreeAndNil(FFromList); // <- hier
  FreeAndNil(FReplyTo);
  FreeAndNil(FSender);
  FreeAndNil(FReceiptRecipient);
  FreeAndNil(FMIMEBoundary);
  FreeAndNil(FLastGeneratedHeaders);
  inherited Destroy;
end;
...instanziert wird die FromList genau wie die vorhergehenden. :gruebel:
Delphi-Quellcode:
procedure TIdMessage.InitComponent;
begin
  inherited;
  FBody := TStringList.Create;
  TStringList(FBody).Duplicates := dupAccept;
  FRecipients := TIdEmailAddressList.Create(Self);
  FBccList := TIdEmailAddressList.Create(Self);
  FCcList := TIdEmailAddressList.Create(Self);
  FMessageParts := TIdMessageParts.Create(Self);
  FNewsGroups := TStringList.Create;
  FHeaders := TIdHeaderList.Create(QuoteRFC822);
  FFromList := TIdEmailAddressList.Create(Self); // <- hier
  FReplyTo := TIdEmailAddressList.Create(Self);
  FSender := TIdEmailAddressItem.Create;
  FExtraHeaders := TIdHeaderList.Create(QuoteRFC822);
  FReceiptRecipient := TIdEmailAddressItem.Create;
  NoDecode := ID_MSG_NODECODE;
  FMIMEBoundary := TIdMIMEBoundary.Create;
  FLastGeneratedHeaders := TIdHeaderList.Create(QuoteRFC822);
  Clear;
  FEncoding := meDefault;
end;

Irgendwelche Ideen dazu? :P Danke...

PS: Wenn man zur Gegenprobe die Freigabe auskommentiert gibt es einen A... voll Memory Leaks. 8-)

Uwe Raabe 8. Nov 2015 17:21

AW: SMTP Mail, TidMessage im Thread
 
Sind die Events verdrahtet? Bedenkst du, daß die im Thread-Kontext aufgerufen werden? Machen die was mit dem Self-Parameter?

mensch72 8. Nov 2015 17:22

AW: SMTP Mail, TidMessage im Thread
 
meine Standard-IDEE dazu:

!man zerstört besser IMMER in umgedrehter Reihenfolg zur Erstellung!

Stelle das mal so um und eventuell hat sich dein Problem damit auch schon gelöst:)

haentschman 8. Nov 2015 17:47

AW: SMTP Mail, TidMessage im Thread
 
Danke Jungs...:P Ihr dürft hauen... :wall:
Zitat:

Sind die Events verdrahtet? Bedenkst du, daß die im Thread-Kontext aufgerufen werden? Machen die was mit dem Self-Parameter?
Ja sind sie. Im Handler wird nur die "Message" zusammengesetzt und dann wird Synchronize(SyncOnLog). Self hat in diesem Falle nur statistische Wirkung. Paßt schon. 8-)
Delphi-Quellcode:
procedure TWorkerPollingServer.DoOnMail(Sender: TObject; Recipient, Subject: string);
begin
  FMsgLog:= CreateLogMessage(msNormal);
  try
    FMsgLog.DeviceID:= 0; //Server
    FMsgLog.MessageState:= msNormal;
    FMsgLog.LogTime:= Now;
    FMsgLog.LogText:= conTextMailInformation + 'versendet (' + conTextServer + ')';
    Synchronize(SyncOnLog);
  finally
    FMsgLog.Free;
  end;
end;
Zitat:

!man zerstört besser IMMER in umgedrehter Reihenfolg zur Erstellung!
...tja, das sind die Quellen der TidMessage der Indy´s. Da bin ich unschuldig. :thumb:

Schuldig im Sinne der Anklage! Den Mailer (TdMail) im constructor des Threads erstellt und nicht im Kontext vom Execute. :wall: Das kann nicht funktionieren. Ich reiche Urlaub ein. Wer lädt mich ein?.... 8-)

Komisch das man erst immer darüber schreiben muß bis einem so etwas auffällt. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz