Extras - Newsletter: Anleitung und Bugfix

Gesperrt
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Extras - Newsletter: Anleitung und Bugfix

Beitrag von HerrB » Mi 14. Apr 2004, 16:17

Jetzt habe auch ich den Newsletter mal eingesetzt und das eine oder andere Problem bemerkt (dazu gibt es auch schon zahlreiche Threads...).

Daher hier eine Anleitung für die Verwendung des Newsletters. Das Ganze basiert auf der sehr guten Anleitung auf http://www.x28.de (bzw. http://www.cms-webdesign-service.de/fro ... ?idcat=213) und Contenido V4.4.3 bzw. V4.4.4.

Folgende Probleme werden adressiert:
- Bestätigungsmail aktiviert zwar Empfänger, aber bestätigt ihn nicht
- Verwendung identischer E-Mail-Adressen in unterschiedlicher Schreibweise (Groß-/Kleinbuchstaben) möglich
- Eintragung einer leeren E-Mail-Adresse möglich
- Pausieren (STOP), weiter (GOON) und abmelden (UNSUBSCRIBE) funktionieren nicht
- Eingabe von Name und E-Mail-Adresse sehr empfänglich für SQL-Injection (IMHO Sicherheitslücke)

EDIT (15.04.2004 15:20): Modul noch ein bisschen überarbeitet, so dass eine Anmeldung ohne Angabe der E-Mail-Adresse nicht möglich ist.
EDIT (17.04.2004 18:20): Modul überarbeitet, so dass bei Bestätigung eines Accounts ein "Willkommens-Newsletter" verschickt wird.
EDIT (25.04.2004 15:21): Erläuterung zum Willkommens-Newsletter ergänzt.

EDIT (04.05.2004 14:54): Achtung! Modul und Anleitung komplett durch neue Version ersetzt! Die Verwendung dieser Anleitung wird nicht mehr empfohlen. Die neue Version gibt es hier: http://www.contenido.de/forum/viewtopic.php?t=4302

Ich bin kein Experte, deswegen würde ich gerne "die Profis" bitten, die Änderung in Bezug auf SQL-Injection zu bewerten...

Damit alles funktioniert, müssen auch Dateien in Contenido geändert werden - vielleicht findet das ja Eingang in eine der kommenden Versionen...

Hinweis: Es ist möglich, den Newsletter ohne so tiefgreifende Änderungen zu verwenden (z.B., wenn bereits Empfänger für Newsletter eingetragen sind). Weiter unten gibt es entsprechende Hinweise.

Achtung: Einige der folgenden Änderungen verändern die Art und Weise, wie der Empfänger-Name und die E-Mail-Adresse in der Datenbank gespeichert werden - damit sollten die Schritte nur für Systeme durchgeführt werden, bei denen noch keine Emfänger vorhanden sind. Ausserdem werden einige Änderungen bei einer neuen Contenido-Version überschrieben - bitte selbst darauf achten...

Ablauf:
1. Modul anlegen (-> "Newsletter Blackbox")
Nur Ausgabe:

Code: Alles auswählen

<?php 
$from = "do-not-reply@uvh-online.de "; /* Absender-EMail-Adresse festlegen */
$welcome_title = "Welcome"; /* Titel der Willkommensnachricht, deaktivieren: "" */

$confirmText = "Sehr geehrter Interessent,\num Ihre Teilnahme am Newsletter zu bestätigen, klicken Sie bitte auf den unten stehenden Link:"; 
$deleteText = "Sehr geehrter Newsletter-Abonnent, \num den Newsletter zu kündigen, klicken Sie bitte auf untenstehenden Link:";
$rcp_id = 0;
$rcp_found = false; 

