AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Mailversand nur einmal möglich
Thema durchsuchen
Ansicht
Themen-Optionen

Mailversand nur einmal möglich

Ein Thema von H.Bothur · begonnen am 28. Sep 2021 · letzter Beitrag vom 28. Sep 2021
Antwort Antwort
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#1

Mailversand nur einmal möglich

  Alt 28. Sep 2021, 09:14
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;
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: Mailversand nur einmal möglich

  Alt 28. Sep 2021, 09:33
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Sep 2021 um 09:41 Uhr)
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Mailversand nur einmal möglich

  Alt 28. Sep 2021, 10:53
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
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Mailversand nur einmal möglich

  Alt 28. Sep 2021, 12:00
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
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:43 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