Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.314 Beiträge
 
Delphi 12 Athens
 
#1

SMTP Mail, TidMessage im Thread

  Alt 8. Nov 2015, 16:17
Hallo alle...

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... 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.
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? Danke...

PS: Wenn man zur Gegenprobe die Freigabe auskommentiert gibt es einen A... voll Memory Leaks.
Miniaturansicht angehängter Grafiken
message.png   message_1.png  

Geändert von haentschman ( 8. Nov 2015 um 16:40 Uhr)
  Mit Zitat antworten Zitat