Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Automatischen E-Mail Versand Sinnvoll und Resourcensparend (https://www.delphipraxis.net/143459-automatischen-e-mail-versand-sinnvoll-und-resourcensparend.html)

Jens Hartmann 16. Nov 2009 21:33


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

jfheins 16. Nov 2009 22:07

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 ;)

Jens Hartmann 17. Nov 2009 06:14

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:
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;
Irgendwie So.. Allerdings müsste ich ja wieder einen zweiten Timer haben, der den ersten dann z.B. wieder startet.

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

jfheins 17. Nov 2009 08:27

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;

Jens Hartmann 24. Nov 2009 16:27

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:
//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;
So jetzt die zwei Probleme...

1. Kann ich nicht
Delphi-Quellcode:
'00:00:00'
als Uhrzeit eingeben.
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

Namenloser 24. Nov 2009 17:02

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare
 
Erstell doch einen Thread:
Delphi-Quellcode:
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;
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.

Jens Hartmann 24. Nov 2009 17:54

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

Jens Hartmann 13. Feb 2010 23:08

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:
  EMailTimerGruppe1Interval := 3600*24;
//müsste eigendlich so sein
EMailTimerGruppe1Interval := 3600000*24;
Da...
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:

Zitat von jfheins
Delphi-Quellcode:
global/private im form/sonstdawas
Timer1Interval: Cardinal;

// Beim setzen:
Timer1Interval := 3600*24 // 24h
Timer1.Interval := millisecondsbetween(now, 22:00)

PS: Sollte keine Kritik sein, sondern lediglich für Nachfolgende Sucher eine Erleichterung.

Gruß Jens

Jens Hartmann 18. Feb 2010 20:10

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:
//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;
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.

Somit kann ich in den Behandlungsroutinen festlegen:
Code:
Nächstes Ereignis um: 22:00:00

Abstand: 12 Std
Funktionieren tut es aufjedenfall. Ob es die beste Lösung ist weiß ich nicht. Aber ich hoffe es ist nicht die schlechteste.

Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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