coder: massenmails mit php

hallo leute,
ich mach grad ein newsletterscript und da werden ca. 3 000 mails verschickt. da ich aber irgendwie nicht glauben kann, dass php das in einer schleife packt würde ich mal gerne von euch wissen wieviel php denn in einer schleife packt.
ich habe glaube ich hier schonmal gelesen, dass ich das ganze per cc und bcc machen soll, aber dann wird doch der header der mail nachher riesengroß oder was meint ihr?
ich will kein fertiges script, nur ein paar ideen wie ich das bewerkstelligen soll.

mit dank im vorraus, der coder.

  1. hi,

    http://suche.de.selfhtml.org/cgi-bin/such.pl?suchausdruck=php+newsletter+schleife&feld=alle&index_5=on&hits=100

    vielleicht findest du dort ein paar nützliche Informationen.

    mfg archivator ;)

    1. leider nein, abe ich probiere das gerade.
      also ich weiss nicht ob das nur bei 1nd1 so ist aber der verschickt schon seit ca. 8 minuten und ich hab mal zum testen ein kleines script geschrieben, dass er 5 000 mails schicken soll. er ist gerade bei ca. 1 500.
      werden die schleifen also nur abgebrochen wenn es endlosschleifen sind?
      oder ist das tatsächlich nur bei 1und1 so dass die schleifen nicht abgebrochen werden?

      ich trau mich da jetzt nicht eine endlosschleife zu starten um das auszuprobieren, sonst läuft die vielleicht die nächsten 2 jahre ;-)

      1. leider nein, abe ich probiere das gerade.
        also ich weiss nicht ob das nur bei 1nd1 so ist aber der verschickt schon seit ca. 8 minuten und ich hab mal zum testen ein kleines script geschrieben, dass er 5 000 mails schicken soll. er ist gerade bei ca. 1 500.
        werden die schleifen also nur abgebrochen wenn es endlosschleifen sind?
        oder ist das tatsächlich nur bei 1und1 so dass die schleifen nicht abgebrochen werden?

        ich trau mich da jetzt nicht eine endlosschleife zu starten um das auszuprobieren, sonst läuft die vielleicht die nächsten 2 jahre ;-)

        Oh Mann, hast Du wenigstens einen eignen Server?
        Warum spielst Du nicht erst einmal zu Hause an einem Testsystem.
        1und 1 verbietet in Ihren AGB solche Skripte und stellt Dir die Kosten für Serverabschaltung  und Reboot in Rechnung.
        Siehe AGB von 1und1.
        TomIRL

        1. ich trau mich da jetzt nicht eine endlosschleife zu starten um das auszuprobieren, sonst läuft die vielleicht die nächsten 2 jahre ;-)

          Oh Mann, hast Du wenigstens einen eignen Server?
          Warum spielst Du nicht erst einmal zu Hause an einem Testsystem.
          1und 1 verbietet in Ihren AGB solche Skripte und stellt Dir die Kosten für Serverabschaltung  und Reboot in Rechnung.
          Siehe AGB von 1und1.
          TomIRL

          ich habe doch keine endlosschleife gemacht.
          les dir den satz oben nochmal genau durch ;-)

      2. Hello,

        ich trau mich da jetzt nicht eine endlosschleife zu starten um das auszuprobieren, sonst läuft die vielleicht die nächsten 2 jahre ;-)

        Dagegebn kannst Du doch etwas tun. Bau doch in Deine Schleife eigene Überwachungsmechanismen ein. Und wenn es Dir zu bunt wird (bzw. dem Script), dann  setzt es noch eine letzte Kontrollmail an Dich ab, macht eine LOG-Eintrag in einer Log-Datei und beendet sich selber.

        Setzt natürlich voraus, dass man sauber gecodet hat.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  2. Hallo!

    Ich hab schon gut 1000 Mails in einer PHP-Schleife verschickt.. kein Problem...:

    du solltest einfach set_time_limit(0); nicht vergessen...

    mfg
    Michael

    hallo leute,
    ich mach grad ein newsletterscript und da werden ca. 3 000 mails verschickt. da ich aber irgendwie nicht glauben kann, dass php das in einer schleife packt würde ich mal gerne von euch wissen wieviel php denn in einer schleife packt.
    ich habe glaube ich hier schonmal gelesen, dass ich das ganze per cc und bcc machen soll, aber dann wird doch der header der mail nachher riesengroß oder was meint ihr?
    ich will kein fertiges script, nur ein paar ideen wie ich das bewerkstelligen soll.

    mit dank im vorraus, der coder.

    1. Hallo!

      Ich hab schon gut 1000 Mails in einer PHP-Schleife verschickt.. kein Problem...:

      du solltest einfach set_time_limit(0); nicht vergessen...

      Das ist der bescheidenste Hinweis den man geben kann.
      Man sollte set_time-limit eben genau nicht anfassen.
      die Serverlast ist nicht zu verachten die ein solches Skript verursacht.

      Coder:
      Du soltest erstens die Option bcc genau prüfen, weil so die Arbeit der Mailserver übernimmt.
      Desweiteren würde ich mir überlegen das Skript sich selbst aufrufen zu lassen.

      TomIRL

      1. Man sollte set_time-limit eben genau nicht anfassen.
        die Serverlast ist nicht zu verachten die ein solches Skript verursacht.

        Weshalb nicht? Dieses Limit is meines Erachtens nur sinnvoll bei Scripts die in eine Endlosschlaufe ausarten können oder sonst nicht mehr abbrechen.. aber wenn das Script eine genau definierte Funktion ausführt und dann beendet wird ist das ja wohl kein Problem...!

        Habs auf einem 200mhz rechner mit 48MB ram laufen lassen.. also sollte das wohl jeder Rechner schaffen...
        Lieber mal probieren als gleich sagen es geht nicht...!

        Manchmal ist die einfachste Lösung auch die beste...

        1. Man sollte set_time-limit eben genau nicht anfassen.
          die Serverlast ist nicht zu verachten die ein solches Skript verursacht.
          Weshalb nicht? Dieses Limit is meines Erachtens nur sinnvoll bei Scripts die in eine Endlosschlaufe ausarten können oder sonst nicht mehr abbrechen.. aber wenn das Script eine genau definierte Funktion ausführt und dann beendet wird ist das ja wohl kein Problem...!

          Habs auf einem 200mhz rechner mit 48MB ram laufen lassen.. also sollte das wohl jeder Rechner schaffen...

          Die meisten Leute hier haben keinen eigenen Server.
          Danke für Deine Belehrungen, aber wer sauber codet belastet den Server nicht mit zu großen Anwendungen, sondern überläst solche Arbeiten Anwendungen die explizit dafür gemacht wurden.
          Hast Du Dir mal überlegt welche Auswirkungen set_time_limit auf die Prozessorlast bei einigen Tausend Mails hat?
          Ich hab schon Newsletterskripte geschrieben die mehr als 30 000 Empfänger hatten.
          Was glaubst Du eigentlich was passiert wenn Du mal einen Kundenserver mit solchen Anwendungen abschiesst, weil die Rechenleistung nicht ausreicht?

          Aussserem ist die Hardware relativ unwichtig, wichtig ist der Speicherverbrauch der einzelnen Prozesse.
          Und was passiert in diser Schleife eigentlich wenn es zu einem Fehler kommt?
          Sind da dann wenigstens Abbbruchbedingungen definiert?
          Er hat Ihr eine Frage gestellt ohen auch nur einen Fetzen Quellcode, und dann ist es besser einfach den Tip mit Set_time _limit für sich zu behalten, weil Du die Konsequenzen nicht überblicken kannst.

          TomIRL

          1. Hello,

            Und was passiert in diser Schleife eigentlich wenn es zu einem Fehler kommt?
            Sind da dann wenigstens Abbbruchbedingungen definiert?
            Er hat Ihr eine Frage gestellt ohen auch nur einen Fetzen Quellcode, und dann ist es besser einfach den Tip mit Set_time _limit für sich zu behalten, weil Du die Konsequenzen nicht überblicken kannst.

            Dann wäre es besser, darauf hinzuweisen, wie gefährlich die totale Abschaltung von set_time_limit ist, und nicht, den Tipp für sich zu behalten. Jedenfalls sollte man keine Scripte dieser Art auf Gemeinschaftsservern loslassen, die nicht auf Herz und Nieren geprüft sind.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
          2. Die meisten Leute hier haben keinen eigenen Server.
            Danke für Deine Belehrungen, aber wer sauber codet belastet den Server nicht mit zu großen Anwendungen, sondern überläst solche Arbeiten Anwendungen die explizit dafür gemacht wurden.

            Gerade wenn jemand keinen eigenen Server hat kann er vielleicht solche Programme / Scripts nicht installieren...

            Hast Du Dir mal überlegt welche Auswirkungen set_time_limit auf die Prozessorlast bei einigen Tausend Mails hat?

            => Zitat: ich mach grad ein newsletterscript und da werden ca. 3 000 mails verschickt.
            Im Übrigen verschickst die Mails hintereinander - der Speicherverbrauch wird überhaupt nicht gross...

            Ich hab schon Newsletterskripte geschrieben die mehr als 30 000 Empfänger hatten.

            Super - aber davon war hier nie die Rede...

            Was glaubst Du eigentlich was passiert wenn Du mal einen Kundenserver mit solchen Anwendungen abschiesst, weil die Rechenleistung nicht ausreicht?

            Hei.. probiers mal aus bevor du hier gross von Speicher & Rechenleistung sprichst..

            Aussserem ist die Hardware relativ unwichtig, wichtig ist der Speicherverbrauch der einzelnen Prozesse.

            Hallo??? Es ist ja wohl nur die Frage ob die Hardware dem Speicherverbrauch gemessen ist.. und das waren meine 48MB - so gross ist der Verbrach also nicht..

            Und was passiert in diser Schleife eigentlich wenn es zu einem Fehler kommt?

            Mein Gott - du hast sorgen... Fehler in DB schreiben oder ausgeben.. dann ignorieren und mit dem nächsten Mail fortfahren! Wenn es gröbere Fehler gibt wird das Script ja sowieso abgebrochen..

            Er hat Ihr eine Frage gestellt ohen auch nur einen Fetzen Quellcode, und dann ist es besser einfach den Tip mit Set_time _limit für sich zu behalten, weil Du die Konsequenzen nicht überblicken kannst.

            Er hat was vonn 3000 Mails gesagt.. da war eine simple Antwort für eine simple Lösung meiner Meinung nach genau das Richtige...

            Nichts für ungut.. aber nur weil du scho "krasseres" programmiert hast muss eine simple Lösung nicht gleich Horror sein...

            Gruss Michael

    2. Hello,

      du solltest einfach set_time_limit(0); nicht vergessen...

      Dann sollte man sich aber eine Job-Control aufbauen.
      Man holt sich mittels getmypid() http://de.php.net/manual/de/function.getmypid.php holt man sich die ID des angestoßenen Prozesses und mwrk sie sich in einer DB oder anderem Permanentspeicher.
      Mit ignore_user_abort() http://de.php.net/manual/de/function.ignore-user-abort.php wird dafür gesorgt, dass der Prozess auch nach einem Client-Ausstieg beendet wird. (da war doch mals was: Es gibt immer Leute die behaupten, dass HTTP verbindungslos ist... Was nützt das aber, wenn die Verbinung in anderern Protokollschichten wieder hinzugefügt wird...)

      Allerdings muss man beachten: Wenn PHP als Server-Modul läuft, ist es nicht garantiert, dass Scripts unter verschiedenen PIDs laufen.
      Bei "meinen" Servern hat das aber noch nie Probleme bereitet.

      Wenn die Prozesse sich nun plötzlich stapeln, kann man so zumindest feststellen, ob es sich um unbeendete "Spammailer" handelt.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  3. Hallo Coder,

    ich mach grad ein newsletterscript und da werden ca. 3 000 mails verschickt. da ich aber irgendwie nicht glauben kann, dass php das in einer schleife packt würde ich mal gerne von euch wissen wieviel php denn in einer schleife packt.

    Besser, du laesst so was von einem Script erledigen, das zu betiebsarmen Server-Zeiten (spaete Nacht bis frueher Morgen normalerweise) diesen Job ausfuehrt. So ein Script sollte auch nicht vom Web-Browser aufgerufen werden und keine HTML-Ausgaben an Web-Browser machen, sondern am besten als von der Shell ausgefuehrtes Script seine Ergebnisse in eine Log-Datei schreiben. Die Zeitpunkte zum Ausfuehren des Scripts koennen in der cron-Tabelle des Servers festgelegt werden. PHP ist vielleicht nicht gerade optimiert fuer diese Art von Scripts, aber wenn du dich an andere Sprachen nicht ran traust, geht es zur Not sicherlich auch damit - eine wichtige Lektuere zu diesem Thema ist auch http://de.php.net/manual/de/features.commandline.php.

    ich habe glaube ich hier schonmal gelesen, dass ich das ganze per cc und bcc machen soll, aber dann wird doch der header der mail nachher riesengroß oder was meint ihr?

    Bei cc sehen die Empfaenger die anderen Empfaenger, bei bcc nicht. Zumindest das solltest du dabei bedenken. Bei 3000 Mails ist es dringend zu empfehlen, das Ganze in Portionen von ca. 20 bis 50 Empfaenger pro Mail aufzusplitten - ich weiss allerdings nicht, wie viel to-, cc- und bcc-Daten typische SMTP-Server pro Mail zulassen, oder ob es da empfohlene Grenzen gibt.

    Ausserdem ist es moeglicherweise besser, im Script eine direkte Socket-Verbindung zum Mailserver aufzubauen und die Protokollkommuniktation mit dem Mailserver selber im Script abzuwickeln, als auf die Mail-Funktion von PHP zu vertrauen. Die direkte Serverkommunikation erlaubt auf jeden Fall mehr Kontrolle und das Abbrechen der Versandschleife oder das Ueberspringen eines Schleifendurchlaufs bei Problemen mit dem Mailversand.

    Ein interessantes Dokument zu dem Thema ist auch http://www.php-center.de/faq/faq-mail.html

    viele Gruesse
      Stefan Muenz

  4. habe gerade nochmal mit dem servicemenschen vom premiumsupport telefoniert, der sagte, als prozess gilt z.b. 1 mail versenden.
    somit sei es auch kein problem dass ich in einer schleife tausende mails versende.
    er erkundigt sich aber nochmal genau. bin mal gespannt ob das so auch wirklich stimmt...