if ($action == "subscribe") 
{
  if (!isset($email) || !$email) {
    echo "Bitte geben Sie eine E-Mail-Adresse an.";
  } else {
    $encoded_email = urlencode(strtolower($email));
    $sql = "SELECT idnewsrcp FROM ".$cfg["tab"]["news_rcp"] ." WHERE email = '$encoded_email' AND idclient='$client' AND idlang='$lang'"; 
  
    $db->query($sql); 
    if (!$db->next_record()) 
    { 
      $body = $confirmText."\n".$cfgClient[$client]["path"]["htmlpath"]."news.php?confirm=".md5($encoded_email)."\n\n"; 

      $timestamp = date("Y-m-d H:i:s"); 
      $sql = "INSERT INTO ".$cfg["tab"]["news_rcp"] ." SET idnewsrcp = '".$db->nextid($cfg["tab"]["news_rcp"])."', idclient='$client', idlang='$lang', author='website', email='$encoded_email', name='".urlencode($emailname)."', deactivated='1', created='$timestamp'"; 
      $db->query($sql); 

      mail("$email", "Newsletter-Bestätigung", "$body", 'From: '.$from."\n"."X-Mailer: Contenido [PHP/" . phpversion()."]"); 

      echo "Sehr geehrter Interessent,<br><br>Sie erhalten gleich eine E-Mail. Bitte bestätigen Sie Ihre Teilnahme am Newsletter."; 
    } else { 
      echo "Diese E-Mail-Addresse ist bereits für den Newsletter eingetragen."; 
    }
  } 
} 

if ($action == "delete") 
{
  if (!isset($email) || !$email) {
    echo "Bitte geben Sie eine E-Mail-Adresse an.";
  } else { 
    $encoded_email = urlencode(strtolower($email));
    $sql = "SELECT idnewsrcp FROM ".$cfg["tab"]["news_rcp"] ." WHERE email = '$encoded_email' AND idclient='$client' AND idlang='$lang'"; 
  
    $db->query($sql); 
    if ($db->next_record()) 
    { 
      $body = $deleteText."\n".$cfgClient[$client]["path"]["htmlpath"]."news.php?unsubscribe=".md5($encoded_email)."\n\n"; 

      mail("$email", "Newsletter-Abbestellen", "$body", 'From: '.$from."\n"."X-Mailer: Contenido [PHP/" . phpversion()."]"); 

      echo "Sehr geehrter Abonnent,<br><br>Sie erhalten gleich eine eMail. Bitte bestätigen Sie die Kündigung des Newsletters."; 
    } else { 
      echo "Diese E-Mail-Addresse ist nicht für den Newsletter eingetragen."; 
    }
  } 
} 

if (strlen($confirm) == 32) 
{ 
  $sql = "SELECT idnewsrcp, name, email FROM ".$cfg["tab"]["news_rcp"] ." WHERE idclient='$client' AND idlang='$lang' AND confirmed = '0'"; 
  $db->query($sql); 

  while (!$rcp_found && $db->next_record()) 
  { 
    if ($confirm == md5($db->f("email"))) 
    { 
      $rcp_found = true;
      $rcp_id = $db->f("idnewsrcp");
      $name = urldecode($db->f("name"));
      $encoded_email = $db->f("email");
      $to = urldecode($encoded_email);
    } 
  }
  if ($rcp_found) {
    $sql = "UPDATE " .$cfg["tab"]["news_rcp"] ." SET confirmed = '1', deactivated = '0' WHERE idnewsrcp = '".$rcp_id."'"; 
    $db->query($sql); 
    echo "Aktion erfolgreich, vielen Dank!<br><br>Sie gehören nun zum Kreis der Newsletter-Abonnenten.";
    if ($welcome_title != "") {
      $sql = "SELECT * FROM ".$cfg["tab"]["news"]." WHERE idclient='$client' AND idlang='$lang' AND name='$welcome_title'";
      $db->query($sql);
      if ($db->next_record()) {
        $from    = $db->f("newsfrom");
        $subject = $db->f("subject");
        $message = $db->f("message");
        $date    = $db->f("newsdate");
        $dateday = $date[8].$date[9].".".$date[5].$date[6].".".$date[0].$date[1].$date[2].$date[3];
        $time    = $date[11].$date[12].":".$date[14].$date[15].":".$date[17].$date[18];
      
        $sql = "SELECT idclient, htmlpath FROM ".$cfg["tab"]["clients"]." WHERE idclient='$client'";
        $db->query($sql);
        $db->next_record();
        $path = $db->f("htmlpath")."news.php?";
 
        $message = str_replace("MAIL_NUMBER", "1", $message); /* $number wird mit 1 gesetzt, da nur ein Empfänger */
        $message = str_replace("MAIL_DATE", "$dateday", $message);
        $message = str_replace("MAIL_TIME", "$time", $message);

        $message = str_replace("MAIL_NAME", "$name", $message);
        $message = str_replace("MAIL_UNSUBSCRIBE", $path."unsubscribe=".md5($encoded_email), $message);
        $message = str_replace("MAIL_STOP", $path."stop=".md5($encoded_email), $message);
        $message = str_replace("MAIL_GOON", $path."goon=".md5($encoded_email), $message);
    
        if (mail("$to", "$subject", "$message", 'From: '.$from."\n"."X-Mailer: Contenido [PHP/".phpversion())) {
          echo " Bereits unser Willkommens-Newsletter ist auf dem Weg zu Ihnen!";
        }
      }
    }
  } else {
    echo "Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht bestätigt werden.";
  } 
} 

