Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mailversand nur einmal möglich (https://www.delphipraxis.net/208912-mailversand-nur-einmal-moeglich.html)

H.Bothur 28. Sep 2021 09:14

Mailversand nur einmal möglich
 
Moin,

ich habe ein Programm das Mails mit einem per SSL versendet. Komischerweise funktioniert das nur beim ersten Mal, beim zweiten Mal bleibt das Programm beim Connect stecken - ich bekomme aber auch keine Exception.:(

Kann mir jemand sagen was ich da falsch mache ??

Gruss
Hans

Delphi-Quellcode:
function TMailen.SendeMail(MailEmpfaenger: String; const Betreff: String; const Anhang :String) : boolean;
var
  iAttachment : TIdAttachment;
begin
  Form1.EdtStatus.Text := 'Connect';
  Form1.EdtStatus.Refresh;
  (* Connect mit Server *)
  if not Mailen.IdSMTP1.Connected then
  begin
    Mailen.IdSMTP1.AuthType := satDefault;   // simpler Login ohne Authentifizierung
    Mailen.IdSMTP1.Host := MailServer;
    Mailen.IdSMTP1.Port := MailPort;
    Mailen.IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL
    Mailen.IdSMTP1.Username := MailAbsender;   // Benutzername
    Mailen.IdSMTP1.Password := MailPasswort;   // Passwort
    // Verbinden mit Server
    try
        Mailen.IdSMTP1.Connect;
    except
     on E: Exception do
       begin
         result := false;
         Application.MessageBox (PChar(E.Message),'Verbindungsfehler Connect !',MB_OK);
         Mailen.IdSMTP1.Disconnect;
         exit;
       end;
    end;
  end;

  (* Mail erstellen *)
  Form1.EdtStatus.Text := 'Mail erstellen: ' +DateiName;
  Form1.EdtStatus.Refresh;
  Mailen.IdMessage1.ContentType := 'multipart/*';  //  mit Anhang!
  iAttachment := TIdAttachmentFile.Create(Mailen.IdMessage1.MessageParts, Anhang);
  Mailen.IdMessage1.Body.Add(MailBody);  // der eigentliche eMail -Text aus einem TMemo
  Mailen.IdMessage1.Priority := TIdMessagePriority(2);  // Priorität
  Mailen.IdMessage1.Recipients.EMailAddresses := MailEmpfaenger;  // Empfängeradresse
  Mailen.IdMessage1.ReplyTo.EMailAddresses := MailAbsender;  // Anwortadresse
  Mailen.IdMessage1.From.Text := MailAbsender;  // Absenderadresse
  Mailen.IdMessage1.Subject := Betreff;

  Form1.EdtStatus.Text := 'Mail senden: ' +DateiName;
  Form1.EdtStatus.Refresh;
  try
     Mailen.IdSMTP1.Send(Mailen.IdMessage1);

  except
    on E: Exception do
    begin
       result := false;
       Application.MessageBox (PChar(E.Message),'Verbindungsfehler Versand !',MB_OK);
       Mailen.IdSMTP1.Disconnect;
       iAttachment.Free;
       Mailen.IdMessage1.Clear;
       exit;
    end;
  end;
  iAttachment.Free;
  Mailen.IdMessage1.Clear;
  result := true;
  Mailen.Close;
end;

himitsu 28. Sep 2021 09:33

AW: Mailversand nur einmal möglich
 
Mal ganz einfach auf die Idee gekommen vor/nach dem Senden die Connection wieder zu trennen? (immer neuverbinden)

Zitat:

Mailen.IdMessage1.Clear;
Hier kannst du auch nur hoffen, dass wirklich alles nötige bereinigt wird.



Nja, wenn du keine tausenden Mails die Sekunde versendest,
dann gäbe es doch praktisch keine Nachteile alle Mail-Komponenten bei jedem Senden dynamisch zu erstellen und am Ende wieder freizugeben,
und schon kann es auch keine übergreifenden Problemchen geben, zwischen zwei aufrufen.


Und sag bitte nicht, dass "Mailen" die globale Variable für TMailen ist.
Die Methde ist schon in dieser Klasse, also verwendet man hier niemals die globale Variable .... wenn nötig, dann darf man Self benutzen.


Und was die Fehlerbehandlung angeht:
Wieso kommt immer wieder wer auf die dämliche unpraktische Idee mit ShowMessage den Programmfluß zu unterbrechen?
* entweder richtig mit Exceptions arbeiten (dann braucht die Funktion auch keinen Result)
* oder einen Result Record oder z.B. ein LastErrorText-Property in TMailen, was ma bei Result=False extern ausgewertet werden kann
* und schon lässt sich diese Funkton/Prozedur auch gefahrlos automatisiert nutzen (Fehlerbehandlung da, wo aufgerufen wurde, z.B. schön mit try-except und ohne einen Deadlock zu befürchten)

H.Bothur 28. Sep 2021 10:53

AW: Mailversand nur einmal möglich
 
Kurz - weil ich gerade nicht dazu komme:

Danke fürs Feedback und fürs Kopf waschen :-)

Ich kucke mir das nachher mal in Ruhe an !

Hans

H.Bothur 28. Sep 2021 12:00

AW: Mailversand nur einmal möglich
 
Zitat:

Zitat von himitsu (Beitrag 1495487)
Mal ganz einfach auf die Idee gekommen vor/nach dem Senden die Connection wieder zu trennen? (immer neuverbinden)

Ja ... bin ich :-)

Delphi-Quellcode:
  iAttachment.Free;
  Mailen.IdMessage1.Clear;
  Mailen.IdSMTP1.Disconnect;
  Mailen.IdSSLIOHandlerSocketOpenSSL1.InputBuffer.Clear;
Zitat:

Mailen.IdMessage1.Clear;
Hier kannst du auch nur hoffen, dass wirklich alles nötige bereinigt wird.
Wieso, fehlt da noch etwas ??

Zitat:

Nja, wenn du keine tausenden Mails die Sekunde versendest,
dann gäbe es doch praktisch keine Nachteile alle Mail-Komponenten bei jedem Senden dynamisch zu erstellen und am Ende wieder freizugeben, und schon kann es auch keine übergreifenden Problemchen geben, zwischen zwei aufrufen.
OK ... das kann ich versuchen. Ich gebe gerne zu das für mich das verwenden der fertigen Module einfacher ist.

Zitat:

Und sag bitte nicht, dass "Mailen" die globale Variable für TMailen ist.
Die Methde ist schon in dieser Klasse, also verwendet man hier niemals die globale Variable .... wenn nötig, dann darf man Self benutzen.
Doch - sag ich :-) Ich habe es jetzt rausgelöscht und kann das Programm trotzdem kompilieren. Allerdings habe ich es immer wieder mal in Projekten das ich das vorsetzen muss weil es sonst einen Fehler gibt.

Zitat:

Und was die Fehlerbehandlung angeht: ...
Na ja ... natürlich geht es eleganter - aber es funktioniert ja !

Ich habe das jetzt mal geändert, mal sehen ob es jetzt wieder geht. Wenn es immer noch hängt werde ich als nächstes die Module dynamisch erstellen und komplett beenden.

Danke erstmal
Hans


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

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