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, V4.4.4 bzw. V4.4.5.
Für die Blinden unter den Einäugigen: Bitte die Contenido-Version beachten: V4.4.3, V4.4.4 oder V4.4.5!
In V4.6 sind die Module bereits integriert.
Hinweis: Es gibt bereits eine alte Version dieses Moduls (V1.0) im Bereich Bugs 4.4 - diese ist nicht mit dieser Version kompatibel (und sollte nicht mehr verwendet werden)!
Folgende Probleme wurden behoben:
- 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)
- Mehrere Mandanten werden nur bedingt, mehrere Sprachen gar nicht unterstützt.
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")
Beschreibung:
Code: Alles auswählen
Newsletter-Modul V2.0
Handles all requests (subscribe, unsubscribe, pause, delete)
for newsletter subscriptions.
See thread on www.contenido.de/forum for details!!!
Based on the work of 4fb and www.x28.de.
Modified by HerrB, 04.05.2004
Ausgabe:
Code: Alles auswählen
<?php
$from = "do-not-reply@domain.de "; /* Specify sender e-mail */
$welcome_title = "Welcome"; /* Title of welcome newsletter, to deactivate function: use "" */
switch ($lang):
case 0: /* There is never a language with id 0, just an example */
$msg = array ("txtMsgSubscribeHeader" => "Newsletter: Confirmation",
"txtMsgSubscribe" => "Dear user,\nto confirm your newsletter subscription please use this link:",
"txtMsgDeleteHeader" => "Newsletter: Cancellation",
"txtMsgDelete" => "Dear subscriber,\nto cancel your newsletter subscription please use this link:",
"htmlErrNoEMail" => "Please specify an e-mail adress.",
"htmlOKSubscribe" => "Dear user,<br><br>you should get an e-mail in just a few seconds. Please confirm your newsletter subscription using the link provided in the e-mail.",
"htmlErrSubscribe" => "This e-mail adress is already listed for the newsletter subscription.",
"htmlOKDelete" => "Dear subscriber,<br><br>you should get an e-mail in just a few seconds. To confirm the cancellation of your newsletter subscription please use the link provided in the e-mail.",
"htmlErrDelete" => "This e-mail adress doesn't receive our newsletter.",
"htmlOKConfirm" => "Operation successful, thank you!<br><br>You are now member of the big family of subscribers to our newsletter.",
"htmlOKConfirmWelcome" => " Even the welcome newsletter is on the way to you!",
"htmlErrConfirm" => "Operation not successful!<br><br>Your account hasn't been confirmed for the newsletter subscription.",
"htmlOKStop" => "Operation successful, you will not get our newsletter until you decide to do so again.",
"htmlErrStop" => "Operation not successful!<br><br>Your account doesn't take a break from newsletter subscription.",
"htmlOKGoOn" => "Operation successful. We are happy to send you our newsletter again.",
"htmlErrGoOn" => "Operation not successful!<br><br>Your account hasn't been reactivated again.",
"htmlOKUnsubscribe" => "We confirm the cancellation of the newsletter subscription.",
"htmlErrUnsubscribe" => "Operation not successful!<br><br>Your newsletter subscription hasn't been cancelled.");
break;
default: /* Use this area for your preferred (or your one and only) language */
$msg = array ("txtMsgSubscribeHeader" => "Newsletter: Bestätigung",
"txtMsgSubscribe" => "Sehr geehrter Interessent,\num Ihre Teilnahme am Newsletter zu bestätigen, klicken Sie bitte auf den unten stehenden Link:",
"txtMsgDeleteHeader" => "Newsletter: Abbestellen",
"txtMsgDelete" => "Sehr geehrter Newsletter-Abonnent, \num den Newsletter zu kündigen, klicken Sie bitte auf untenstehenden Link:",
"htmlErrNoEMail" => "Bitte geben Sie eine E-Mail-Adresse an.",
"htmlOKSubscribe" => "Sehr geehrter Interessent,<br><br>Sie erhalten gleich eine E-Mail. Bitte bestätigen Sie Ihre Teilnahme am Newsletter.",
"htmlErrSubscribe" => "Diese E-Mail-Addresse ist bereits für den Newsletter eingetragen.",
"htmlOKDelete" => "Sehr geehrter Abonnent,<br><br>Sie erhalten gleich eine eMail. Bitte bestätigen Sie die Kündigung des Newsletters.",
"htmlErrDelete" => "Diese E-Mail-Addresse ist nicht für den Newsletter eingetragen.",
"htmlOKConfirm" => "Aktion erfolgreich, vielen Dank!<br><br>Sie gehören nun zum Kreis der Newsletter-Abonnenten.",
"htmlOKConfirmWelcome" => " Bereits unser Willkommens-Newsletter ist auf dem Weg zu Ihnen!",
"htmlErrConfirm" => "Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht bestätigt werden.",
"htmlOKStop" => "Ihr Newsletter-Abonnement pausiert.",
"htmlErrStop" => "Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht pausiert werden.",
"htmlOKGoOn" => "Aktion erfolgreich. Wir senden Ihnen gerne wieder unseren Newsletter.",
"htmlErrGoOn" => "Aktion fehlgeschlagen!<br><br>Newsletter-Account konnte nicht reaktiviert werden.",
"htmlOKUnsubscribe" => "Wir bestätigen hiermit die Kündigung Ihres Newsletter-Abonnements.",
"htmlErrUnsubscribe" => "Aktion fehlgeschlagen!<br><br>Newsletter-Account wurde nicht gekündigt.");
endswitch;
$rcp_id = 0;
$rcp_found = false;
if ($action == "subscribe")
{
if (!isset($email) || !$email) {
echo $msg["htmlErrNoEMail"];
} 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 = $msg["txtMsgSubscribe"]."\n".$cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$newsletteridcatart."&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", $msg["txtMsgSubscribeHeader"], "$body", 'From: '.$from."\n"."X-Mailer: Contenido [PHP/" . phpversion()."]");
echo $msg["htmlOKSubscribe"];
} else {
echo $msg["htmlErrSubscribe"];
}
}
}
if ($action == "delete")
{
if (!isset($email) || !$email) {
echo $msg["htmlErrNoEMail"];
} 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 = $msg["txtMsgDelete"]."\n".$cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$newsletteridcatart."&unsubscribe=".md5($encoded_email)."\n\n";
mail("$email", $msg["txtMsgDeleteHeader"], "$body", 'From: '.$from."\n"."X-Mailer: Contenido [PHP/" . phpversion()."]");
echo $msg["htmlOKDelete"];
} else {
echo $msg["htmlErrDelete"];
}
}
}
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 no name given, use e-mail as name */
if (empty($name)) {
$name = $to;
}
}
}
if ($rcp_found) {
$sql = "UPDATE " .$cfg["tab"]["news_rcp"] ." SET confirmed = '1', deactivated = '0' WHERE idnewsrcp = '".$rcp_id."'";
$db->query($sql);
echo $msg["htmlOKConfirm"];
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")."front_content.php?changelang=".$lang."&idcatart=".$newsletteridcatart."&";
$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 $msg["htmlOKConfirmWelcome"];
}
}
}
} else {
echo $msg["htmlErrConfirm"];
}
}
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 $msg["htmlOKStop"];
} else {
echo $msg["htmlErrStop"];
}
}
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 $msg["htmlOKGoOn"];
} else {
echo $msg["htmlErrGoOn"];
}
}
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 $msg["htmlOKUnsubscribe"];
} else {
echo $msg["htmlErrUnsubscribe"];
}
}
?>
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. Neu: Nehmen Sie in der Mandanten-config.php (z.B. cms/config.php) die folgenden Eingaben vor (Artikelnummer aus 5. eintragen):
Code: Alles auswählen
/* idcatart of the newsletter control page */
$newsletteridcatart = "794";
7. Legen Sie ein neues Modul an. Nennen Sie es "Newsletter Eingabe".
Beschreibung:
Code: Alles auswählen
Newsletter Subscription Module V2.0
Provides multilanguage form for newsletter
subscribing and cancellation.
See thread on www.contenido.de/forum for details!!!
Based on the work of 4fb and www.x28.de.
Modified by HerrB, 04.05.2004
Ausgabe:
Code: Alles auswählen
<?php
switch ($lang):
case 0: /* There is never a language with id 0, just an example */
$msg = array ("htmlName" => "Your name:",
"htmlEMail" => "Your e-mail:",
"txtSubscribe" => "Subscribe",
"txtUnsubscribe" => "Cancel",
"txtOK" => "OK");
break;
default: /* Use this area for your preferred (or only) language */
$msg = array ("htmlName" => "Ihr Name:",
"htmlEMail" => "Ihre eMail-Adresse:",
"txtSubscribe" => "Anmelden",
"txtUnsubscribe" => "Abmelden",
"txtOK" => "OK");
endswitch;
?>
<form name="frmNewsletter" method="post" action="<?php echo "front_content.php?changelang=".$lang ?>">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><?php echo $msg["htmlName"]; ?></td>
<td><input name="emailname" type="text"></td>
</tr>
<tr>
<td><?php echo $msg["htmlEMail"]; ?></td>
<td><input name="email" type="text"><input type="hidden" name="idcatart" value="<?php echo $newsletteridcatart; ?>"></td>
</tr>
<tr>
<td> </td>
<td><select name="action" id="action">
<option value="subscribe" selected><?php echo $msg["txtSubscribe"]; ?></option>
<option value="delete"><?php echo $msg["txtUnsubscribe"]; ?></option>
</select></td>
</tr>
<tr>
<td> </td>
<td><input name="subscribe" type="submit" id="subscribe" value="<?php echo $msg["txtOK"]; ?>"></td>
</tr>
</table>
</form>
9. 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
10. Laden Sie die folgende Datei herunter, entpacken Sie die Datei und übertragen Sie die Dateien in das Verzeichnis contenido\includes:
http://www.btech.de/temp/newsletter2/source445.zip
11. Schon fertig
(12.) 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:
- Berücksichtigung unterschiedlicher Sprachen in beiden Modulen.
- 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.
- Die Datei news.php wird nicht mehr verwendet, stattdessen wird direkt der Artikel (mit Newsletter Blackbox) aufgerufen.
- Die Links, die verschickt werden, enthalten nun den direkten Verweis auf den Artikel in der Sprache des Newsletters.
- 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.
Bekannte Probleme:
SQL-Fehlermeldungen:
Bei einem Update von älteren Contenido-Versionen werden u.U. benötigte Spalten nicht erzeugt. Sollten also SQL-Fehlermeldungen auftreten, sollte die Tabelle <prefix>_news_rcp auf die Anwesenheit der Spalten confirmed und hash überprüft werden (z.B. mit phpMyAdmin: http://www.phpmyadmin.net).
Sollten die Spalten fehlen (<Prefix> geeignet ersetzen, Standard: con):
Code: Alles auswählen
ALTER TABLE `<Prefix>_news_rcp` ADD `confirmed` TINYINT( 1 ) DEFAULT '0' NOT NULL AFTER `lastmodified`;
ALTER TABLE `<Prefix>_news_rcp` ADD `hash` VARCHAR(32) NOT NULL ;
Sind bereits Empfänger eingetragen, könnte man ein Update versuchen: Contenido-Dateien wie beschrieben umbenennen und durch neue Versionen ersetzen. Nun in Contenido alle Empfänger einmal öffnen und mit OK speichern (ich habe es aber nicht getestet).
Ansonsten könnte man aus allen zum Download angegebenen Dateien und in den Modulen urlencode und urldecode entfernen.
Hinweis zum Modul-Update (alte Version -> diese Version):
Nur die Datei include.newsletter_send.php muss ausgetauscht werden und die Module aktualisiert werden. Es muss an alle Empfänger ein Newsletter mit den entsprechenden Links gesendet werden, damit die Nutzer die neuen Links nutzen können (und die alten nicht mehr einsetzen). Es wird empfohlen, die Datei news.php im Mandanten-Verzeichnis umzubenennen oder zu löschen.
Damit die Änderungen in den Modulen wirksam werden, muss für alle Sprachen eines Mandanten das Template dem Artikel bzw. der Kategorie erneut zugewiesen werden!!! Auch bei zukünftigen Änderungen: Sprache 1 einstellen, Template bestätigen, Sprache 2 einstellen, Template bestätigen... usw.
Mehrsprachige Mandanten:
Zur Verwendung mehrerer Sprachen die komplette Vorlage für ID 0 von "Case" bis "break;" kopieren, einfügen und mit Sprach-ID versehen. Beispiel:
Code: Alles auswählen
...
switch ($lang):
case 0: /* There is never a language with id 0, just an example */
$msg = array ("htmlName" => "Your name:",
"htmlEMail" => "Your e-mail:",
"txtSubscribe" => "Subscribe",
"txtUnsubscribe" => "Cancel",
"txtOK" => "OK");
break;
case 5: /* <<<<< Sprache 5 >>>>> */
$msg = array ("htmlName" => "Your name:",
"htmlEMail" => "Your e-mail:",
"txtSubscribe" => "Subscribe",
"txtUnsubscribe" => "Cancel",
"txtOK" => "OK");
break;
default: /* Use this area for your preferred (or one and only) language */
...
Die "txt..."-Variablen enthalten den Text, der in die Mail eingefügt oder für Schaltflächen verwendet wird (kein HTML empfohlen). Die "html..."-Variablen enthalten den Text, der in der Seite angezeigt wird - damit kann es auch HTML sein.
Um es zu testen, kann das Anmeldeformular direkt (= Standardsprache) oder mit front_content.php?changelang=<Sprach-ID>... aufgerufen werden. Bitte beachten, dass bei Änderungen in den Modulen die Templates erneut zugewiesen werden müssen.
Was noch wichtig ist: Newsletter-Empfänger sind sprachgebunden. Wünscht ein Nutzer mehrere Sprachen, muss er sich auch für jede Sprache einzeln anmelden (und die Anmeldung jeweils bestätigen). Es muss für jede Sprache ein separater Newsletter erstellt und versendet werden. Wenn das Feature "Welcome-Newsletter" genutzt werden soll, muss für jede Sprache ein Welcome-Newsletter (mit dem gleichen Namen) erstellt werden.
Ich hoffe, ich habe nichts vergessen; alles auf eigene Gefahr (Backup...).
Viel Erfolg!
Gruß
HerrB