Phil Z.: Newsletter häppchenweise verschicken

Hallo.

Ich mache gerade einen Newsletter.

Am Anfang werden nur um die 100 dort angemeldet sein, später aber um die 2000. Wie verschicke ich die am besten? 2000 Stück gleichezitig ist ja ziemlich unpraktisch.

Die e-mail adressen sind alle in eienr MySQL DB gespeichert.
Bisher bin ich soweit das alle gleichzeitig verschickt werden. Aber ich denke es ist sinnvoller das ganze in 50er Packen zu verschicken. Oder was meitn ihr?
Wie stelle ich das am besten an?

Am liebsten wäre mir wenn alles bei PHP, MySQL bleibt. Falls das nicht möglich ist damit -> JavaScript. Falls es damit auch nicht geht hab ich ein Problem^^. Aber ich bin sicher da lässt sich was finden.

mfg

Phil Z.

  1. Hi!

    Wie stelle ich das am besten an?

    Kommt darauf an, was alles möglich ist?
    Kannst du Cronjobs einrichten?
    Nur 50 Stück zu versenden und zu speichern, welche versendet wurden sollte ja nicht so schwer sein - das Script müsste halt nur erneut aufgerufen werden um weitere 50 versenden zu können.
    Notfalls lässt sich so ein Cronjob ja auch mit einem Service wie cron-job.org simulieren.
    Beantwortet das in etwa die Frage?

    Grüße aus Nürnberg,
    Tobias

    1. Hi.

      Also Cronjob ist nicht verfügbar.
      Gespeichert muss die verschickte Nachricht nicht werden.
      Kriegen 2000 Leute die gleiche Mail geschickt.

      Kann ich nicht irgendiwe 50 verschicken dann 1 min. sleep oder sowas und dann die nächsten. u.s.w....

      mfg

      Phil Z.

      1. Hi!

        Also Cronjob ist nicht verfügbar.

        Gespeichert muss die verschickte Nachricht nicht werden.
        Kriegen 2000 Leute die gleiche Mail geschickt.

        Kann ich nicht irgendiwe 50 verschicken dann 1 min. sleep oder sowas und dann die nächsten. u.s.w....

        Du möchtest also einen Newsletter im Browser schreiben und auf absenden klicken und dann soll der an alle in einer Datenbank gespeicherten Adressen gesendet werden?

        Das würde ich so machen:
        1.) Die Emailaddressen in eine Datenbank-Tabelle (A) speichern in der mindestens die Zeilen Emailadresse und letzter Newsletter vorhanden sind.
        2.) Das PHP-Script, das deinen Newsletter annimmt speichert in in eine Datenbank-Tabelle (B) und füllt dabei noch ein Feld für eine ID aus - z.B. könnten das die aktuell vergangenen Sekunden seit Beginn der Unix-Zeit sein.
        3.) Durch einen Service wie z.B. cron-job.org alle 5 Minuten ein PHP-Script aufrufen lassen, welches überprüft ob es Emailadressen in Tabelle A gibt, die in der Spalte für den zuletzt zugesendeten Newsletter noch nicht die besagte ID aus der Tabelle B stehen haben. Falls ja mittels einer Schleife an die ersten 50 eine Email versenden und jeweils die neue ID speichern.

        Das könnte natürlich Probleme geben, wenn zwei Newsletter nicht mit genügend Abstand gesendet werden - notfalls könnte ja z.B. das Script, das deinen Newsletter annimmt wie das Script aus 3.) testen ob noch Newsletter versendet werden müssen und so lange keinen neuen Annehmen. Das ließe sich natürlich alles auch professioneller lösen, aber mir fällt momentan keine simplere Lösung ein und wenn du ein richtig umfangreiches Tool benötigen würdest hättest du ja vermutlich eine der vielen Lösungen genommen, die es bereits gibt, oder?
        Außerdem lässt sich so ein Script ja auch im Nachhinein erweitern.

        Grüße aus Nürnberg,
        Tobias

  2. Hallo Phil,

    Am Anfang werden nur um die 100 dort angemeldet sein, später aber um die 2000. Wie verschicke ich die am besten? 2000 Stück gleichezitig ist ja ziemlich unpraktisch.

    Die e-mail adressen sind alle in eienr MySQL DB gespeichert.
    Bisher bin ich soweit das alle gleichzeitig verschickt werden. Aber ich denke es ist sinnvoller das ganze in 50er Packen zu verschicken. Oder was meitn ihr?
    Wie stelle ich das am besten an?

    Du hast ja, nehme ich an, sowieso eine Schleife, die die ganzen Adressen durchgeht und an jede eine Mail verschickt.
    Am einfachsten wäre folgendes:
    Du baust eine Variable ein, die bei jeder "Runde" um eins erhöht wird.
    Wenn du bei fünfzig angekommen bist, machst du ein sleep() (das muss ja nicht lang sein, eine halbe bis ganze Minute sollte IMHO reichen) und setzt die Variable auf 0.
    Dann musst du das Skript nur einmal aufrufen (per Browser oder Cronjob).

    Am liebsten wäre mir wenn alles bei PHP, MySQL bleibt. Falls das nicht möglich ist damit -> JavaScript. Falls es damit auch nicht geht hab ich ein Problem^^. Aber ich bin sicher da lässt sich was finden.

    Viele Grüße aus Freiburg,
    Marian

    --
    Microsoft broke Volkswagen's world record: Volkswagen made only 22 million bugs!
    <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
    1. Hi!

      Dann musst du das Skript nur einmal aufrufen (per Browser oder Cronjob).

      Wird das Script dann nicht wegen MAX_EXECUTION_TIME abgebrochen?
      Das ginge afaik nur, wenn das Script von der Kommandozeile gestartet würde?

      Grüße aus Nürnberg,
      Tobias

      1. Wird das Script dann nicht wegen MAX_EXECUTION_TIME abgebrochen?
        Das ginge afaik nur, wenn das Script von der Kommandozeile gestartet würde?

        Hoffe mal nicht wiel das nämlich genau das wäre was ich brauche -.-...
        Mehr Meinungen darüber bitte..

        mfg

        Phil Z.

      2. Hallo,

        Wird das Script dann nicht wegen MAX_EXECUTION_TIME abgebrochen?
        Das ginge afaik nur, wenn das Script von der Kommandozeile gestartet würde?

        Das müsste man (sofern safe_mode == off) mit set_time_limit() umgehen können.

        Theoretisch könnte man doch unbegrenzt viele Mails nach folgendem Schema verschicken:

          
          
        $secs = 10;  
          
        for($i = 1; $i <= $anzahl_newsletter_sendevorgaenge; $i++)  
        {  
         // hole einen Stapel Email Adressen  
          
         // versende Newsletter  
          
         // weitere (in diesem Fall) 10 Sekunden für die nächste Runde verschaffen  
         set_time_limit($secs);  
          
        }  
        
        

        Gibt das in der Praxis irgendwelche Probleme? Könnte das den Server in irgendeiner Weise überlasten (vorausgesetzt, er ist prinzipiell nicht besonders stark ausgelastet)

        1. Hi!

          Das müsste man (sofern safe_mode == off) mit set_time_limit() umgehen können.

          Stimmt natürlich - ich habe den Fehlschluss begangen, dass ich von kein Cronjob auf ISP mit stark eingeschränkten Möglichkeiten geschlossen habe.

          Wenn die Emails ganz normal mit der PHP mail() Funktion versendet werden werden diese ja eigentlich nur an den Mailspooler des Servers weitergegeben - und der kann die ja dann so schnell verschicken wie er möchte.
          Es würde mich also wundern, wenn der Server dadurch überlastst würde - allerdings habe ich das selbst nicht ausprobiert - vielleicht kann ja jemand aus Erfahrung etwas genaueres berichten.

          $secs = 10;
          set_time_limit($secs);

          Wieso dann nicht gleich set_time_limit(0); ?

          Grüße aus Nürnberg,
          Tobias

    2. Hallo,

      Wenn du bei fünfzig angekommen bist, machst du ein sleep() (das muss ja nicht lang sein, eine halbe bis ganze Minute sollte IMHO reichen) und setzt die Variable auf 0.

      Wieso sleep()? (Die Frage ist ernst gemeint, gibt es dafür einen Grund, den ich vielleicht nicht kenne?)

      IMHO erreicht man dadurch nur noch schneller die max. execution time, macht also genau das Gegenteil von dem, was man eigentlich möchte. Wäre nicht set_time_limit() passender?

      Gruß,
      Günther

      1. Hallo Günther,

        Wieso sleep()? (Die Frage ist ernst gemeint, gibt es dafür einen Grund, den ich vielleicht nicht kenne?)

        Es bietet sich doch an, das Skript ein wenig pausieren zu lassen, um den Mailserver nicht zu überlasten.

        IMHO erreicht man dadurch nur noch schneller die max. execution time, macht also genau das Gegenteil von dem, was man eigentlich möchte.

        Nein.

        Wäre nicht set_time_limit() passender?

        Somit auch nicht :-)

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          gehe ich recht in der Annahme, dass mail() zu denjenigen Funktionen gehört, die 'outside the execution of the script' stattfinden und somit theoretisch beliebig oft innerhalb eines Skriptaufrufs ausgeführt werden kann, ohne dass man einen Timeout Error bekommt (mal abgesehen von der Zeit, die benötigt wird, um die Emails für den Versand vorzubereiten)?

          Gruß,
          Günther

  3. Hi.

    Also geht es nicht irgendiwe folgendermaßen?

    Ich lese die Adressen alle in ein Array ein.

    Dann lese ich aus wie viele es sind.

    Dann per for - Schleife von 1-50 verschicken.
    sleep(30) <- also für 30 Sekunden ruhen lassen.
    Danach 50-100 u.s.w.

    wäre das möglich?

    mfg

    Phil Z.

    PS: ja sie werden per mail() verschickt!

    1. Hallo Phil,

      Hi.

      Also geht es nicht irgendiwe folgendermaßen?

      Ich lese die Adressen alle in ein Array ein.

      Dann lese ich aus wie viele es sind.

      Dann per for - Schleife von 1-50 verschicken.
      sleep(30) <- also für 30 Sekunden ruhen lassen.
      Danach 50-100 u.s.w.

      Du solltest _alle_ Daten auf ein Mal aus der Datenbank rausholen. Wenn sich zwischendrin was ändert (jemand kommt dazu, jemand will nicht mehr), bekommt einer zwei bzw. keine Mail(s). Aber an sich sollte das mit dem sleep gehen.

      for(alle adressen)
        verschicken
        zähler++
        wenn zähler > 50 dann sleep() und zähler=0

      Viele Grüße aus Freiburg,
      Marian

      --
      Microsoft broke Volkswagen's world record: Volkswagen made only 22 million bugs!
      <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->
    2. Also ich hätte da folgenden Vorschlag ....

      <?
      if($HTTP_GET_VARS["akt"])$akt = $HTTP_GET_VARS["akt"];
      else $akt = 0;

      $anzahl = ... // Die Anzahl der zu verschickenden Mails

      $ende = $akt + 50;
      if($ende > $anzahl)$ende = $anzahl;

      for( $i = $akt; $i++; $i < $ende )
        {
          mail() ...
          $akt++;
        }

      if($akt != $ende)
      {
          // Hier code zum ernueuten Aufruf der Website ... z.B. mit Übergabe einer Variablen die festhält, bei welcher Mail fortgesetzt werden muss ... hier ein beispiel von mir:
      ?>
      <script>
      wait = window.setInterval("neuaufruf()", 30000); // 30 Sekunden warten und dann neuladen

      function neuaufruf() {

      window.clearInterval(wait);
         window.location.href="dieseseite.php?akt=<? echo $akt ?>";
      }
      </script>
      <?
      }
      else
      {
         echo "fertig";
      }
      ?>

      Dies ist nur ein Ansatz ... damit du weißt wie du das problem angehen kannst.

      MfG
      Kkokus

      1. Hallo kkokus,

        Also ich hätte da folgenden Vorschlag ....

        Wozu brauchst du denn jetzt plötzlich auch noch JavaScript - wo doch gerade nicht zu knapp über verschiedene Warte-Funktionen PHPs diskutiert wurde!?

        Dies ist nur ein Ansatz ... damit du weißt wie du das problem angehen kannst.

        Die Idee hinter SELFHTML ist eigentlich, den Leuten zu zeigen, wie sie ihr Problem selber lösen können.

        Viele Grüße aus Freiburg,
        Marian

        --
        Microsoft broke Volkswagen's world record: Volkswagen made only 22 million bugs!
        <!--[if IE]><meta http-equiv="refresh" content="0; URL=http://www.getfirefox.com"><[endif]-->