if (strlen($stop) == 32) 
{ 
  $sql = "SELECT idnewsrcp, email FROM ".$cfg["tab"]["news_rcp"] ." WHERE idclient='$client' AND idlang='$lang'"; 
  $db->query($sql);

  while (!$rcp_found && $db->next_record()) 
  { 
    if ($stop == md5($db->f("email"))) 
    { 
      $rcp_found = true;
      $rcp_id = $db->f("idnewsrcp"); 
    } 
  }
  if ($rcp_found) {
    $sql = "UPDATE " .$cfg["tab"]["news_rcp"] ." SET deactivated = '1' WHERE idnewsrcp = '".$rcp_id."'"; 
    $db->query($sql); 
    echo "Ihr Newsletter-Abonnement pausiert.";
  } else {
       echo "Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht pausiert werden.";
  } 
} 

if (strlen($goon) == 32) 
{ 
  $sql = "SELECT idnewsrcp, email FROM ".$cfg["tab"]["news_rcp"] ." WHERE idclient='$client' AND idlang='$lang'"; 
  $db->query($sql);

  while (!$rcp_found && $db->next_record()) 
  { 
    if ($goon == md5($db->f("email"))) 
    { 
       $rcp_found = true;
       $rcp_id = $db->f("idnewsrcp");        
    } 
  }
  if ($rcp_found) {
    $sql = "UPDATE " .$cfg["tab"]["news_rcp"] ." SET deactivated = '0' WHERE idnewsrcp = '".$rcp_id."'"; 
    $db->query($sql); 
    echo "Aktion erfolgreich. Wir senden Ihnen gerne wieder unseren Newsletter.";
  } else {
    echo "Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht reaktiviert werden.";
  }  
} 

