AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Automatischen E-Mail Versand Sinnvoll und Resourcensparend
Thema durchsuchen
Ansicht
Themen-Optionen

Automatischen E-Mail Versand Sinnvoll und Resourcensparend

Ein Thema von Jens Hartmann · begonnen am 16. Nov 2009 · letzter Beitrag vom 18. Feb 2010
Antwort Antwort
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#1

Automatischen E-Mail Versand Sinnvoll und Resourcensparend

  Alt 16. Nov 2009, 21:33
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
Miniaturansicht angehängter Grafiken
e-mail_200.jpg  
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 16. Nov 2009, 22:07
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 17. Nov 2009, 06:14
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.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 17. Nov 2009, 08:27
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;
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 24. Nov 2009, 16:27
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 '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.

MFG

Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 24. Nov 2009, 17:02
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 ). 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 . 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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 24. Nov 2009, 17:54
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
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 13. Feb 2010, 23:08
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 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
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Automatischen E-Mail Versand Sinnvoll und Resourcenspare

  Alt 18. Feb 2010, 20:10
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  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 18:37 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