home

Das Newsletter-Tool phplist - Vorstellung und hilfreiche Tipps für den Betrieb

Montag, 7. August 2006
nl02.jpg

So, es reicht: ich (und nicht ich allein) habe mich jetzt wirklich lange genug mit Direct Mail, dem Newsletter-Tool von TYPO3, herumgeärgert. Denn kaum hast du mal was entwickelt, das funktioniert, kommt mit Sicherheit wieder irgend ein Update von TYPO3, Direct Mail oder einem zugehörigen Plugin, und schon ist alles wieder beim Teufel. No more Direct Mail!

Aber mit irgend etwas muss ich meine Newsletter ja verschicken, drum war kürzlich ein Evaluationslauf diverser Newsletter-Tools angesagt. Scripts dafür gibt es ja zuhauf, aber ein paar Eckdaten (unsortiert) sollten schon erfüllt sein:

  • PHP & MySQL
  • flexibles Templating
  • Double Opt-In
  • Mehrsprachig
  • Newsletter-Archiv
  • Zeitgesteuertes Versenden per cron
  • HTML- und Textmail
  • Große Empfängerlisten möglich
  • Management der Empfängeradressen
  • CSV-Im- und Export
  • Web-Interface
  • Keine doppelten Nachrichten an bereits eingetragene Empfänger
  • View-Tracking und Click-Tracking
  • Spidering einer existierenden HTML-Seite
  • Flexible Subscribe-Seiten
  • Beliebige Zusatzfelder für Abonnenten (Name, Vorname etc.)
  • Stapelverarbeitung
  • Einstellbare Stückzahlen je Zeitintervall beim Nachrichtenversand
  • Open Source bzw. Freeware
  • Bounce-Handling

Obwohl es hunderte von Newsletter-Scripts und Mailinglist-Systemen gibt, blieb unter dem Strich fast nichts mehr übrig: MailMan und Majordomo sind - vom PHP-Aspekt mal abesehen - viel zu groß und auch zu umständlich in der Bedienung und Konfiguration, das macht nur Sinn für wirklich große Mailinglisten.
Die Massen von PHP-Newsletter-Scripts, wie man sie z.B. auf Hotscripts findet, sind zu 99% unbefriedigend, eingeschränkt oder - sofern interessant - kommerziell, also kostenpflichtig.

power-phplist.png

So bleiben nur ganz, ganz wenige Newsletter-Tools übrig, und von diesen erfüllte allein phplist alle Anforderungen und sogar noch ein wenig mehr (siehe Features)…
(Das sicher sehr leistungfähige OpenEMM (eMail-Marketing-Lösung auf Open-Source-Basis) kam in der finalen Version für meine Tests leider zu spät.)

Zwar arbeitet phplist (ich verwende im Augenblick die Version 2.10.2) “out of the box” schon recht zufrieden stellend, aber wie das mit Software so ist: Anpassungen sind immer nötig und oft auch sinnvoll. Deshalb werde ich in diesem Posting je nach Bedarf Erfahrungswerte, Codeblöcke und Tipps veröffentlichen, die das Leben leichter machen und mehr aus phplist herauskitzeln. Zwar ist vieles davon nicht auf meinen alleinigen Mist gewachsen und auch im Forum zu finden, aber hier ist’s gebündelt und auf deutsch… (sorry für den nun folgenden langen Text):

Inhaltsverzeichnis

Was bringt’s für TYPO3 und/oder WordPress

Zuerst einmal: um einen Newsletter zu verschicken, musst du ihn ja erst einmal gebaut haben - sei es als eigenständige Seite in TYPO3 oder auch als speziell formatierte Seite mit ggf. eigenem Template in WordPress. Was Du im Browser siehst und auch per URL erreichen kannst, ist direkt sendefähig. Allerdings steht auf einem anderen Blatt, ob das, was da erzeugt wurde, auch von jedem Mail-Client ordentlich angezeigt werden kann - doch über die Gestaltung eines HTML-Newsletters lest ihr bitte an anderer Stelle weiter, da gibt es genug gute Artikel im Web…

Die so gebaute HTML-Seite kannst Du wie sie ist nehmen, im Browser auf Quelltext-Ansicht umschalten, den ganzen HTML-Code kopieren und in phplist als neuen Newsletter-Datensatz einfügen. Nur noch die obligatorischen Dinge wie Titel der eMail oder Senderadresse eingeben, Empfängergruppe auswählen und dann auf Versenden klicken, schon geht der Newsletter auf die Reise - wenn’s Dein Server erlaubt, auch per cron-Job (1, 2, 3).

Es ist sogar möglich (leider nicht immer, dazu später mehr), eine automatisch generierte Seite aus WordPress oder TYPO3 zu spidern. Das bedeutet, dass phplist einfach die URL nimmt, den Inhalt ausliest und selbstständig einbaut, generiert, umwandelt und versendet. Toll, nicht…?

Mit den weiter unten stehenden Tricks wird auch gleich ein sauberer Text-Newsletter generiert, ohne dass man sich z.B. mit den Plaintext-Geschichten von TYPO3/Direct Mail herumärgern müsste (schon mal versucht, eine Seite, die ein Multiple Page-Element enthält, in Plaintext mit Direct Mail zu verschicken? Dann weisst Du, was ich meine!).

OK, die Abonnenten lassen sich nicht mehr so ohne weiteres in TYPO3 direkt pflegen, aber das finde ich kann man verkraften, so lange ein sauberer Newsletter herauskommt, bei dem auch das Generieren, Verschicken und Archivieren klappt.

Übrigens: mit dem Plugin WP-PHPList lässt sich phplist recht schnell direkt in WordPress integrieren…
zum Inhaltsverzeichnis

phplist und die Lokalisierungen

Leider, leider sind die Sprachanpassungen nicht in einer zentralen Datei abgelegt (viele davon findet man zumindest im Verzeichnis \lists\texts\), sondern nochmal auf viele weitere Dateien im Verzeichnis \lists\admin\lan\xx verteilt. Und dem nicht genug, stecken weitere Sprachhäppchen noch in allen möglichen anderen Dateien, so dass die Verwendung von GREP zumindest bei phplist ein Muss ist!
Dummerweise kommt noch hinzu, dass zumindest die deutsche Lokalisierungsdatei \lists\texts\german.inc nicht alle Passagen der originalen englischen Datei english.inc enthält, hier ist vergleichen und nacharbeiten angesagt.

Z.B. fand ich einen lang gesuchten Text in der Datei \lists\admin\subscribelib2.php in Zeile 668:

PHP:
  1. ‘Confirm email’,htmlspecialchars($_REQUEST[“emailconfirm”]),$textlinewidth,‘Con firm email’);

wird zu:

PHP:
  1. ‘eMail zur Kontrolle ‘,htmlspecialchars($_REQUEST[“emailconfirm”]),$textlinewidth,‘eMail zur Kontrolle’);

zum Inhaltsverzeichnis

HTML-Seiten spidern

