Thomas: mail() an mehr als 500 empfänger

Hallo,

ich versuche mit einer schleife einen Newsletter mit der mail() Funktion von PHP an mehr als 500 Empfänger zu schicken.

Mein Problem ist, das der Server nach ca. 40 Sek. ein Timeout meldet. Für den mail-versand an 500 Adresse braucht es aber etwas mehr zeit! Wie schaffe ich es also mit mail() alle 500 zu versenden?

  1. Hallo!

    Mail an mehr als 500 Empfänger zu schicken

    Sorry, aber ich helfe keine Spammern! Und wenn du so ein Newsletter machen willst - vergiss es einfach, das nervt sowieso.
    Nein!, mach es nicht.

    MfG, Dennis.

    --
    Auf Signaturen hab ich keinen Bock!!
    1. Was soll den der Scheiß? Es geht hier um eine Newsletterprogramm welches in einem CMS als Zusatzmodul implementiert werden soll!

    2. Hello,

      Mail an mehr als 500 Empfänger zu schicken
      Sorry, aber ich helfe keine Spammern!

      Vorsicht Feierabend: da sind wieder die "Lehrer" unterwegs.

      Du musst einfach das Ergebnis von Mail() abfragen und wenn es false gewesen sein sollte ggf. zählen. Danach schreibst Du sleep(1) und schon gilt die Timeout-Einstellung nicht mehr. Sie fängt von vorne an zu zählen.

      Das nennt sich dann "positive bug usement"

      Grüße

      Tom

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Noch mal für die Dummen!? Nachdem Timeout also passiert ist muß ich sleep(1) (eine Funktion?) setzen und das script arbeitet einfach weiter?

        1. Hello,

          Noch mal für die Dummen!? Nachdem Timeout also passiert ist muß ich sleep(1) (eine Funktion?) setzen und das script arbeitet einfach weiter?

          Nee, dann ist es ja schon zu spät, eben Time Out!

          Du hast eine Mailschleife...
          Du fragst brav das Ergebnis von Mail() ab.
          Wenn ein Fehler auftritt (also false) dann sagst Du sleep(1) und wiederholst die letzte Mail()-Anweisung

          Man kann auch gleich das Script in die eigene Kontrolle übernehmen und nach JEDEM mail() ein usleep(1) geben. Dann fängt die Rechenzeitzählun g von vorne an zu zählen. Oder man setze für das Script mit set_time_limit() http://de2.php.net/manual/de/function.set-time-limit.php von vorneherein eine horrende Zeit. Das würde ich aber ablehnen. Du solltest schon schauen, wieviele Versuche jede Adresse bekommen hat und eine Fehlerbehandlung vorsehen.

          Außerdem ist ein mail() mit gleichem Inhalt besser mit einem Header, der BCC vorsieht, da dann der Mailserver die Verwaltung übernimmt.

          Im Sinne des individuellen Response-Managements sollte man aber jede mail diskret genereieren, ihr eine eigene Response-Adresse zuweisen oder zumindest eine eigene Mail-ID. Sonst bekommt man ja die Irrläufer nie raus.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      2. Moin!

        Du musst einfach das Ergebnis von Mail() abfragen und wenn es false gewesen sein sollte ggf. zählen.

        Was mag das bringen?

        Wenn mail() false zurückgibt, dürfte irgendetwas ziemlich schlimmes passiert sein. Sowas wie "es gibt keinen lokalen SMTP-Server, der die Mail entgegengenommen hat" oder "der lokale SMTP-Server hat mit irgendeinem der Funktionsargumente ein Problem, möglicherweise mit der Empfängeradresse".

        Ansonsten gibt mail() mit funktionierenden Adressen immer brav true zurück - die eigentliche Auslieferung der Mails übernimmt dann der lokale SMTP-Server (zumindest unter Unix - davon gehe ich aber als Szenario mal aus). Und der wird sich ggf. per Mail beim Postmaster (oder wer sonst dafür zuständig ist) melden, wenn Mails dauerhaft unzustellbar sind (Postfach voll, User nicht existent, sonstige SMTP-Fehlermeldung), und ansonsten eine gewisse Zeit lang die Zustellung versuchen (Connection Timeout, "Try again later",...), bis auch diese Zeit abgelaufen und der Versand somit als endgültig fehlgeschlagen bewertet wird (typische Zeit dafür: 5 Tage).

        Danach schreibst Du sleep(1) und schon gilt die Timeout-Einstellung nicht mehr. Sie fängt von vorne an zu zählen.

        Wenn 480 Mails ohne Probleme durchgehen, und dann die Max-Execution-Time aufgebraucht ist, würde das nicht viel bringen.

        - Sven Rautenberg

        --
        "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
        1. Hello,

          [...]
          Danke für die ausfühlichen Erläuterungen. War irgendwie zu müde dazu...

          Danach schreibst Du sleep(1) und schon gilt die Timeout-Einstellung nicht mehr. Sie fängt von vorne an zu zählen.

          Wenn 480 Mails ohne Probleme durchgehen, und dann die Max-Execution-Time aufgebraucht ist, würde das nicht viel bringen.

          MaxExecutionTime fängt bei allen mir bekannten PHP-Versionen nch einem Sleep() von vorne an zu zählen. Ich habe ein "user_abort-script" auf diese Weise schon 10 Tage laufen lassen. Das hätte auch bei jedem Schleifendurchlauf (1s) locker eine Mail auslösen können. Ich habe aber nur eine Datei auslesen lassen und die einzige Zeile darin an den Client gesendet sowie in eine Logdatei (fopen a+; fclose;) eine Logzeile schreiben lassen. Dateioperationen kosten erfahrungsgemäß viel Rechenzeit, Schreiboperationen etwa fünf mal soviel, wie Leseoperationen.

          Das hat MaxExevutionTime alles nicht gejuckt.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. Moin!

            Wenn 480 Mails ohne Probleme durchgehen, und dann die Max-Execution-Time aufgebraucht ist, würde das nicht viel bringen.

            MaxExecutionTime fängt bei allen mir bekannten PHP-Versionen nch einem Sleep() von vorne an zu zählen. Ich habe ein "user_abort-script" auf diese Weise schon 10 Tage laufen lassen.

            Das bestreite ich nicht.

            Was ich bestreite: Wenn mail() es schafft, innerhalb einer max-execution-time angenommenene 480 Mails sauber und ohne false-Rückgabe zu versenden und dann ins Timeout läuft, bringt es wenig, ein sleep(1) auszuführen, sobald mail() ein false zurückgibt - weil dieser Fall ja gar nicht eintritt und auch nie eintreten soll, weil er deutlich anzeigt, dass mit dem Mailversand irgendwas nicht klappt - und zwar grundsätzlich nicht!

            Wenn also längere Laufzeiten benötigt werden, dann muß man dafür sorgen, dass sleep() regelmäßig ausgeführt wird, und nicht nur bei einem nach Definition möglichst gar nicht eintretenden Event.

            - Sven Rautenberg

            --
            "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
            1. Hello,

              MaxExecutionTime fängt bei allen mir bekannten PHP-Versionen nch einem Sleep() von vorne an zu zählen. Ich habe ein "user_abort-script" auf diese Weise schon 10 Tage laufen lassen.

              Das bestreite ich nicht.

              Was ich bestreite: Wenn mail() es schafft, innerhalb einer max-execution-time angenommenene 480 Mails sauber und ohne false-Rückgabe zu versenden und dann ins Timeout läuft, bringt es wenig, ein sleep(1) auszuführen, sobald mail() ein false zurückgibt - weil dieser Fall ja gar nicht eintritt und auch nie eintreten soll, weil er deutlich anzeigt, dass mit dem Mailversand irgendwas nicht klappt - und zwar grundsätzlich nicht!

              Wenn also längere Laufzeiten benötigt werden, dann muß man dafür sorgen, dass sleep() regelmäßig ausgeführt wird, und nicht nur bei einem nach Definition möglichst gar nicht eintretenden Event.

              Ja, da hast Du recht.
              Man muss sleep() in jedem Schleifendurchlauf ausführen und ggf. dann etwas unternehmen, wenn mail() dauerhaft false liefert. Ich habe es wohl genau falsch herum beschrieben. Das false von mail() aber zu ignorieren, würde den Mailserver irgendwann killen, sofern der überhaupt erreicht wird.

              Außerdem sollte das Script auch selber auf seine Ausführungszeit achten, also sich den Start merken und die aktuelle Laufzeit prüfen. Und wenn es dann noch mit einer Registrierfunktion (pid) versehen wird und eine register_shutown_function() für das "Deregistitrieren" bekommt, weiß man auch, ob es noch läuft oder fertig ist.

              http://de2.php.net/manual/de/function.getmypid.php
              http://de2.php.net/manual/de/function.register-shutdown-function.php
              http://de2.php.net/manual/de/function.ignore-user-abort.php

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              1. Moin!

                Man muss sleep() in jedem Schleifendurchlauf ausführen und ggf. dann etwas unternehmen, wenn mail() dauerhaft false liefert. Ich habe es wohl genau falsch herum beschrieben. Das false von mail() aber zu ignorieren, würde den Mailserver irgendwann killen, sofern der überhaupt erreicht wird.

                Das würde ich mal verneinen wollen. Entweder funktioniert der lokale Mailserver und läßt sich mit mail() ansprechen, oder er funktioniert nicht. Wenn er nicht funktioniert, dann killt ihn nichts, weil er dann schon tot ist (bzw. noch nie lebte). Alternativ mäkelt er auch an den übergebenen Parametern herum, weist sie also im Vollbesitz seiner Kräfte zurück. Da killt nichts.

                Was ihn viel eher killen kann, sind die Massen an Mails, die da plötzlich rausgeschickt werden - obwohl ein guter Mailserver selbst damit keine Probleme kriegen darf, allenfalls bei einer etwas langsamen Internetanbindung lediglich etwas länger benötigen kann.

                - Sven Rautenberg

                --
                "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
    3. Hallo,

      warum Spammer?
      500 Mails wären für einen Spammer echt etwas wenig.
      Also ich habe einen Newsletter für eine Fanseite (d2) und dort sind im Newsletter 360 Leute. Diese haben sich alle Freiwillig eingetragen und können sich jeder Zeit wieder austragen.

      Würde ich die Seite weiterentwickeln, würde ich auch bald auf 500 Mailempfänger kommen.

      MFG
      Andavos

      --
      http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
  2. Hallo,

    mach es so:
    Du kennst du bestimmt die Blätterfunktion von Gästebüchern, oder?
    Denke das System etwas weiter.

    Du klickst auf "E-Mails senden":
    Du gelangst auf Seite ein, dort werden dann xxx Mails gesendet (ich habe 100 genommen, evt. 250 nehm). Dann ist da ein Link für Seite 2: dort werden die nächsten xxx Mails gesendet (also 100 - 200). Dann kommt noch Seite 3 und Seite 4 (400 - 500). Dann sagt dir der Code, das du fertig bist, und die Seite verlassen kannst.

    So schwer ist es nicht. Einfach das Grundprinzip einer Blätterfunktion

    MFG
    Andavos

    --
    http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr