|
HTML-Mails verschicken
von Wolfgang
Arnberger
In diesem Artikel wird erklärt, wie man eine HTML Seite dynamisch mit Inhalt füllen und als eMail verschicken kann. Anwendungsmöglichkeiten sind z.B. Newsletter, Anmeldebestätigungen u.v.a.m.
In diesem Beispiel wird zum Versenden die mail() Funktion von PHP verwendet. Für kleinere Auflagen ist das durchaus in Ordnung. Sollen die Mails aber an tausende Empfänger gehen, stößt man mit mail() schnell an Grenzen. In solchen Fällen muß man die Daten direkt an sendmail übergeben, was hier aber nicht beschrieben wird.
Methode 1
Bei dieser Methode wird die HTML Datei in einer Variablen gespeichert. Bei jedem Datensatz werden die entsprechenden Werte eingefügt und anschließend die Variable der mail() Funktion übergeben.
<? // Absender $absender="absender@meine_url.net";
// Mail Header $add_head="From: $absender\nReply-To: $absender\nErrors-To: $absender\nContent-Type: text/html; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n";
// Verbindung zur DB herstellen $db=@mysql_connect("localhost","",""); $select=@mysql_select_db("meine_db",$db);
// Daten aus der DB abrufen $result = mysql_query("select email, nachricht from html_mail");
// Daten auslesen while($row=mysql_fetch_array($result,MYSQL_ASSOC)) { foreach($row as $k => $v) { $$k = $v; }
// HTML Datei in Variable speichern und Werte einsetzen $message=" <HTML> <HEAD> <TITLE>Newsletter</TITLE> <META http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"> <STYLE type=\"text/css\"> <!-- body { font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #000000; text-decoration: none} --> </STYLE> </HEAD>
<BODY bgcolor=\"#FFFFFF\" text=\"#000000\"> <P>Das ist das Mail, das als HTML Seite versendet werden soll.</P> <P>".$nachricht."</P> </BODY> </HTML>";
// Mail versenden @mail($email,"Newsletter",$message,$add_head); } ?>
Erklärung:
Zuerst wird die eMail Adresse des Absenders und der String für den Mailheader festgelegt.
Wichtig beim Header sind die Angaben beim Content-Type und Content-Transfer-Encoding. Gibt man hier falsche Werte an, wird das Mail nicht als HTML verschickt und wird beim Empfänger als HTML Quellcode angezeigt.
Die nächsten Schritte sind hoffentlich klar. Verbindung zur Datenbank herstellen und die Daten abrufen. In diesem Beispiel haben wir in der DB nur die eMail Adresse des Empfängers und ein Textfeld, in dem eine Nachricht gespeichert ist. Diese Daten werden abgerufen und in entsprechende Variablen geschrieben, die dann genau so heißen, wie die zugehörige Spalte in der Tabelle.
Dann wird die Variable $message mit der HTML Datei belegt. Hier liegen einige Tücken !
Alle Anführungszeichen (") innerhalb der HTML Datei müssen mit \ maskiert werden. Ist ein Anführungszeichen nicht maskiert, wird es als Ende des Strings betrachtet, wobei der Rest der Datei dann als Programmcode betrachtet wird und das Script mit einer Fehlermeldung abstürzt. Insbesondere bei größeren HTML Dateien liegt hierin eine Quelle für sehr tückische Fehler, die viel Zeit für Fehlersuche nachsich ziehen.
Ist die Variable $message erzeugt und mit Werten gefüllt, wird sie einfach der mail() Funktion übergeben. Da dieser Teil innerhalb der while() Schleife steht, wird der Vorgang für jeden Datensatz durchgeführt.
Diese Vorgangsweise ist beim Versenden mehrerer Mails sehr ungünstig, weil jedes mal wieder die Variable $message erzeugt werden muß und dies erhebliche Rechnerleistung in Anspruch nimmt. Deswegen zeigen wir Ihnen im 2. Beispiel einen besseren Weg, wie man so ein Problem lösen kann.
Methode 2
Der Unterschied zur 1. Methode besteht darin, daß die HTML Datei auf eine andere Art eingelesen wird. Dafür wird zuerst die HTML Datei erzeugt. In diesem Beispiel haben wir folgende Datei verwendet:
<HTML> <HEAD> <TITLE>Newsletter</TITLE> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <STYLE type="text/css"> <!-- body { font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #000000; text-decoration: none} --> </STYLE> </HEAD>
<BODY bgcolor="#FFFFFF" text="#000000"> <P>Das ist das Mail, das als HTML Seite versendet werden soll.</P> <P><!--##Nachricht##--></P> </BODY> </HTML>
Auffallend ist die Zeile "<!--##Nachricht##-->". Diese Zeile ist nur eine Markierung, die angibt, wo der Text eingefügt werden soll. In diesem Beispiel wurde die Markierung als HTML Kommentar ausgeführt. Das muß man nicht unbedingt so machen, man könnte auch jede andere Zeichenfolge nehmen. Es muß nur sichergestellt sein, daß eine Zeichenfolge verwendet wird, die einmalig ist. Andernfalls könnten Texte überschrieben werden.
<? // Absender $absender="absender@meine_url.net";
// Mail Header $add_head="From: $absender\nReply-To: $absender\nErrors-To: $absender\nContent-Type: text/html; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\n";
// Verbindung zur DB herstellen $db=@mysql_connect("localhost","",""); $select=@mysql_select_db("meine_db",$db);
// HTML Datei einlesen $newsletter_mail=fread(fopen("mailtext.html","r"),filesize("mailtext.html"));
// Daten abrufen $result = mysql_query("select email, nachricht from html_mail");
// Daten auslesen while($row=mysql_fetch_array($result,MYSQL_ASSOC)) { foreach($row as $k => $v) { $$k = $v; }
// HTML Datei in $message speichern $message=$newsletter_mail;
// Inhalt einsetzen $message=str_replace("<!--##Nachricht##-->","$nachricht",$message);
// Mail versenden @mail($email,"Newsletter",$message,$add_head); } ?>
Erklärung:
Der obere Teil ist wieder so, wie im 1. Beispiel. Unterschiedlich ist die Art, wie die HTML Datei eingelesen wird.
Dies geschieht mit der Funktion fread(), wobei als 1. Parameter mit fopen() die zu lesende Datei angegeben wird, im 2. Parameter wird mit filesize() die Größe der zu lesenden Datei angegeben. Die gelesene Datei wird dann in der Variablen $newsletter_mail gespeichert.
Innerhalb der while() Schleife wird dann bei jedem Durchgang der Inhalt von $newsletter_mail in die Variable $message geschrieben. Dadurch wird bei jedem Datensatz wieder die HTML Datei im Orginalzustand zur Verfügung gestellt.
Anschließend wird mit str_replace() einfach die jeweilige Markierung gegen den Inhalt ausgetauscht. In unserem Fall haben wir nur einen Wert zu ersetzen. In der Praxis können hier natürliche mehrere Zeilen mit str_replace() vorkommen, um mehrere Markierungen durch Werte zu ersetzen.
Danach wird die so erzeugte Nachricht wieder mit der mail() Funktion verschickt.
Diese Methode ist deutlich angenehmer für den Programmierer, weil das maskieren der Anführungszeichen (") mit "\" entfällt und somit eine mögliche Fehlerquelle ausgeschlossen und Arbeitszeit eingespart wird. Zudem bleibt die HTML Datei in einer Form bestehen, die man problemlos bearbeiten und verändern kann.
|