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.";
}
}
?>
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> </td>
<td><select name="action" id="action">
<option value="subscribe" selected>Anmelden</option>
<option value="delete">Abmelden</option>
</select>
</td>
</tr>
<tr>
<td> </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