![]() |
Automatischen E-Mail Versand Sinnvoll und Resourcensparend
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich hab mal wieder eine Frage, in der ich so ein bißchen in Anfangsschwierigkeiten stecke. Ich möchte aus meiner Software automatisch E-Mail´s versenden. Der E-Mail Versand an sich funktioniert schon recht gut. Jetzt ist mein Ziel, über die im Anhang gezeigte Oberfläche den Versand zu Konfigurieren. Leider fehlt mir so der Punkt, wie ich das Problem am besten angehe. Ich möchte verschieden E-Mail Gruppen, die später unten links im INFO Feld zussehen sein sollen erstellen. Diese Gruppen sollen zu den eingestellten Zeiten, Tagen und Intervallen eine automatisch erzeugte E-Mail bekommen. Leider weiß ich noch nicht so richtig wie ich ds Problem angehen soll. Danke schon mal für Eure Hilfe. Gruß Jens |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Wenn sicher gestellt ist, dass diene Anwendung zu dem Zeitpunkt läuft: Nimm nen Timer
Ansonsten kannste dieine Anwendung bei "geplante Tasks" zu einem gegebenen Zeitpunkt starten lassen, iirc ;) |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Ja, das mein Programm läuft ist Vorraussetzung, da ansonsten keine aktuellen Daten vorhanden sind, die gesendet werden könnten.
Das mit dem Timer ist mir auch soweit klar, aber in welchem INtervall lass ich den z.B. nach der Uhrzeit fragen. Ich müsste ja irgendwie so in der Richtung
Delphi-Quellcode:
Irgendwie So.. Allerdings müsste ich ja wieder einen zweiten Timer haben, der den ersten dann z.B. wieder startet.
CREATE
... Timer1.Intervall := 60000; Timer1.Enabled := true; end; Timer... var Zeit := DateTime; begin Zeit := Time(Now); if Zeit > ZEITVORGABE then begin .... Timer1.Enabled := false; end; Oder wenn ich z.B. bei einer Abstand Vorgabe: ALLE 24Std, dann könnte ich ja den Timer Intervall auf 24 Std stellen. Aber wie kann ich dem Timer dann sagen. Nächste E-Mail um: 22:00 Uhr. Da sind so eher meine gedanken Problem. :gruebel: Gruß Jens |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Also wenn du z.B. hast "Alle 24h, nächstes mal um 22:00" dann vll. so:
Delphi-Quellcode:
global/private im form/sonstdawas
Timer1Interval: Cardinal; // Beim setzen: Timer1Interval := 3600*24 // 24h Timer1.Interval := millisecondsbetween(now, 22:00) Timer1OnTimer(sender) begin // E-Mail verschicken Timer1.Interval := Timer1Interval; end; |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Hallo zusammen,
so jetzt habe ich das alles soweit ausprobiert und es funktioniert auch. Ich musste zwar noch ein paar Kleinigkeiten berücksichtigen, aber es funktionoiert. Jetzt habe ich allerdings noch zwei kleine Problem, besser gesagt Gedanken, die mich stutzig machen. Hier erst mal meine fertigen Funktionen.
Delphi-Quellcode:
So jetzt die zwei Probleme...
//Setzen des TimerIntervals, wird im Form1.Create aufgerufen.
procedure TForm1.SetTimerIntervalEMail; var TimeNow : TDateTime; TimeNowStr : String; begin EMailTimerGruppe1Interval := 3600*24; TimeNowStr := TimeToStr(Now); SendEMailTimer1.Interval := Millisecondsbetween(StrToTime(TimeNowStr),StrToTime('00:01:00')); SendEMailTimer1.Enabled := true; end; 1. Kann ich nicht
Delphi-Quellcode:
als Uhrzeit eingeben.
'00:00:00'
2. Was wäre, wenn jetzt jemand nach dem Programmstart manuell oder über Zeitsynchronisation die Uhrzeit des PC umstellt. Würde ja für mich bedeuten, das meine Interval nicht mehr stimmt. :gruebel: MFG Jens |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Erstell doch einen Thread:
Delphi-Quellcode:
Vorsicht: Nur hier im Editor getippt, also keine Garantie auf Fehlerfreiheit (die gibt es aber sowieso nicht :P). Ich denke mal, dass Sleep in in diesem Zeitraum genau genug sein sollte - bleibt nur zu hoffen, dass es keine von Windows festgelegte Obergrenze oder soetwas gibt :gruebel: . Theoretisch sollten aber Intervalle von bis zu ca. 24 Tagen damit möglich sein. Sicherlich geht es mit der WinApi auch irgendwie eleganter. Du könntest dir mal in der CodeLib die Delay-Funktion anschauen.
type
TScheduler = class(TThread) private FOnTimer: TNotifyEvent; FTime: TDateTime; protected procedure DoTimer; procedure Execute; override; public constructor Create(Time: TDateTime; OnTimer: TNotifyEvent); end; constructor TScheduler.Create(Time: TDateTime; OnTimer: TNotifyEvent); begin inherited Create(True); FOnTime := OnTimer; FTime := Time; end; constructor TScheduler.DoTimer; begin FOnTimer(Self); end; constructor TScheduler.Execute; begin Sleep(SecondsBetween(Now, FTime)*1000); Synchronize(DoTimer); end; procedure TMainForm.MyEvent(Sender: TObject); begin ShowMessage('Happy Birthday'); end; procedure TMainForm.Create(...); begin TScheduler.Create( EncodeDateTime(2009, 11, 26, 01, 30, 0, 0), // Mein Geburtstag - die Uhrzeit ist aber geraten :P MyEvent); end; |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Sorry,
das muss ich erstmal in Ruhe durcharbeiten. Ich habe mich bislang noch nie mit Thread´s beschäftigt. Trotzdem erstmal danke. MFG Jens |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Ich bin zur Zeit dabei dieses Aufgabe zu lösen. Ich werde jetzt versuchen das ganz über einen Thread zu lösen. Allerdings mal einen Hinweis zu der Berechnung auf 24 Stunden...
Delphi-Quellcode:
Da...
EMailTimerGruppe1Interval := 3600*24;
//müsste eigendlich so sein EMailTimerGruppe1Interval := 3600000*24;
Code:
1 sek = 1000ms
Timer.Interval := 1000 1 Min = 1000ms * 60 Sek Timer.Interval := 60000 1 Std = 1000ms * 60 Sek * 60 Min Timer.Interval := 3600000 Zitat:
Gruß Jens |
Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
Ich habe jetzt die Lösung fertig und komplett. Ich musste allerdings aus verschiedenen Gründen noch einige Änderungen vornehmen. Hier mal der Code mit Erklärung...
Delphi-Quellcode:
Durch die zwei verschiedenen Funktion für das setzten des Timer.Interval, kann realisiert werden, das der Timer nach dem Programmstart um eine bestimmte Uhrzeit ein Ereignis ausführt und anschließend in einen Inteval Modus wechselt.
//Programmstart
procedure TForm1.FormCreate(Sender: TObject); var ... begin ... SetTimer1IntervalEMailStart;//Aufruf in Form.Create oder ähnlichem end; //Funktion setzt den Timer.Interval nach dem Programmstart je nach Abhängigkeit der Tageszeit function TForm1.SetTimer1IntervalEMailStart : Boolean; var TimeNow : String; TimeSend : String; const HalfDay = 43200000;//1000ms * 60 Sek * 60 Min * 12 Std begin SendEMailTimer1.Enabled := false; TimeNow := TimeToStr(Now);//Aktuelle Zeit TimeSend := '20:05:00';//Nächste Startzeit if TimeSend > TimeNow then //Prüfung ob Sendezeit für aktuellen Tag schon vorbei begin //Zeitpunkt für nächsten Step festlegen SendEMailTimer1.Interval := MilliSecondsBetween(frac(StrToTime(TimeNow)), frac(StrToTime(TimeSend))); end else begin //Zeitpunkt festlegen wenn Step für aktuellen Tag vorbei SendEMailTimer1.Interval := HalfDay - MilliSecondsBetween(frac(StrToTime(TimeNow)), frac(StrToTime(TimeSend)))+ HalfDay; end; SendEMailTimer1.Enabled := true; end; //Funktion setzt den Timer.Interval nach erstem TimerOn auf den Tages Step function TForm1.SetTimer1IntervalEMailTimer : Boolean; var TimeStep : 1..24;//Abstand in Stunden const Hour = 60000;//1 Stunde in ms begin SendEMailTimer1.Enabled := false; TimeStep := 1;//TimeStep zuweisen z.B. aus Datenbank SendEMailTimer1.Interval := TimeStep * Hour;//Interval Berechnen SendEMailTimer1.Tag := 1;//Tag setzen, damit Funktion nur 1 mal ausgeführt wird SendEMailTimer1.Enabled := true; end; //Timer Ereignis procedure TForm1.SendEMailTimer1Timer(Sender: TObject); begin ServiceMemo.Lines.Add(TimeToStr(Time));//Funktion die durch den Timer ausgeführt wird ... if SendEMailTimer1.Tag <> 1 then //Abfrage ob Tag ungleich 1 SetTimer1IntervalEMailTimer; //Wenn Tag ungleich 1, dann einmal den Interval neu setzen. end; Somit kann ich in den Behandlungsroutinen festlegen:
Code:
Funktionieren tut es aufjedenfall. Ob es die beste Lösung ist weiß ich nicht. Aber ich hoffe es ist nicht die schlechteste.
Nächstes Ereignis um: 22:00:00
Abstand: 12 Std Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 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