Wenn eine existierende HTML-Seite direkt ohne den Umweg Copy & Paste verschickt werden soll, muss beim Erstellen des Newsletters in phplist die URL der zu spidernden Seite in dieser Form im Nachrichtentext eingegeben werden: [URL:http://www.musterlink.org/...] (Parameterübergabe wie etwa index.php?id=70 ist möglich). phplist kümmert sich dann um den Rest…

Allerdings kann es zwei Hürden geben, die überwunden werden müssen!

Zum einen benötigt diese Funktion die PEAR-Routine PEAR:HTTP/Request, die nicht unbedingt jeder Webhoster installiert hat (Tipps u.a. dazu im PEAR-Forum). Im Zweifelsfall lade dieses Archiv, entpacke es und kopiere die Daten nach \lists\HTTP (Großschreibung beachten!). Die Verzeichnisstruktur sollte dann so aussehen:

phplist_pear.jpg

Damit das PEAR-Modul auch gefunden wird, musst Du noch in der Datei \lists\config\config.php gleich zu Anfang diese Zeile einfügen:

PHP:
  1. include “./HTTP/Request.php”;

Jetzt sollte das Spidern einer HTML-Seite klappen. Wenn nicht, wird’s kompliziert…

Denn: es gibt Seiten, die will PEAR:HTML/Request nicht spidern - kann sein, dass es etwas mit der Validität der Seite zu tun hat, mag aber auch an einzelnen Direktiven liegen. So genau habe ich das noch nicht herausgefunden, ich doktore noch an meiner eigenen Newsletter-Seite herum…
Dennoch kannst du testen, ob das Spidern grundsätzlich klappen würde, in dem Du eine Seite angibst, die unkritisch ist - Google etwa: [URL:http://www.google.de/]. Wenn das klappt, ist PEAR:HTTP/Request funktionstüchtig und Du darfst den Fehler bei Deiner HTML-Seite suchen oder doch lieber den HTML-Code per Copy & Paste rüberkopieren…
zum Inhaltsverzeichnis

HTML- und Plaintext-Mails

Sehr schön ist, dass HTML-Mails automatisch in Text-Mails umgewandelt werden. Leider berücksichtigt die Routine dabei nicht alle Zeichen und Entities, man muss dazu die Umwandlungstabelle in der Datei \lists\admin\sendemaillib.php manuell ergänzen. Ein guter Einstiegspunkt ist dabei die Zeile 844 (phplist 2.11.3: Zeile 939). In dieser steht:

PHP:
  1. $text = preg_replace(“/<a href=\”(.*?)\”[^>]*>(.*?)<\/a>/is”,“[URLTEXT]\\2[/URLTEXT][LINK]\\1[/L INK]”,$text,100);/php]
  2.  
  3. Gleich im Anschluß daran läßt sich die eigene Konvertierung einbinden. Folgende Zeilen erledigen z.B. das Konvertieren von Umlaut-Entities wie <strong>&amp;uuml;</strong> in <strong>ü</strong>:
  4.  
  5. [PHP num=845]# Umsetzung Start
  6.  
  7.     $suchmuster[0] = ‘/&auml;/’;
  8.     $suchmuster[1] = ‘/&Auml;/’;
  9.     $suchmuster[2] = ‘/&uuml;/’;
  10.     $suchmuster[3] = ‘/&Uuml;/’;
  11.     $suchmuster[4] = ‘/&ouml;/’;
  12.     $suchmuster[5] = ‘/&Ouml;/’;
  13.     $suchmuster[6] = ‘/&szlig;/’;
  14.     $suchmuster[7] = ‘/&sect;/’;
  15.     $suchmuster[8] = ‘/&ndash;/’;
  16.     $suchmuster[9] = ‘/&amp;/’;
  17.  
  18.     $ersetzungen[0] = ‘ä’;
  19.     $ersetzungen[1] = ‘Ä’;
  20.     $ersetzungen[2] = ‘ü’;
  21.     $ersetzungen[3] = ‘Ü’;
  22.     $ersetzungen[4] = ‘ö’;
  23.     $ersetzungen[5] = ‘Ö’;
  24.     $ersetzungen[6] = ‘ß’;
  25.     $ersetzungen[7] = ‘$’;
  26.     $ersetzungen[8] = ‘–’;
  27.     $ersetzungen[9] = ‘&’;
  28.  
  29.     ksort($suchmuster);
  30.     ksort($ersetzungen);
  31.     $text = preg_replace($suchmuster, $ersetzungen, $text);
  32.  
  33. # Umsetzung Ende

zum Inhaltsverzeichnis

Überschriften und fett/kursiv im Plaintext

Beim Konvertieren von HTML in Plaintext versucht phplist, Überschriften <h?> und fett bzw. kursiv durch Einfügen von Sternchen und Slashes (* /) hervorzuheben (**Ich bin eine Überschrift**). Im Falle von Überschriften finde ich die Auszeichnung zu schwach, während <strong> und <em> unter den Tisch fallen, da die Routine nur <b> und <i> kennt.
Lösung: in der Datei \lists\admin\sendemaillib.php die Zeile 820 (phplist 2.11.3: Zeile 947) suchen:

PHP:
  1. $text = preg_replace(“/<h[\d]>(.*?)<\/h[\d]\s*>/is”,“**\\1**\n,$text);

Diese durch folgende drei Zeilen ersetzen:

PHP:
  1. $text = preg_replace(“/<h[\d]>(.*?)<\/h[\d]\s*>/is”,\n***\n*** \\1\n***\n,$text);
  2. $text = preg_replace(“/<em>(.*?)<\/em\s*>/is”,“/\\1/”,$text);
  3. $text = preg_replace(“/<strong>(.*?)<\/strong\s*>/is”,“*\\1*”,$text);

zum Inhaltsverzeichnis

Powered by… stört mächtig

Sehr lästig finde ich den Schriftzug bzw. das Logo Powered by phplist…, welche sowohl in der Anmelde-/Bearbeitungsmaske sowie im fertig generierten Newsletter automatisch eingebunden werden. Nicht, dass ich dem Autor seine Credits nicht gönne, aber ich will diese Infos nach meinem Gusto platzieren, ohne dass das Layout verunstaltet wird. Ich bringe diese Informationen lieber später an mir passender Stelle direkt in den Templates unter.

Dazu muss zuerst die Ausgabe dieser Informationen entfernt werden. Zum einen erfolgt dies in der Datei \lists\admin\sendemaillib.php ab Zeile 129 (phplist 2.11.3: Zeile 138 ). Der für die Ausgabe zuständige Block wird einfach auskommentiert:

PHP:
  1. /* if (!EMAILTEXTCREDITS) {
  2.     $HTML["signature"] = $PoweredByImage;#’<div align="center" id="signature"><a href="http://www.phplist.com"><img src="powerphplist.png" width=88 height=31 title="Powered by PHPlist" alt="Powered by PHPlist" border="0"></a></div>’;
  3.     # oops, accidentally became spyware, never intended that, so take it out again <img src=’/wp-content/emoticons/icon_smile.gif’ alt=” title=” />
  4.     $HTML["signature"] = preg_replace(’/src=".*power-phplist.png"/’,’src="powerphplist.png"’,$h tml["signature"]);
  5.   } else {
  6.     $HTML["signature"] = $PoweredByText;
  7. } */

Für die Ausgabe in der Anmelde-/Bearbeitungsmaske suchen wir Zeile 147 (phplist 2.11.3: Zeile 152) in der Datei \lists\admin\connect.php:

PHP:
  1. <span class=“poweredphplist”>powered by <a href=“http://www.phplist.com” class=“poweredphplist” target=“_blank”>phplist</a> v ‘.$v.’, &copy; <a href=“http://tincan.co.uk/powered” target=“_blank” class=“poweredphplist”>tincan ltd</a></span>‘;

Direkt danach fügen wir folgende zwei Zeilen ein:

PHP:
  1. $PoweredByImage =“”;
  2. $PoweredByText = “”;

Damit erscheinen weder das phplist-Logo noch der Schriftzug.
zum Inhaltsverzeichnis

Verhindern, dass das Newsletter-Layout verunstaltet wird

phplist fügt normalerweise automatisch am Ende des Newsletters eine Textpassage ein, die Links zum Abmelden sowie zum Bearbeiten der Profildaten des Abonnenten enthält. Dumm nur, dass dieser Text dann nicht zum eigentlichen Template-Layout gehört und somit richtig stört.

Abhilfe schafft es, das entsprechende Feld Fusszeile beim Erzeugen einer Nachricht leer zu lassen und den Text mit Platzhaltern direkt im HTML-Newslettertemplate unterzubringen. Z.B. so:

HTML:
  1. <td class=“subscriptioninfo”>Falls Sie Ihre eMail-Adresse oder weitere Einstellungen ändern möchten: <a href=“[PREFERENCESURL]”>hier klicken</a><br />Falls Sie keine weiteren Newsletter mehr empfangen möchten: <a href=“[UNSUBSCRIBEURL]”>hier klicken</a>.</td>

zum Inhaltsverzeichnis

Vorsorge für nicht-lesbare HTML-Newsletter

Du weißt nie, mit welchem eMail-Client der HTML-Newsletter gelesen wird, wie der Client eingestellt ist, ob eine Firewall im Spiel ist oder andere Widrigkeiten einen sauberen HTML-Newsletterempfang verhindern. Darum ist es guter Stil, gleich zu Beginn des HTML-Newsletters einen Link einzufügen, der es erlaubt, den HTML-Newsletter direkt im Web per Browser zu lesen.

Leider gibt es aber in phplist weder eine Funktion, um einen für diese Zwecke spezifischen Link zu generieren, noch eine Routine, um einen archivierten Newsletter anzuzeigen. Aber fangen wir erst mal mit dem Erzeugen einer eindeutigen Newsletter-ID an. Dazu suchen wir in der Datei \lists\admin\sendemaillib.php die Zeile 189 (phplist 2.11.3: Zeile 204):

PHP:
  1. $textmessage = $textcontent;

Direkt im Anschluß fügen wir das folgende zweizeilige Konstrukt ein:

PHP:
  1. $htmlmessage = eregi_replace(\[MESSAGEID\],$messageid,$htmlmessage);
  2. $textmessage = eregi_replace(\[MESSAGEID\],$messageid,$textmessage);

Damit schaffen wir den neuen Template-Platzhalter MESSAGEID, der die spezifische ID des entsprechenden Datensatzes erhält. Dieser läßt sich später im Newsletter-Template wie folgt verwenden (zum Archiv-Script kommen wir später):

HTML:
  1. (Wenn Sie diesen Newsletter nicht lesen können, finden Sie <a href=“http://www.musterlink.org/lists/archiv.php?x=[MESSAGEID]”>hier</ a> das Original.)

Während der Laufzeit wird der Platzhalter mit der Newsletter-ID ersetzt (1).
zum Inhaltsverzeichnis

Beautifying der Anmelde-/Bearbeitungsmaske

Das mitgelieferte und standardmäßig eingestellte Layout, das in der Anmelde-/Bearbeitungsmaske Verwendung findet, ist nicht wirklich sexy. Gottlob kann man jedoch dieses Layout sehr einfach durch eigene Kompositionen austauschen. Normalerweise macht dies wenig Probleme, wenn man jedoch das Newsletter-Archiv (dazu später mehr) nutzen will, sind einige Kleinigkeiten zu beachten.

So sollte das neue Design eine gewisse Mindestbreite von beispielsweise 720 Pixel oder mehr haben. Der innere, nutzbare Bereich sollte nicht unter 630 Pixel liegen, da wir ggf. dort die gesendeten Newsletter anzeigen wollen, und diese haben typischerweise eine Breite von ungefähr 600 Pixel.

Wie das folgende Quick & Dirty-Design (frei verwendbar, Anpassung dieses OSWD-Layouts) genutzt wird, will ich kurz erklären.

phplistlayout1.jpg

Zuerst benötigt man zwei Teile des Layouts (für den oberen [Header (HTML)] und unteren [Footer (HTML)] Bereich) sowie ein passendes Stylesheet (das Layout ist nichts anderes als ein nacktes HTML-/CSS-Konstrukt).

Header:

HTML:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml1-strict.dtd">
  2. <HTML xmlns=“http://www.w3.org/1999/xhtml” xml:lang=“de” lang=“de”>
  3.  
  4.     <title>Newsletter-Management</title>
  5.  
  6.     <meta HTTP-equiv=“content-type” content=“text/html; charset=iso-8859-1″ />
  7.     <link rel=“stylesheet” type=“text/css” href=“styles/sealight.css” media=“screen, print” title=“Sea light” />
  8.   </head>
  9.  
  10.     <h1 id=“title”><a href=“http://oswd.org/” title=“oswd - sealight”>Newsletter-Management</a></h1>
  11.     <div class=“menu” id=“topmenu”>
  12.       <ul class=“menu” id=“top”>
  13.             Max Mustermann, Internet: <a href=“http://www.musterlink.org”>http://www.musterlink.org</a>, eMail: <a href=“mailto:%69%6E%66%6F%40%6D%75%73%74%65%72%6C%69%6E%6B%2E%6F%72%67 ″>info {at} musterlink(.)org</a>
  14.       </ul>
  15.     </div>
  16.  
  17.     <div id=“page”>

Footer:

HTML:
  1. </div>
  2.     <!– closing page contents –>
  3.  
  4.     <!– bottom begins here –>
  5.     <div id=“bottom” style=“text-align: center;”>
  6.       <ul>
  7.     <li>powered by <a class=“urhere” href=“http://www.phplist.com” target=“_blank”>phplist</a></li>
  8.       </ul>
  9.       <br />
  10.     </div>
  11.     <!– bottom ends here –>
  12.  
  13.   </body>
  14. </html>

Die beiden Hälften des Layouts werden in der phplist-Administration bei der oder den Anmeldeseite(n) in die Felder Header (HTML) und Footer (HTML) kopiert. Die CSS-Datei kopierst Du in das Verzeichnis \lists\styles. Wenn Du es an eine andere Stelle kopierst, muss der Stylesheet-Pfad im oberen Teil des Layouts angepasst werden. Selbstverständlich kannst Du auch komplexe Designs mit Grafiken etc. verwenden, sofern die Pfade im Layout zu den Speicherorten auf dem Server passen.

(Bei diesem Layout ist bereits der phplist-Credit-Link (powered by…) integriert. Siehe dazu den Punkt Powered by… stört mächtig weiter vorne.)
zum Inhaltsverzeichnis

Beautifying der Administration

Natürlich läßt sich nicht nur die Anmelde-/Bearbeitungsmaske verschönern, das Backend/die Administration könnte ebenfalls ein neues Styling vertragen. Wer das machen möchte, muss vier Dateien bearbeiten:

\lists\admin\pagetop.php
\lists\admin\header.inc
\lists\admin\footer.inc
\lists\admin\styles\phplist.css bzw. die CSS-Datei, die man selbst in der header.inc festlegt.

Ich für meinen Teil habe neben einem neuen Design auch andere störende Elemente beseitigt bzw. an andere Positionen verschoben. Der Reihe nach:

Das rechte Menü sieht gänzlich unschön aus, da die Linien zu nahe an der Schrift pappen. Eine kleine Änderung in der Datei \lists\admin\styles\phplist.css in Zeile 85 wirkt Wunder: einfach etwas padding hinzufügen (siehe Zeilenende).

CSS:
  1. .menutableright {background-color: white; border-left: 1px black solid; border-bottom: 1px black solid; display: block; width: 132px; padding: 5px;}

Außerdem stören mich der doppelt vorhandene logout-Link und das Sprachauswahlmenü mitten im Anzeigebereich.

phplist_logout.jpg

In der Datei \lists\admin\index.php kommentiere ich dazu zuerst die entsprechenden Blöcke ab Zeile 248 (phplist 2.11.3: Zeile 253) aus (Achtung: das sind zwei Blöcke, die jeweils separat auskommentiert werden!):

PHP:
  1. /*  if ($page != "logout") {
  2.     print ‘<div class="logout_link">’.PageLink2("logout",$GLOBALS[’I18N’]->get(’logout ’));
  3.   }
  4.   print ‘</div>’;*/
  5. }
  6. /*if (LANGUAGE_SWITCH) {
  7.   $ls = ‘<div align="center" id="languageswitch"><form name="languageswitch" method="post" style="margin: 0; padding: 0">’;
  8.   $ls .= ‘<select name="setlanguage" onChange="document.languageswitch.submit()" style="width: 100px; font-size: 10px; color: #666666">’;
  9.   $lancount = 0;
  10.   foreach ($GLOBALS[’LANGUAGES’] as $iso => $rec) {
  11.     if (is_dir(dirname(__FILE__).’/lan/’.$iso)) {
  12.       $ls .= sprintf(’<option value="%s" %s>%s</option>’,$iso,$_SESSION[’adminlanguage’][’iso’] == $iso ? ’selected’:”,$rec[0]);
  13.       $lancount++;
  14.     }
  15.   }
  16.   $ls .= ‘</select></form></div>’;
  17.   if ($lancount> 1) {
  18.     print $ls;
  19.   }
  20. }*/

Natürlich will ich nicht auf das Sprachauswahlmenü verzichten, deshalb verbanne ich es an die Stelle, wo es eigentlich standardmäßig stehen sollte: unter den letzten Menüpunkt im rechten Auswahlmenü. Das sieht dann so aus:

phplist_sprachmenue.jpg

Wie geht das nun? Zuerst kopieren wir den passenden Codeblock, den wir eben in der Datei \lists\admin\index.php auskommentiert haben, ins Clipboard (ohne die Kommentarzeichen):

PHP:
  1. if (LANGUAGE_SWITCH) {
  2.   $ls = ‘<div id="languageswitch"><form name="languageswitch" method="post" style="margin: 0; padding: 0">’;
  3.   $ls .= ‘<select name="setlanguage" onChange="document.languageswitch.submit()" style="width: 100px; font-size: 10px; color: #666666">’;
  4.   $lancount = 0;
  5.   foreach ($GLOBALS[‘LANGUAGES’] as $iso => $rec) {
  6.     if (is_dir(dirname(__FILE__).‘/lan/’.$iso)) {
  7.       $ls .= sprintf(‘<option value="%s" %s>%s</option>’,$iso,$_SESSION[‘adminlanguage’][‘iso’] == $iso ? ’selected’:,$rec[0]);
  8.       $lancount++;
  9.     }
  10.   }
  11.   $ls .= ‘</select></form></div>’;
  12.   if ($lancount> 1) {
  13.     print $ls;
  14.   }
  15. }

Dann wird die die Datei \lists\admin\footer.inc geöffnet. Wir gehen zu Zeile 9 (print NewMenu();) und fügen den eben kopierten Codeblock danach ein. Das ganze Konstrukt sieht dann so aus:

PHP:
  1. <div class=“menutableright”>
  2. <?php
  3. if (0) {#$_SESSION["sidebar_enabled"]) {
  4.   print “<!– menu is in the sidebar –>”;
  5. } else {
  6.   print NewMenu();
  7.   if (LANGUAGE_SWITCH) {
  8.     $ls = ‘<div id="languageswitch"><form name="languageswitch" method="post" style="margin: 0; padding: 0">’;
  9.     $ls .= ‘<select name="setlanguage" onChange="document.languageswitch.submit()" style="width: 100px; font-size: 10px; color: #666666">’;
  10.     $lancount = 0;
  11.     foreach ($GLOBALS[‘LANGUAGES’] as $iso => $rec) {
  12.       if (is_dir(dirname(__FILE__).‘/lan/’.$iso)) {
  13.         $ls .= sprintf(‘<option value="%s" %s>%s</option>’,$iso,$_SESSION[‘adminlanguage’][‘iso’] == $iso ? ’selected’:,$rec[0]);
  14.         $lancount++;
  15.       }
  16.     }
  17.     $ls .= ‘</select></form></div>’;
  18.     if ($lancount> 1) {
  19.       print $ls;
  20.     }
  21.   }
  22. }
  23. ?>
  24. </div>

Schwupps, schon passt die Sache!
zum Inhaltsverzeichnis

In phplist nicht vorhanden, aber jetzt wird’s nachgeliefert: Newsletter-Archiv und -Einzelansicht

Die ganze Archiv-Funktionalität steckt in dem Script archiv.phps, das Du nach dem Download in archiv.php umbenennen musst und nach \lists kopierst.

Damit das Script aufgerufen werden kann, ist außerdem noch die Datei \lists\.htaccess um |archiv.php zu ergänzen (Zeile 6 Ende):

HTML:
  1. DirectoryIndex index.php
  2. <FilesMatch “\.(PHP|inc)$”>
  3. Order allow,deny
  4. deny from all
  5. </FilesMatch>
  6. <FilesMatch “(index.php|dl.php|ut.php|lt.php|download.php|archiv.php)$”>
  7. Order allow,deny
  8. allow from all
  9. </FilesMatch>
  10. php_flag magic_quotes_gpc on

Schon klappt’s auch mit dem Archiv:

phplistlayout2.jpg
phplistlayout3.jpg

Wenn Du selbst die archiv.php umbauen willst, gibt es ein paar Dinge zu beachten:

Der gespeicherte Newsletter wird wie er ist komplett in den Anzeigebereich der Archivansicht integriert - inklusive evtl. vorhandener CSS-Anweisungen!!!. Das bedeutet, dass möglicherweise CSS-Direktiven in der archiv.php gnadenlos überschrieben werden - das Layout wird dann u.U. komplett zerschossen. Deshalb musst Du beim Design des Newsletters und Deines neuen Anzeigedesigns darauf achten, unterschiedliche CSS-Bezeichner zu wählen.

Allerdings: um ein Überschreiben des body-Bereichs im CSS wirst Du kaum herumkommen, wenn dein Newsletter z.B. eine andere Hintergrundfarbe o.ä. hat!

Deshalb habe ich den unsauberen, aber funktionierenden Trick verwendet, im Zweifelsfall speziell die CSS-body-Definition nochmal am Ende des HTML-Konstrukts einzubauen. Siehe dazu auch das Ende der archiv.php:

PHP:
  1. print($HTML);
  2. print (“<style type=’text/css’>
  3. <!–
  4. body {background-color: #FFFFFF;}
  5. //–>
  6. </style>”);
  7. print($data[“footer”]);
  8. ?>

Damit wird z.B. die Hintergrundfarbe, die evtl. im Newsletter eine andere ist, wieder auf die im Archiv-Script verwendete gesetzt.

Außerdem musst Du darauf achten, dass der anzuzeigende Newsletter von der Breite her so schmal ist, dass er in den inneren Anzeigebereich des Archiv-Templates passt, sonst wird das Layout ebenfalls durcheinandergewürfelt. Zur Not musst Du das Archiv-Template in der Breite vergrößern (1, 2).
zum Inhaltsverzeichnis

Newsletter-Subscription-Formular für die Website

Es ist üblich, in Websites für die Newsletter-Bestellung kleine Eingabeformulare einzubinden, in denen man seine eMail-Adresse und ggf. noch weitere Angaben (z.B. HTML- oder Textformat) eintragen kann. Das geht auch mit phplist.

phplist_aboform.jpg

Hier der HTML-Code zum Einbau in eine Website:

HTML:
  1. <!– newsletter subscribe below here –>
  2. <style type=“text/css”>
  3. <!–
  4. .sign_nl_box, input {
  5.     border_: 1px solid Silver;
  6.     color: black;
  7.     font-weight: normal;
  8.     font-size: 12px;
  9.     padding: 3px;
  10.     margin: 0;
  11.     vertical-align: text-bottom;
  12. }
  13. //–>
  14. </style>
  15.  
  16. <script language=“Javascript” type=“text/javascript”>
  17. var fieldstocheck = new Array();
  18. fieldnames = new Array();
  19. function checkform() {
  20. for (i=0;i<fieldstocheck.length;i++) {
  21. if (eval(“document.subscribeform.elements[’”+fieldstocheck[i]+“‘].value”) == “”) {
  22. alert(“Folgende Angabe fehlt: “+fieldnames[i]);
  23. eval(“document.subscribeform.elements[’”+fieldstocheck[i]+“‘].focus()” );
  24. return false;
  25. }
  26. }
  27. return true;
  28. }
  29. function addFieldToCheck(value,name) {
  30. fieldstocheck[fieldstocheck.length] = value;
  31. fieldnames[fieldnames.length] = name;
  32. }
  33. </script>
  34. <div class=“sign_nl_box”>
  35. <TABLE cellSpacing=“0″ cellPadding=“0″ bgColor=#ffffff” border=”0” width=”120” align=”left“>
  36. <form method=”post” action=”http://www.musterlink.org/lists/?p=subscribe&id=1” name=”subscribeform“>
  37.     <tr>
  38.         <td colspan=”2” width=”120” align=”center“>
  39.             Abonnieren Sie unseren Newsletter:<br /><br />
  40.         </td>
  41.     </tr>
  42.     <tr>
  43.         <td>
  44.             eMail:&nbsp;
  45.         </td>
  46.         <td>
  47.             <input type=”text” name=”email” value=”” size=”25“><br />
  48.             <script language=”Javascript” type=”text/javascript“>addFieldToCheck("email","Ihre eMail");</script>
  49.         </td>
  50.     </tr>
  51.     <tr>
  52.         <td colspan=”2” height=”5“”></td>
  53.     </tr>
  54.     <tr>
  55.         <td>
  56.             Format:&nbsp;
  57.         </td>
  58.         <td align=“center”>Text:&nbsp<input type="radio" name="htmlemail" value="0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTML:&nbsp;<input type=“radio” name=“htmlemail” value=“1″ checked></td>
  59.     </tr>
  60.     <tr>
  61.         <td colspan=“2″ align=“center”>
  62.             <input type=“hidden” name=“list[1]” value=“signup” /><br />
  63.             <input type=“submit” name=“subscribe” value=” Newsletter bestellen “ onClick=“return checkform();”>
  64.         </td>
  65.     </tr>
  66. </form>
  67. </table>
  68. </div>
  69. <!– newsletter subscribe ends here –>

Zwei Zeilen sind dabei auf den jeweiligen Newsletter anzupassen: Zeile 36 und 62.

HTML:
  1. <form method=“post” action=“http://www.musterlink.org/lists/?p=subscribe&id=1″ name=“subscribeform”>
  2. <input type=“hidden” name=“list[1]” value=“signup” /><br />

In Zeile 36 die richtige URL sowie die korrekte ID der Anmeldeseite eintragen (&id=1).
Auch wenn nur eine Newsletter-Liste geführt wird, muss in Zeile 62 die korrekte ID (list[1]) stehen.

zum Inhaltsverzeichnis

Automatischer Newsletter-Versand nach Neuanmeldung

Eine echte Schwäche von phplist ist, dass ein User, der sich neu anmeldet, nicht automatisch bei der Anmeldung den letzten Newsletter zugeschickt bekommt.

Es gibt zwar eine recht holprige, aber funktionierende Methode, dies einigermaßen zu automatisieren, aber dazu muss man zum einen die ID des letzten Newsletters kennen und zweitens per cron oder pseudo-cron ein Script ausführen können (1). Das würde so funktionieren:

1. In regelmäßigen Abständen Aufruf des phplist-Scripts, das eine bestimmte Nachricht nochmal verschickt:

http://www.musterlink.org/lists/admin/?page=messages&resend=123

Wobei die Zahl 123 durch die ID des aktuellsten Newsletters ersetzt werden muss. Und nicht vergessen: sobald eine neuer Newsletter eingestellt und versendet wird, ist diese ID erneut anzupassen.

Im Anschluß daran wird dann ein weiteres phplist-Script aufgerufen, das den eigentlichen Versand der in der Warteschlange stehenden Nachrichten übernimmt:

http://www.musterlink.org/lists/admin/?page=processqueue

Das dies jedoch sehr lästig ist, habe ich mr überlegt, wie sich das automatisieren läßt. Der meines Erachtens nach sinnvollste Weg ist es, gleich nach der erfolgten Bestätigung der Newsletter-Anmeldung den Newsletter zu verschicken (wohlgemerkt, das Folgende funktioniert nicht, wenn der Administrator über abonnenten / abonnenten verwalten direkt einen User anlegt und diesen gleich aktiviert).

Zuerst also muss das Script gefunden werden, bei dem man einhaken kann: dies ist die Datei \lists\index.php - dort die Funktion function confirmPage($id) ab Zeile 449 (phplist 2.11.3: Zeile 486). Fast am Ende der Funktion, zwischen den Zeilen 501 und 502 (phplist 2.11.3: Zeilen 544 und 545), ist der ideale Ort:

PHP:
  1.   $res .= ‘<h1>’.$info.‘</h1>’;
  2.   $res .= $HTML;
  3. // Hier bietet es sich an, den Code einzubauen
  4.   $res .= “<P>”.$GLOBALS[“PoweredBy”].‘</p>’;
  5.   $res .= $data[“footer”];
  6.   return $res;
  7. }

Was genau ist nun dort einzufügen? Dazu habe ich zuerst einmal die Funktion gesucht, welche einen Datensatz für ein erneutes Versenden vorbereitet. Fündig wurde ich in der Datei \lists\admin\messages.php ab Zeile 80 (phplist 2.11.3: Zeile 112):

PHP:
  1. if (isset($_GET[‘resend’])) {
  2.   $resend = sprintf(‘%d’,$_GET[‘resend’]);
  3.   # requeue the message in $resend
  4.   print $GLOBALS[‘I18N’]->get(“Requeuing”).” $resend ..”;
  5.   $result = Sql_query(“update “.$tables[“message”].” set status = \”submitted\” where id = $resend”);
  6.   $suc6 = Sql_Affected_Rows();
  7.   # only send it again to users, if we are testing, otherwise only to new users
  8.   if (TEST)
  9.     $result = Sql_query(“delete from “.$tables[“usermessage”].” where messageid = $resend”);
  10.   if ($suc6)
  11.     print “… “.$GLOBALS[‘I18N’]->get(“Done”);
  12.   else
  13.     print “… “.$GLOBALS[‘I18N’]->get(“failed”);
  14.   print“<br /><hr /><br /><p>\n;
  15. }

Eigentlich ganz einfach, denn der Clou besteht daraus, dass lediglich in der Tabelle phplist_messages der Inhalt des Feldes status von sent auf submitted gesetzt wird. Schon wird der betreffende Newsletter beim nächsten Durchlauf des Scripts http://www.musterlink.org/lists/admin/?page=processqueue an neue Abonnenten rausgeschickt. Blöd nur, dass wir in diesem Augenblick nicht die ID des Newsletters wissen…

In meinem Fall macht das aber gar nichts, da ich nur eine Newsletter-Liste habe und ganz einfach - ohne erst die Zuordnung von Newsletter zu Newsletter-Liste herausfinden zu müssen - den aktuellsten Newsletter versenden kann. Nach Adam Riese heißt das, ich finde anhand der ID den aktuellsten Newsletter heraus, der aber keine noch nicht abgelaufene Sperrfrist (embargo) haben darf - sonst wäre es ja nicht der letzte versendete!

Hier der entsprechende Code, bereits in die oben geschaffene Lücke eingefügt:

PHP:
  1. $res .= ‘<h1>’.$info.‘</h1>’;
  2.   $res .= $HTML;
  3.   // Dieser Part sorgt dafür, dass der aktuellste Newsletter zum nochmaligen Versenden markiert wird,
  4.   // sobald ein User eine per eMail beschickte Newsletter-Bestellung bestätigt hat.
  5.   // Beim nächsten Verarbeiten der Warteschlange bzw.der processqueue wird der NL verschickt.
  6.   // Der cron-Job, der die Warteschlange verarbeitet, sollte daher vielleicht auf eine Periode von
  7.   // 5 bis 15 Minuten eingestellt werden, damit der User nicht zu lange warten muss.
  8.   $ergebnis = Sql_Query(“SELECT max(id) FROM $tables[message] WHERE embargo <= now()”);
  9.   $nldata = Sql_Fetch_Array($ergebnis);
  10.   $result = Sql_Query(“UPDATE $tables[message] SET status = \”submitted\” WHERE id = $nldata[0]”);
  11.   $success = Sql_Affected_Rows();
  12.   if ($success)
  13.     $res .= “Sie erhalten in wenigen Minuten den aktuellen Newsletter an Ihre eMail-Adresse zugeschickt.<br />”;
  14.   // Ende des Parts
  15.   $res .= “<P>”.$GLOBALS[“PoweredBy”].‘</p>’;
  16.   $res .= $data[“footer”];
  17.   return $res;

Nach dem Bestätigen der Newsletter-Anmeldung durch den User wird der entsprechende Datensatz mit dem letzten Newsletter zum erneuten Versenden markiert. Beim nächsten Verarbeiten der Warteschlange (processqueue) wird der NL verschickt. Der cron-Job, der die Warteschlange verarbeitet, sollte daher vielleicht auf eine Periode von 5 bis 15 Minuten eingestellt werden, damit der neue Abonent nicht zu lange auf seinen ersten Newsletter warten muss (2).
zum Inhaltsverzeichnis

Zeitgesteuertes Versenden mit cron

Es scheint nicht so ganz trivial zu sein, mit phplist zeitgesteuert per cron Mails zu versenden, wie die Forum-Postings 1, 2, 3, 4, 5 und 6 zeigen. Bei mir tat’s anfangs auch nicht, aber die folgende Lösung funktioniert mit PHP CLI (CLI = Command Line Interface -> ‘PHP -v’ gibt das genutzte Interface aus, zu CGI lies hier):

Zuerst einmal definiere ich in der Datei \lists\config\config.php folgende drei Werte und füge die vierte Zeile neu hinzu:

PHP:
  1. define(“MAILQUEUE_BATCH_SIZE”,50);
  2. define(“MAILQUEUE_BATCH_PERIOD”,500); // irrelevant bei CLI mit cron
  3. define(‘MAILQUEUE_THROTTLE’,2);
  4. $commandline_users = array(“admin”,“listprocessor”);

Damit sage ich phplist, dass jeweils 50 Mails im Zeitraum von 500 Sekunden mit 2 Sekunden Pause zwischen jeder Mail versendet werden sollen. Auf den Tag hochgerechnet kann ich so bis zu 7.200 Mails in 24 Stunden versenden, wenn ich per cron-Job alle 10 Minuten einen Batch-Job aufrufe. Die Werte habe ich für mich so gesetzt, um genügend Reserven zu haben und den Mailserver nicht zu überlasten bzw. nicht als Spam-Versender klassifiziert zu werden. Du hast wahrscheinlich andere Kennzahlen und musst Dir die Settings dementsprechend kalkulieren (hängt auch davon ab, was der Mailserver Deines Providers stündlich genehmigt).

Dann brauche ich eine Batchdatei, die den Versendeauftrag bearbeitet. Ich erzeuge die Datei \phplist\phplist (ohne Dateiendung, dafür aber ausführbar -> chmod 755) und füge folgende Zeilen ein:

PHP:
  1. #!/bin/bash
  2.  
  3. # script to run PHPlist from commandline. You may need to edit this to make it work
  4. # with your shell environment. The following should work for Bash
  5.  
  6. # in commandline mode, access is restricted to users who are listed in the config file
  7. # check README.commandline for more info
  8.  
  9. # identify the config file for your installation
  10. CONFIG=/var/www/phplist_master/lists/config/config.php
  11. ISCLI=TRUE
  12. [ -z $USER ] && USER=admin
  13. PROCESS=$$
  14. export CONFIG ISCLI USER
  15.  
  16. LOGFILE=/var/www/phplist_master/lists/log/phplist.log
  17. echo “Prozess $PROCESS gestartet um `date`”>>$LOGFILE
  18. # alternatively you can use -c <path to config file> on the commandline
  19. # run the PHPlist index file with all parameters passed to this script
  20. /usr/bin/php /var/www/phplist_master/lists/admin/index.php $*>> $LOGFILE 2>&1
  21. echo “Prozess $PROCESS beendet um `date`”>>$LOGFILE

Wichtig ist die Angabe des Users, da phplist sonst meckert, dass man keine Rechte zur Ausführung des Scripts hat und auch der cron-Prozess einen User zur Ausführung benötigt.

Als nächstes trage ich den cron-Job ein - das Script soll alle 10 Minuten aufgerufen werden und die Mail-Queue neu bearbeiten (Deine Pfade musst Du unbedingt anpassen!):
10 * * * * /var/www/phplist/lists/phplist -pprocessqueue -c/var/www/phplist/lists/config/config.php

Natürlich solltest Du den Aufruf vorher auf der Shell testen und Dich von der Funktion überzeugen. Erscheint eine Bestätigung in etwa dieser Form, lehnen wir uns zufrieden zurück:

Started
Sending in batches of 50 emails
Processing has started, 1 message(s) to process.
Processing message 27
Looking for users
Found them: 74 to process
batch limit reached: 50 (50)
Script stage: 5
50 messages sent in 221.40 seconds (813 msgs/hr)

Wenn alles klappt, passt Du noch folgende Zeile in der Datei \lists\config\config.php an:

PHP:
  1. define (“MANUALLY_PROCESS_QUEUE”,0);

Das entfernt den Menüpunkt zum Bearbeiten der Processqueue aus dem phplist-Administrationsmenü, damit man nicht versehentlich den Prozess nochmal startet und so die ganze automatische Versendeprozedur stört.

Noch ein Tipp für alle, die von ihrem Hoster keinen cron-Job bekommen: probiert mal das PHP-Script Pseudo-Cron (verbesserte Version hier), mit dem man quasi einen cron-Job simulieren kann. Hab’s aber selber nicht getestet…

zum Inhaltsverzeichnis

Bounces (Mails, die nicht beim Empfänger ankommen)

… in Arbeit…

zum Inhaltsverzeichnis

Anmerkungen, Verbesserungen, weitere Tipps? Die Kommentare stehen Euch offen…

Popularity: 44% [?]

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (21 Wertungen, Durchschnitt: 4.48 von max. 5)
Loading ... Loading ...

44 Reaktionen zum Eintrag “Das Newsletter-Tool phplist - Vorstellung und hilfreiche Tipps für den Betrieb”

  1. Gravatar

    Kommentar von Ulf

    Montag, 7.August 2006 um 12:40

    1

    Hervorragend! Ich war nun auch schon länger auf der Suche nach einem guten System und bin auch bei phplist gelandet - es ist einfach das Beste OpenSource-Tool in diesem Bereich.

    Und wie sehr Du mir mit den Scherereien mit Direct Mail aus der Seele sprichst - es gab kaum einen Newsletter bei dem wirklich alles geklappt hat. Nun wird sich das hoffentlich ändern.

    Super Beitrag, klasse Codeschnipsel!

  2. Gravatar

    Kommentar von bernd das blog

    Mittwoch, 9.August 2006 um 11:54

    2

    hatte die vorgängerversion in gebrauch und habe jetzt upgedatet. das beste tool, das ich kenne.

  3. Gravatar

    Kommentar von Tobi

    Mittwoch, 20.September 2006 um 10:35

    3

    Sehr interessannter Beitrag mit nützlichen Informationen. Ich werde das Tool denächst auch mal ausprobieren. Deine Anmerkung zu fehlenden Funktionen und ähnlichem finde ich richtig. Sende Sie doch mal an die Entwickler von PHPLIST, vieleicht werden Sie irgendwann berücksichtigt!

    Gruß
    Tobi

  4. Gravatar

    Kommentar von Max

    Freitag, 6.Oktober 2006 um 18:07

    4

    hey,

    kannst du das Ganze vll mal als eine verbesserte phplist Version rausbringen?

    Max

  5. Gravatar

    Kommentar von Torsten Montag

    Dienstag, 17.Oktober 2006 um 21:08

    5

    Hi, ich nutze seit einiger ZEit phplist um mtl. ca 18000 MAils zu verwenden.

    Mehr oder weniger mit erfolg. Das ding bricht manchmal mittendrin ab und rührt sich nicht weiter. dann pasiere ich und starte neu. man wird wahnsinnig.

    allein die tatsache, dass ich die warteschlange verarbeiten muss (das stand nirgends geschrieben). dabei wird regelmäßig ein 500 error erzeugt, wenn ich warte bis eine meldung angezeigt wird. wahrlscheinlich wartet das skript, bis die 17000 mails versendet sind. da das zu lnage dauert, gibt der server den fehler. das ist doch eigentlich doff. wie kann man das “hängebleiben” beim mailversand verhindern?

  6. Gravatar

    Kommentar von Outdoor

    Dienstag, 28.November 2006 um 12:39

    6

    Bin schon seit längerem auf der Suche nach einer guten NL-App und so auf den sehr umfassenden Beitrag gestossen.

    Werde anhand dieses Tutors die App sicher austesten. Mich würden allfällige Kapazitäten interessieren, welche die SW bewältigen kann - längerfristig sollte der Versand von ~20′000 Mails möglich sein. Jemand Erfahrungen und einen Workaround damit?

    Anyway - vielen Dank für die präzise Anleitung

  7. Gravatar

    Kommentar von nepf

    Montag, 18.Dezember 2006 um 17:17

    7

    KLASSE HOWTO
    vielen Dank

    ich warte ganz, ganz sehnsüchtig auf die Anleitung zu Bounces, da brauche ich dringedn eine Anleitung

  8. Gravatar

    Kommentar von Christian Haase

    Dienstag, 3.April 2007 um 14:24

    8

    Sieht gut aus, aber das für mich wichtigste Thema wird leider ausgesopart. Was passiert mit den Bounces? Da die mails mit PHP verschickt werden wird PHP würde mich schon interessieren, wie die Logig diese Information vom verschickenden Mailserver erhält und verarbeitet. Ich würde erwarten, dass das System versucht Mails 3x (oder X mal)zuzustellen und unzustellbare Adressen dann automatisch löscht …

    Wäre sehr dankbar für Informationen, wie das System mit solchen Mails umgeht …

    Grüße

    Christian

  9. Gravatar

    Kommentar von Rickk

    Dienstag, 19.Juni 2007 um 19:12

    9

    Hallo
    Deine Tipps haben mir schon sehr weitergeholfen. Danke.

    Trotzdem habe ich noch eine Frage. Weisst Du wie man eine variable Anrede nach Geschlecht in PHP-List integrieren kann.

    z.B.
    Sehr geehrter Herr Müller
    oder wenn es eben eine Frau wäre:
    Sehr geehrte Frau Müller

    Danke für Deine Antwort.

  10. Gravatar

    Kommentar von dm

    Mittwoch, 20.Juni 2007 um 11:36

    10

    Hi Rikkk,

    hab’s gerade nicht parat, ich muss aber diese Woche für mein phplist ein paar Anpassungen machen, dann schau ich mir das auch mal an.

    Gruß,
    Dieter

  11. Gravatar

    Kommentar von Andy

    Sonntag, 22.Juli 2007 um 12:50

    11

    Super Anleitung.

    Jedoch würde ich mich über ein bisschen Hilfestellung in Sachen phpmyAdmin und dem dortigen Anlegen der notwendigen Datenbank freuen! Bin nämlich in dieser Hinsicht absoluter Neuling!

    Schon jetzt vielen Dank.

  12. Gravatar

    Kommentar von Skatan

    Donnerstag, 9.August 2007 um 14:57

    12

    Danke für die Tips! Ich habe damit auch schon einige Zeit gearbeitet. Bin jetzt gerade den anderen Weg gegangen und habe meine erstse DirectMail Installation hinter mir. Habe aber noch keinen produktiven Versand durchgeführt.

    @torsten montag
    phplist stößt die warteschlagen mittels JavaScript Reload im Verabreitungsfenster neu an. Wenn diese Wartezeit länger als die Session-Lifetime eingestellt ist, geht das natürlich nicht ->500 Error. Deshalb den Reload von 3600 auf 900 Sekunden runter setzten.(config-Datei)

    Die Batch-Size sollte man dann auch etwas geringer einstellen.

  13. Gravatar

    Kommentar von Sam

    Samstag, 11.August 2007 um 1:57

    13

    Hallo werter Content-Schmied,

    ich habe gerade ein seriöses Problem mit PHPLIST, welches entweder so ‘advanced’ ist, daß es weder im PHPLIST-Forum noch in dem von FCKeditor zu finden ist (sehr ähnliche Probleme, aber halt doch nicht die gleichen - recherchiere schon seit Stunden danach).
    Oder so einfach, dass ich wie Mattscheibe die naheliegende Lösung nich (mehr) sehen kann.

    Siehe im PHPLIST-Forum unter ID 35169
    (Link: http://forums.phplist.com/viewtopic.php?p=35169)

    Würde mich freuen, wenn Du (oder jemand) darauf eine Antwort hat…

    1.000 Dank - einfach so.

    Grüße, Sam

  14. Gravatar

    Kommentar von Sam

    Samstag, 11.August 2007 um 2:50

    14

    Hallo,
    ich finde hier weder im FCK- noch im PHPLIST-Forum ein exakt gleiches Problem.

    Es werden in der letztendlichen HTML-Mail (Testmail oder per List-Send) keine Bilder angezeigt, sofern es Bilder sind, die per Link (also nicht embedded) in den FCK-Editor (Server-File-Browser) eingefügt wurden.

    Grund: der Pfad im IMG-Tag ist in SRC relativ, also ohne HTTP: angegeben. Klar kann der Mailclient dann keine Bilder finden, er weiß ja nicht, auf welche Domain sie zu suchen wären.

    Das Problem habe ich bis zum Filebrowser (Button ‘Server durchsuchen’ im Bild-Eigenschaftsfenster) zurückverfolgt.

    Dort kann ich ganz normal (nach viel Rumkonfiguriererei) ein Bild auswählen und einfügen.
    Im Feld ‘Bildauswahl’ ist dann auch schon die relative URL zu erkennen. Siehe ich mir den Sourcecode der Seite ‘FCKeditor - Resource Browser’ an, ist es klar, auch hier gibt’s keinen absoluten Pfad im IMG-Src-Tag.

    Jetzt die Frage:
    Wie kriege ich die Kombi FCK/PHPLIST dazu, den ganzen Pfad einzufügen????
    Es kann ja nicht sein, daß ich der einzige mit dem Problem bin, wenn es ein generelles wäre.

    Was habe ich übersehen?

    Ich verwende PHPLIST 2.10.4, FCK Version 2.4.3 Build 15657

    Ich habe nach base_url gesucht. Nicht wirklich eine Configuration dort irgendwo gefunden. Weder in config.php (PHPLIST), noch in FCKeditor’s FCKconfig.js, noch in den beiden config.php von Filebrowser-Teil FCK (connector un browser).

    Wäre wirklich sehr, sehr dankbar für alle Tipps - mit diesem ‘Bug’ fehlt das dringend benötigte Feature, Bilder im Mail-Content einzubinden.

    Herzlichen Dank, Sam

  15. Gravatar

    Kommentar von Sven Fischer

    Dienstag, 28.August 2007 um 19:34

    15

    Hallo,

    vielen Dank für Dein super Tutorial. Ich bin zufällig auf PHPList gestoßen und muss sagen: Super Tool, wirklich. Was bei mir leider noch nicht klappt ist die Anzeige des FCKeditors und das Versenden einer HTML-Seite mit Pear. Die Bibliothek habe ich glaube ich korrekt hoch geladen jedoch gehen einfach keine E-Mails raus, wenn ich in den Nachrichtentext sowas schreibe: [URL:http://www.google.de/]

    … auch wenn ich die Nachricht an einen Testempfänger verschicken möchte kommt die Meldung: Nachricht gespeichert

    Woran kann es liegen?

    Gruß
    Sven

  16. Gravatar

    Kommentar von sven

    Dienstag, 23.Oktober 2007 um 3:59

    16

    Hi,

    absolut Spitze was du dir hier für Mühe gemacht hast. Ich hab auch direkt angefangen alles nachzubauen, bin aber sirekt auf versch. Grenzen gestoßen.. wie funktioniert das mit dem Archiv anlegen genau und wie kann man das Archiv den im Browser aufrufen. Alleine durch das modifizieren der .htaccess geht das bei mir leider nicht. …
    und wenn ich den Code in sendmaillip.php um die Zeilen

    $htmlmessage = eregi_replace(“\[MESSAGEID\]“,$messageid,$htmlmessage);
    $textmessage = eregi_replace(“\[MESSAGEID\]“,$messageid,$textmessage);

    erweitere, dann versendet phplist nichts mehr :-(. Was mach ich den falsch? Wäre toll, wenn du mir etwas weiterhelfen könntest.

    Beste Grüße
    Sven

  17. Gravatar

    Kommentar von Razer

    Freitag, 30.November 2007 um 14:56

    17

    Hab die gleiche Meinung wie Max,

    du hast doch schon alles verbessert, warum nicht gleich zum Download anbieten, denn ich kenn mich nicht SO gut aus, dass ich das alles machen könnte. Würde mich über diese Download-Funktion von euch sehr freuen

    Razer :D

  18. Gravatar

    Kommentar von Markus

    Dienstag, 11.Dezember 2007 um 10:32

    18

    seit ewigen Zeiten starte ich immer wieder einen neuen Newsletter, um ihn dann nach kurzer Zeit wieder einzustampfen, da ich mit den Lösungen einfach nicht zufrieden bin. Nun stehe ich gerade wieder vor der Schaffung eines NL und da hilft mir Dein Bericht ungemein. Ihc werde es jetzt mal mit PHPList versuchen

    Danke!

  19. Gravatar

    Kommentar von Daniel

    Dienstag, 1.Januar 2008 um 15:48

    19

    Hallo,

    die Ausarbeitung ist spitze! Viel Arbeit steckt da drinn, mein Respekt.
    Ich suche jetzt auch schon seit Wochen ein vernünftiges Script.
    Gibt es die Möglichkeit, diese bereits modifizierte PHPlist Version so downzuloaden?

    Wäre natürlich genial!

    Gruß & Danke
    Daniel

  20. Gravatar

    Kommentar von robert

    Donnerstag, 10.Januar 2008 um 11:41

    20

    Merci,

    ich wüsste garnicht, was ich ohne diese Anleitung gemacht hätte…

  21. Gravatar

    Kommentar von Braman

    Freitag, 29.Februar 2008 um 17:37

    21

    Habt ihr das schon gesehen: Da nehme ich Flash ausnahmsweise mal gerne in Kauf: Newsletter-Tool Es gibt noch mehr Wahnsinnige auf dieser Welt ;)

  22. Gravatar

    Kommentar von Paula

    Sonntag, 30.März 2008 um 3:07

    22

    Hallo,

    vielen Dank für die Anleitung - wirklich sehr gelungen. Ich warte auch schon sehnsüchtig auf den Bounce-Teil, da ich ebenfalls Probleme beim Mailversand habe - Mails werden verschickt, aber kommen nicht an.

    Gruß, Paula

  23. Gravatar

    Kommentar von Rigix

    Dienstag, 3.Juni 2008 um 10:06

    23

    Vielen Dank für die tolle Anleitung! Gerne und gespannt erwarte ich den Bounce-Teil, da dies ein wesentlicher Teil einer gut gepflegten Mailliste ausmacht. Gibt es einen zeitlichen Horizont, bis wann dieser Teil dokumentiert ist?

  24. Gravatar

    Kommentar von Tomi Tucker

    Freitag, 13.Juni 2008 um 23:29

    24

    Ja super Infos hier. Ich suche eine Dokumentation / Betriebsanleitung für Enduser, z.B. Sekretärin oder nicht Webperson etc. die das Tool für die Mailings bedient. Gibt es so etwas? ev. mit Screenshots? Danke und ja nutze PHP List auch.Gruss TT

  25. Gravatar

    Kommentar von Stefan

    Mittwoch, 10.September 2008 um 13:58

    25

    Klasse Beitrag. Mir ist aufgefallen, dass die Codeschnipsel zu “Powered By stört mächtig” nur den HTML-Newsletter berücksichtigen. Im textbasierenden Newsletter steht das Credit nach wie vor drin. Einfach mal ausprobieren.

    Bei allen, die in der config.php das
    define(’SEND_ONE_TESTMAIL’,0);
    auf “1″ gesetzt haben, werden das nicht bemerken.

    Für eine Ergänzung und einen Hinweis wäre ich dankbar.

  26. Gravatar

    Kommentar von Jesus Presley

    Mittwoch, 17.September 2008 um 9:53

    26

    Sehr guter Beitrag.
    Wir nutzen PHPList für den Versand von ca. 1500 Mails, Tendenz steigend.

    Vor allem die niedrige Fehlerquote beim Versand und die einfache Verwaltung der Abonnenten finde ich toll.

    Ich vermisse zwar eine etwas detailliertere Statisitik: Zur Not werden wir uns eine Übersicht dafür selber programmieren.

    Auch ich werde demnächst das Tool updaten, um über die neueste Version zu verfügen.

  27. Gravatar

    Kommentar von Nino

    Dienstag, 7.Oktober 2008 um 14:35

    27

    Hi!
    Mich würde auch wie Stefan interessieren wie ich das “Powered By” in Textmails wegbekommen kann. Vielen Dank!
    Gruß

  28. Gravatar

    Kommentar von Kathrin

    Montag, 12.Januar 2009 um 18:05

    28

    Vielen dank zunächst für die Arbeit, sehr hilfreich.

    Leider funktioniert das nicht:
    Verhindern, dass das Newsletter-Layout verunstaltet wird

    gebe ich den href wie beschrieben ein, steht im newsletter wenn er eintrifft:
    dieser Link”>Wenn Sie den Newsletter abbestellen möchten, klicken Sie hier.
    …und es liegt kein link dahinter.

    generell scheinen die [PLATZHALTER] generell vorgefüllt sein, auch bei [CONTENT] erscheint schon ein Text, wo ist das denn zu konfigurieren?

    Danke sagt Kathrin

  29. Gravatar

    Kommentar von momper

    Mittwoch, 21.Januar 2009 um 12:08

    29

    hallo

    es gibt leider relativ wenig zu phplist im deutschsprachigen raum - dein post war extrem hilfreich - 1000 dank dafür!!!

    da im jahre 2009: gibt es mittlerweile andere open-source newsletter-tools? vielleicht etwas schlanker und schicker?

    mein eindruck ist ein wenig wie bei oscommerce: dinosaurier, aber technisch und vom funktionsumfang lief es bei mir noch nie so gut beim newsletter-verschicken wie mit phplist …

    grüße momper

  30. Gravatar

    Kommentar von gerd

    Dienstag, 10.Februar 2009 um 6:53

    30

    Hi,

    leider geht mit den neuen Versionen von phpList 2.10.8 und weiter (davor weiß ich nicht) gar nichts mehr.
    Weder Newsletter online lesen (Dann wird die Warteschlange in phpList nicht mehr abgearbeitet) noch das Archiv. Beim Entfernen der Credits (Branding) ist mir das System vollständig abgeschmiert.
    Schade - war ein guter Ansatz.
    Evtl. gibts ja eine Neuauflage für die aktuellen Versionen. Das wär spitze.

  31. Gravatar

    Kommentar von Tobias

    Donnerstag, 23.April 2009 um 14:37

    31

    Schöner Beitrag, wo einige sachen schon viel klarer werden. Aber wie es aussieht, ist tatsächlich alles nur durch coden zu lösen :-/

    Grüße Tobias

  32. Gravatar

    Kommentar von Joachim

    Dienstag, 1.Dezember 2009 um 14:24

    32

    Hallo,

    gibt es eigentlich ein Plugin für phplist mit WordPress?

    Grüße
    Joachim

  33. Gravatar

    Kommentar von Hahnefeld

    Mittwoch, 27.Januar 2010 um 16:50

    33

    Die Sache mit den personalisierten Feldern ist mir leider auch nicht so ganz klar. Ein Vorredner hat das schon mal gefragt. Gibt es dazu ein Tut?

  34. Pingback von Newsletter mit PHPList (und Wordpress) » die Netzspielwiese

    Montag, 7.August 2006 um 19:59

    34

    […] Dieter Mayer gibt in seinem Weblog »Die Contentschmiede« hilfreiche Tipps für den Betrieb des Newsletter-Tools PHPList. […]

  35. Pingback von CMS Planet » Das Newsletter-Tool phplist - Vorstellung und hilfreiche Tipps für den Betrieb

    Montag, 7.August 2006 um 23:56

    35

    […] Original post by Die ContentSchmiede. To read the full article visit: Die ContentSchmiede […]

  36. Pingback von Ge-Linkt 09-08-06 - BRIGADOON………2006

    Mittwoch, 9.August 2006 um 23:24

    36

    […] phplist (Open-Source Newsletter Manager) […]

  37. Pingback von » Wordpress Newsletter :: Gutes von Morgen

    Montag, 14.August 2006 um 16:29

    37

    […] Für Wordpress habe ich jetzt das Newsletter Plugin phplist gefunden (via netzspielwiese). […]

  38. Pingback von bemerkt.com - good to know

    Samstag, 9.Dezember 2006 um 15:23

    38

    […] December 9, 2006 Eigener Newsletter Auf der Suche nach einem persönlichem Newsletter für meinen Blog benötigte ich doch mehr Zeit als ich dachte. Es ist gar nicht so einfach. Unter google.ch findet man ja bekanntlich vieles, aber auch sehr viel Müll. Das Newsletter-Tool phplist kann als Blog-Newsletter verwendet werden, ist aber für meine Zwecke unbrauchbar. Auch auf dem Webmaster und Webdesign Portal findet man Informationen zu diesem Feature, ist aber auch für mich als ‘Nichtprogrammierer’ zu kompliziert. Ebenfalls auf bueltge.de gibt es ein Plugin mit einer Seite voller Erklärungen. Geht es nicht einfacher? […]

  39. Pingback von phplist v2.10.3 erschienen » Die ContentSchmiede

    Freitag, 5.Januar 2007 um 21:38

    39

    […] Und wer weiß: wenn ich mal wieder eine neue phplist-Installation tätige, packe ich evtl. eine entsprechend angepasste Version zusammen und stelle sie zum Download ‘rein, so wie das Max hierin den Kommentaren vorgeschlagen hat. […]

  40. Pingback von undkonsortenBlog » Newsletter mit Direct Mail und Direct Mail Subscription :: CMS, Tutorial, TYPO3

    Donnerstag, 8.Februar 2007 um 18:46

    40

    […] Wohl zu kaum einer anderen Typo3-Extension gibt es so viele Tutorials und Forenbeiträge wie zu Direct Mail und Direct Mail Subscription. Und auch wenn es etliche gibt, die Direct Mail entnervt abgeschworen haben und stattdessen auf leistungsfähigere Lösungen setzen, für kleinere Newsletter, die ihre Adressen vor allem über die Webseite selbst sammeln, ist Direct Mail nach wie vor eine brauchbare Lösung. Deswegen von uns an dieser Stelle der Versuch, den vielen Anleitungen eine weitere – hoffentlich verständlichere – hinzuzufügen. […]

  41. Pingback von links for 2007-08-07 | Patrick Kempf

    Dienstag, 7.August 2007 um 2:23

    41

    […] Das Newsletter-Tool phplist – Vorstellung und hilfreiche Tipps für den Betrieb -> Die Con… (tags: phplist newsletter PHP tool) […]

  42. Pingback von Gutscheine.cc Newsletter *beta* - Gutscheine.cc

    Montag, 8.Oktober 2007 um 13:00

    42

    […] Eine Vorstellung des Tools und zahlreiche nützliche Tipps dazu gibt es übrigens bei der Contenschmiede. Geposted von admin in Gutscheine.cc am 8. Oktober 2007 ‌  Trackback […]

  43. Pingback von links for 2008-02-16 at dekay.org

    Samstag, 16.Februar 2008 um 1:40

    43

    […] Das Newsletter-Tool phplist - Vorstellung und hilfreiche Tipps für den Betrieb - Die ContentSch… (tags: phplist newsletter PHP mail WordPress tools) […]

  44. Pingback von phplist in JTL-SHop integrieren - JTL-Software Supportforum für JTL-Wawi, JTL-Shop 2, eazyAuction und Connectoren

    Samstag, 16.Januar 2010 um 4:00

    44

    […] NACHDEM ich folenden Quelltext gefunden hatte: Das Newsletter-Tool phplist - Vorstellung und hilfreiche Tipps für den Betrieb » Die ContentSchmiede als TXT nochmals http://www.contentschmiede.de/files/phplist_aboform.txt dachte ich mir schiebe […]

Hinterlasse einen Kommentar

:mrgreen: :| :twisted: :arrow: 8O :) :? 8) :evil: :D :idea: :oops: :P :roll: ;) :cry: :o :lol: :x :( :!: :?:

XHTML: Du kannst diese Auszeichnungen verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Quicktags:

Moderation aktiv: Dies ist ein älterer Artikel. Deshalb werden Kommentare aus Spam-Schutz vor der Freigabe erst angesehen. Also bitte, den Kommentar nicht mehrmals absenden, einmal reicht!
:: GrößerSchrift vergrößern :: KleinerSchrift verkleinern :: LinksLinksbündig ausrichten :: BlockBlocksatz :: RechtsRechtsbündig ausrichten :: BookmarkDiese Seite zu den Bookmarks hinzufügen ::
  • What is it?

    • Die ContentSchmiede ist mein Brain-Extender für Interessantes und Kurioses, Wichtiges und Wertloses - kurz, Dinge, die ich mag und wiederfinden möchte...
  • Kalender

    « August 2006 »
    M D M D F S S
     123456
    78910111213
    14151617181920
    21222324252627
    28293031  
  • Archiv

  • Advertising

    typo3linkliste_120×240.gif
  • Random Fun

    Olivenöl kommt von Oliven, Maisöl kommt von Mais. Woher kommt Babyöl?
  • Die neuesten
    5 Kommentare

    • Marion: “Eine gute Flugsuchmaschine ist natürlich viel wert, und es ist auch praktisch, dass man die Flüge nach...
    • Andi B.: Eine gute Flugsuchmaschine ist natürlich viel wert, und es ist auch praktisch, dass man die Flüge nach...
    • Alleinunterhalter: Ich stell meine Webseite jetzt doch auf WordPress um. Man hat einfach viel mehr möglichkeiten. Und...
    • Alleinunterhalter Hochzeit: Hab die Sache mal ausprobiert! Funktioniert echt prima. Vielen Dank! Gruß Marco
    • Alleinunterhalter: Super, genau danach habe ich gesucht. Danke für den Tollen Beitrag! Gruß Marco

    Die neuesten
    5 Trackbacks

  • Besucher

      Deine IP: 38.107.191.115
      Dein Browser: CCBot/1.0 (+http://www.commoncrawl.org/bot.html)
  • Statistik

    • Dieses Blog ist online seit dem 17.9.2003 (das sind 2368 Tage), enthält 1759 Beiträge und freut sich über 2182 Kommentare.
      Aktuell sind 9 User online und insgesamt haben heute schon 207 Leser vorbei- geschaut.

    Mein Wetter

    • größtenteils bewölkt
    • Temp.: -3°C
    • gefühlte Temperatur: -8°C
    • Luftfeuchtigkeit: 93%
    • Wind: W bei 11 km/h
    • Taupunkt: -4°C
    • Barometer: 29.97" Hg (1015 hPa)
    • Wolken: größtenteils bewölkt
    • Witterung: Dunst
    • Sichtweite: 3.5 km
    • Sunrise: 06:32 CET
    • Sunset: 18:13 CET
  • Don't use IE

    •   Too cool for IE

    •   Get Firefox!