if (strlen($unsubscribe) == 32) 
{ 
  $sql = "SELECT idnewsrcp, email FROM ".$cfg["tab"]["news_rcp"] ." WHERE idclient='$client' AND idlang='$lang'"; 
  $db->query($sql); 

  while (!$rcp_found && $db->next_record()) 
  { 
    if ($unsubscribe == md5($db->f("email"))) 
    { 
       $rcp_found = true;
       $rcp_id = $db->f("idnewsrcp"); 
    } 
  }
  if ($rcp_found) {
    $sql = "DELETE FROM " .$cfg["tab"]["news_rcp"] ." WHERE idnewsrcp = '".$rcp_id."'"; 
    $db->query($sql); 
    echo "Wir bestätigen hiermit die Kündigung Ihres Newsletter-Abonnements.";
  } else {
    echo "Aktion fehlgeschlagen!<br><br>Newsletter-Account wurde nicht gekündigt.";
  }   
} 
?> 
2. Legen Sie ein Template an. Nennen sie es ebenfalls "Newsletter Blackbox".
3. Nehmen Sie in einen Container das eben gespeicherte Modul "Newsletter Blackbox" auf.
4. Legen Sie einen neuen Artikel an. Empfehlenswert: In der Kategorie Hilfsnavigation. Benutzen Sie für den Artikel das Template Newsletter Blackbox. Speichern Sie den Artikel.
5. Öffnen Sie die Eigenschaften des Artikels. Notieren Sie sich die Artikelnummer.
6. Laden Sie die Datei news.txt herunter (http://www.cms-webdesign-service.de/upload/mod/news.txt), passen Sie den Eintrag zur Artikelnummer an (siehe 5.) und speichern Sie die Datei im Mandantenverzeichnis als news.php (nicht als news.txt! Vorhandene Datei überschreiben).
7. Legen Sie ein neues Modul an. Nennen Sie es "Newsletter Eingabe".
8. Passen Sie den folgenden Code (oder den Code von http://www.cms-webdesign-service.de/upl ... be_out.txt) an die eigenen Bedürfnisse an (Artikelnummer, bzw. hier Zahl in <input type="hidden" name="idcatart" value="775"> anpassen) und speichern Sie ihn im Bereich Ausgabe:

Code: Alles auswählen

<form name="formnewsletter" method="post" action="front_content.php">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td>Ihr Name:</td>
    <td><input name="emailname" type="text">
</td>
  </tr>
  <tr>
    <td>Ihre eMail-Adresse:    </td>
    <td><input name="email" type="text">
      <input type="hidden" name="idcatart" value="775">
</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><select name="action" id="action">
      <option value="subscribe" selected>Anmelden</option>
      <option value="delete">Abmelden</option>
    </select>
</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><input name="subscribe" type="submit" id="subscribe" value="Ok">
</td>
  </tr>
</table> 
</form>

9. Speichern Sie das Modul (ein Eingabe-Bereich wird nicht benötigt) und verwenden Sie es in einem Template.
10. Benennen Sie mit einem FTP-Programm die folgenden Dateien im Verzeichnis contenido\includes um, z.B. in .old:
include.newsletter_send.php
include.recipients_edit.php
include.recipients_menu.php
11. Laden Sie die folgenden Dateien herunter, benennen Sie sie wieder um (.txt entfernen) und speichern Sie sie im Verzeichnis contenido\includes:
http://www.btech.de/temp/newsletter/inc ... nd.php.txt
http://www.btech.de/temp/newsletter/inc ... it.php.txt
http://www.btech.de/temp/newsletter/inc ... nu.php.txt
12. Schon fertig ;-)
(13.) Optional: Willkommens-Newsletter in Contenido erzeugen und Namen dieses Newsletters im Modul aus 1. bei $welcome_title eintragen - oder vorhanden Namen durch "" ersetzen, um diese Funktion zu deaktivieren.

Durchgeführte Änderungen:
- Die Speicherung des Namens und der E-Mail-Adresse erfolgt nach Kodierung mit urlencode (ich hoffe, das reicht). Auch der md5-Hash-Wert wird aus der kodierten E-Mail-Adresse erzeugt.
- Bei STOP, GOON und UNSUBSCRIBE wurde in die Mail ein Link eingefügt, dessen Aufbau nicht von news.php verarbeitet werden kann, der Aufbau wurde korrigiert (vorher: ...news.php?mode=unsubscribe&email=<E-Mail-Adresse>, nachher: ...news.php?unsubscribe=598ac8a6e468f3e0753089a3575c2789).
- Scheitert STOP, GOON, UNSUBSCRIBE oder DELETE aus unbekanntem Grund, wird der Nutzer darüber informiert (Fehlermeldungen können im Modul "Newsletter Blackbox" angepasst werden).
- In Contenido werden Name und E-Mail-Adresse mit urldecode zurückkonvertiert (zusätzlich wurde die Suche entsprechend angepasst).

Bekannte Fehler:
- urlencode kodiert laut Spez. kein - und es gibt da einen SQL-Kommentar mit --...
- ' wird zwar kodiert, jedoch als \' danach wieder hergestellt.

Anpassungen, wenn Newsletter-Empfänger bereits vorhanden oder tiefgreifende Änderungen nicht gewünscht:
Aus allen zum Download angegebenen Dateien und im Modul urlencode und urldecode entfernen. include.recipients_menu.php nicht ersetzen.

Ich hoffe, ich habe nichts vergessen; alles auf eigene Gefahr (Backup...).

Viel Erfolg!

Gruß
HerrB
Zuletzt geändert von HerrB am Di 4. Mai 2004, 15:34, insgesamt 5-mal geändert.

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Sa 17. Apr 2004, 18:39

Und noch ein kleiner Hinweis: Der Newsletter funktioniert z.Z. nur für einen Mandanten in einer Sprache wirklich komplett.

Aber da arbeite ich noch dran...

@timo: Was ist eigentlich $foot (siehe include.newsletter_send.php, beim Mail versenden)?

Gruß
HerrB

Schertle
Beiträge: 55
Registriert: Fr 23. Apr 2004, 14:51

Auswahl bei Dropdownlist

Beitrag von Schertle » Fr 23. Apr 2004, 15:05

Contenido Release: 4.4.0

Hallo HerrB,

ich habe Deine Module genauso wie gepostet übernommen.
Bei dem Auswahlmenü gibt es aber nur "Anmelden" und "Abmelden". Muss ich da noch irgenwo was einfügen?

Und bei der Bestätigungsmail kommt immer:
Aktion fehlgeschlagen!
Newsletter-Account konnte nicht bestätigt werden.

Contenido-Log
Invalid SQL: SELECT idnewsrcp, name, email FROM con_news_rcp WHERE idclient='1' AND idlang='1' AND confirmed = 0

In Contenido ist der Empfänger jetzt zwar angelegt aber ich kann dort auch nichts ändern.

Wo kann ich nachschauen wo der Fehler liegt?
Bin noch ziemlich unerfahren mit Contenido.
Vielen Dank im Voraus!!!

Gruß
Juergen

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Fr 23. Apr 2004, 22:44

Bei dem Auswahlmenü gibt es aber nur "Anmelden" und "Abmelden". Muss ich da noch irgenwo was einfügen?
Dies ist korrekt, mehr Funktionen gibt es dort nicht. Die Verwaltung (durch den Nutzer) erfolgt nur über die Links im Newsletter.
In Contenido ist der Empfänger jetzt zwar angelegt aber ich kann dort auch nichts ändern.
Bitte beschreibe "nichts" noch etwas. Welche Contenido-Version verwendest Du? Du solltest die Empfänger sehen und zu jedem Empfänger "Deaktiviert" und "Bestätigt" einstellen können. Ist der Empfänger noch nicht bestätigt?

Bitte poste die Links aus dem Newsletter.

Gruß
HerrB

P.S.: Das sollte nicht das Problem sein, aber setze die 0 für confirmed in Hochkommata (ich ändere das oben noch):

Code: Alles auswählen

if (strlen($confirm) == 32) 
{ 
  $sql = "SELECT idnewsrcp, name, email FROM ".$cfg["tab"]["news_rcp"] ." WHERE idclient='$client' AND idlang='$lang' AND confirmed = '0'";

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Sa 24. Apr 2004, 12:04

Ich vermute, dass bereits in V4.4.4 die Spalte "confirmed" in der DB fehlt.

EDIT (24.04.2004 15.52): Nein, die Spalte "confirmed" ist in V4.4.4 enthalten...

Bitte mit PHPMyAdmin die Tabelle con_news_rcp prüfen und ggf. mit dem folgenden SQL-Skript erweitern:

Code: Alles auswählen

ALTER TABLE `con_news_rcp` ADD `confirmed` TINYINT( 1 ) DEFAULT '0' NOT NULL AFTER `lastmodified`
Gruß
HerrB

Schertle
Beiträge: 55
Registriert: Fr 23. Apr 2004, 14:51

hat geklappt

Beitrag von Schertle » Sa 24. Apr 2004, 22:06

Hi HerrB,

ich habe die Version 4.4.0, da gab es die Confirmed Spalte in MySql nicht. Habe Sie mit Deinem Skript eingefügt und die Hochkommas eingesetzt. Dann hat es sofort funktioniert.

Mit "nichts" meinte ich, dass die Ganzen Felder unter Newsletter-Empfänger leer waren. Name, Emailadresse, usw.. Und wenn ich was eingetragen habe, hat er die Eintragungen nicht übernommen.


Noch mal eine Frage wegen:
Bei dem Auswahlmenü gibt es aber nur "Anmelden" und "Abmelden". Muss ich da noch irgenwo was einfügen?
Dies ist korrekt, mehr Funktionen gibt es dort nicht. Die Verwaltung (durch den Nutzer) erfolgt nur über die Links im Newsletter.
Muss ich die Links selber in den Newsletter einfügen? Und wenn ja wie genau würden die aussehen?

Vielen Dank übrigens für die schnelle Rückmeldung!!!!!

Gruß
Juergen

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » So 25. Apr 2004, 14:21

Ich würde Dir dann ja zum Update auf V4.4.4 raten...
Muss ich die Links selber in den Newsletter einfügen?
Ja. Einfach die folgenden Tags - so, wie sie sind (also z.B. "Abmelden: MAIL_UNSUBSCRIBE", nicht: "Abmelden: <MAIL_UNSUBSCRIBE>") einsetzen.
Spezielle Nachrichten-Tags (werden beim Senden ersetzt):
MAIL_NAME: Name des Empfägers
MAIL_DATE: Datum des Newsletters
MAIL_TIME: Zeit des Newsletters
MAIL_NUMBER: Anzahl der Empfänger
MAIL_UNSUBSCRIBE: Link zum löschen des Abonnements
MAIL_STOP: Link zum Pausieren des Abonnements
MAIL_GOON: Link, um das Abonnement wieder aufzunehmen
Gruß
HerrB

hubert
Beiträge: 25
Registriert: Fr 14. Nov 2003, 18:59
Wohnort: Innsbruck
Kontaktdaten:

Beitrag von hubert » Fr 30. Apr 2004, 23:01

:lol: Ein super Modul, das auch hervorragend funktioniert! Schade ist nur, dass bei gleichem Mandanten aber zwei Sprachen die Empfänger immer nur in der ersten Sprache eingetragen werden!
Gibt's da noch kein "Licht am Horizont, HerrB"????
Wäre toll und ich könnte es gut gebrauchen, schaff's aber selber bis jetzt nicht!

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Sa 1. Mai 2004, 23:08

Ich arbeite noch dran (keine Zeit...). Per se scheinen alle benötigten Funktionen vorzuliegen - nur die Sprache ($lang) muss noch in die Newsletter-Links integriert werden (na ja und das ganze getestet werden).

Ich werde versuchen, mich heute, Sonntag, 02.05.2004 damit auseinanderzusetzen... :roll:

Gruß
HerrB

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » So 2. Mai 2004, 20:52

Fertige Lösung sollte am Montag zur Verfügung stehen...

Gruß
HerrB

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 4. Mai 2004, 15:36

Es gibt unter Module eine neue Version. Diese Version sollte nicht mehr verwendet werden; sie ist nicht mit der neuen Version kompatibel.

Die neue Version gibt es hier: http://www.contenido.de/forum/viewtopic.php?t=4302

Gruß
HerrB

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Do 5. Aug 2004, 12:42

ich mache mal hier zu.

Gesperrt