v3.3.x Newsletter nur für die ersten x (EMAIL_MAX_LIMIT) Abonnenten

Thema wurde von Sven (Sky-PC), 15. Januar 2017 erstellt.

  1. Sven (Sky-PC)

    Sven (Sky-PC) Erfahrener Benutzer

    Registriert seit:
    27. September 2013
    Beiträge:
    49
    Danke erhalten:
    15
    Danke vergeben:
    9
    #1 Sven (Sky-PC), 15. Januar 2017
    Zuletzt bearbeitet: 16. Januar 2017
    Moin!
    In der aktuellen V3.3.2.0 und mindestens in der V3.3.1.2 (ich habe jetzt nicht geschaut, seit wann das genau durchgeschliffen wird) gibt es ein Problem mit dem Newsletter-Modul.

    Kleines Beispiel: 2500 Newsletter-Kunden, über den eMail-Server dürfen nur 250 Mails zeitgleich geschickt werden. Also im Adminbereich unter Kunden->eMails->eMail-Optionen->Maximale Anzahl E-Mails pro Versand genau diese 250 eingestellt.

    Das Script zum Senden des Newsletters teilt ja jetzt die zu sendende Anzahl in 250er-Pakete auf und ruft sich mehrmals selber auf. Am Ende scheint alles geklappt zu haben. Aber: Es verschickt statt der 2500 eMail nur die ersten 250. Nachzuvollziehen im eMail-Archiv und in der Datenbank unter module_newsletter_temp_(ID). Dort sind dann auch nur die ersten 250 Einträge mit einem 'send'-Comment versehen.

    Also einmal in die /admin/module_newsletter.php geschaut und nach etwas zusätzlichem DEBUG-Code diese Stelle als Problem ausgemacht:

    Zeile 288:
    PHP:
    for ($i=1;$i<=$max_runtime;$i++)
    Ab dem zweiten Aufruf der Datei wird diese Schleife nicht mehr durchlaufen. Grund ist die fehlerhafte Berechnung der Variabel $max_runtime in Zeile 247:
    PHP:
    $max_runtime=$limit_up-$limit_low;
    Denn diese beiden zugrunde liegenden Variabeln werden aus der
    PHP:
    $_GET['send']
    geholt, welche sich bei jedem Redirect ändert.

    Meine Lösung war es, an dieser Stelle, die beim ersten Aufruf richtige Berechnung in eine Session-Variabel zu speichern.

    Originalcode in Zeile 247:

    PHP:
    $max_runtime=$limit_up-$limit_low;
    ersetzt durch:

    PHP:
        if(isset($_SESSION['max_runtime']))
       {
           
    $max_runtime=$_SESSION['max_runtime'];
       } else {
           
    $max_runtime=$limit_up-$limit_low;
           
    $_SESSION['max_runtime']=$max_runtime;
       }
    Und nach dem letzten Aufruf, die SESSION wieder löschen. Also vor/über dem finalen Redirect in Zeile 335:

    PHP:
    xtc_redirect(xtc_href_link(FILENAME_MODULE_NEWSLETTER));
    noch eingefügt:

    PHP:
    unset($_SESSION['max_runtime']);
    Und jetzt läuft das Script auch für die restlichen eMail-Empfänger brav durch. ;)

    Noch eine Anmerkung: Es gibt Browser-seitig ein Limit für Redirects. Bei den meisten gängigen Browsern liegt dieses Limit bei 20! Sollte man also z.B. 5000 Newsletter-Abonnenten haben und das Limit auf 200 setzen müssen, dann würde das Script 25(!) Redirects verursachen und der Browser dies mit einer Fehlermeldung quittieren. Dann müsste man bei sich im Browser das Limit bei Bedarf hochsetzen. Vielleicht wäre dies als Warnhinweis im Adminbereich beim Newsletter-Modul nicht verkehrt.

    Im Firefox-Browser kann man das Limit z.B. mit
    Code:
    about:config
    in der Adresszeile und dann nach
    Code:
    network.http.redirection-limit
    suchen und entsprechend nach oben anpassen.

    EDIT: Nochmal drüber nachgedacht und es gibt eine deutlich bessere Lösung. Beim sql-query werden die Limits ja korrekt gesetzt bei jedem Redirect und somit das Array $email_data korrekt befüllt. Also kann man statt der obigen Lösung viel einfacher und eleganter in Zeile 247
    PHP:
    $max_runtime=$limit_up-$limit_low;
    durch
    PHP:
    $max_runtime count($email_data);
    ersetzen. Das war es dann auch schon. Weitere Änderungen sind nicht nötig. Die Sache mit dem Browser-Limit hat allerdings weiter Bestand.
     
  2. Sven (Sky-PC)

    Sven (Sky-PC) Erfahrener Benutzer

    Registriert seit:
    27. September 2013
    Beiträge:
    49
    Danke erhalten:
    15
    Danke vergeben:
    9
    Moin liebes Gambio-Team!

    Habt ihr den Beitrag bisher übersehen? Der Fehler ist ebenfalls in der 3.3.3.0 und der 3.4.0.0beta1 immer noch enthalten.
     
  3. Torben Wark

    Torben Wark Gambio GmbH

    Registriert seit:
    15. Juli 2014
    Beiträge:
    2.581
    Danke erhalten:
    1.175
    Danke vergeben:
    399
    Moin Sven,

    erstmal vielen Dank für die umfassende Fehleranalyse und auch die Bereitstellung einer Lösung. Deine Fehlermeldung scheint hier tatsächlich durchgerutscht zu sein, wofür ich mich entschuldigen möchte. Wir sind aber leider auch nicht 24/7 hier aktiv, sodass es auch mal passiert, dass wir etwas nicht sofort lesen. Ich habe deine Beschreibung und Lösung jetzt in leicht umformulierter Form als Ticket übernommen: https://tracker.gambio-server.net/issues/50672
     
  4. Sven (Sky-PC)

    Sven (Sky-PC) Erfahrener Benutzer

    Registriert seit:
    27. September 2013
    Beiträge:
    49
    Danke erhalten:
    15
    Danke vergeben:
    9
    Moin, Torben.
    Ist ja kein Problem. Ist ja auch schon ein recht umfangreiches Forum mittlerweile. Es war mir hat nur jetzt bei den nachfolgenden Versionen erneut aufgefallen.
    LG