--- /dev/null
+<?xml version="1.0" encoding="iso-8859-1" ?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\r
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+<title>Versionshistorie</title>\r
+<meta name="author" content="Patrick Canterino" />\r
+<style type="text/css">\r
+<!--\r
+a:link, a:visited, a:active, a:focus\r
+{\r
+ font-weight: normal;\r
+ text-decoration: none;\r
+ color: #0000FF;\r
+ cursor: hand;\r
+}\r
+a:link:hover, a:visited:hover, a:active:hover, a:focus:hover\r
+{\r
+ font-weight: normal;\r
+ text-decoration: underline;\r
+ color: #0000FF;\r
+ cursor: hand;\r
+}\r
+body\r
+{\r
+ font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;\r
+ font-size: 10pt;\r
+ color: #000000;\r
+ background-color: #FFFFFF;\r
+}\r
+code\r
+{\r
+ font-family: 'Courier New', Courier, monospace;\r
+ font-size: 10pt;\r
+ color: #0000B0;\r
+}\r
+h1\r
+{\r
+ font-size: 18pt;\r
+ font-weight: bold;\r
+}\r
+li\r
+{\r
+ margin-top: 3px;\r
+}\r
+p\r
+{\r
+ padding-left: 0.5cm;\r
+ padding-right: 0.5cm;\r
+}\r
+table\r
+{\r
+ font-size: 10pt;\r
+ margin-left: 0.5cm;\r
+ margin-right: 0.5cm;\r
+}\r
+td\r
+{\r
+ vertical-align: top;\r
+}\r
+ul\r
+{\r
+ padding-left: 0.5cm;\r
+ padding-right: 0.5cm;\r
+ margin-left: 1cm;\r
+}\r
+-->\r
+</style>\r
+</head>\r
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#0000FF" alink="#0000FF">\r
+\r
+<h1>Versionshistorie</h1>\r
+\r
+<p><b>Neu in Version 3.4.1</b> (vom 27.2.2011)</p>\r
+\r
+<ul>\r
+<li><b>Captcha-Probleme bei aktiviertem <code>register_globals</code>:</b><br />\r
+Bei aktiviertem <code>register_globals</code> war der Captcha-Schutz nutzlos. Es wurde jeder Wert akzeptiert. Danke an Stefan Körner für den Hinweis!</li>\r
+<li><b>Beispiel-Formular:</b><br />\r
+Es wurde eine Datei beigelegt, die ein Beispiel-Formular zur Nutzung mit <i>Form E-Mail</i> darstellt.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.4</b> (vom 25.1.2009)</p>\r
+\r
+<ul>\r
+<li><b>Captchas:</b><br />\r
+Es ist nun möglich, im Mail-Formular sog. <a href="http://de.wikipedia.org/wiki/CAPTCHA">Captchas</a> anzuzeigen. Es handelt sich hierbei um einen zufälligen Text in einem Bild, der in ein Formularfeld eingegeben werden muss, um das Formular zu versenden.</li>\r
+<li><b>Copyright und Lizenz:</b><br />\r
+Im Kopf der PHP-Dateien befindet sich nun eine Copyright-Angabe sowie ein Hinweis, dass für <i>Form E-Mail</i> die Artistic License 1.0 gilt.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.3a</b> (vom 14.4.2007)</p>\r
+\r
+<ul>\r
+<li><b><code>date_default_timezone_set()</code> unter PHP 4:</b><br />\r
+Unter PHP 4 existiert <code>date_default_timezone_set()</code> nicht, weshalb <i>Form E-Mail</i> dort nicht lauffähig war. Jetzt wird vor der Anwendung dieser Funktion geprüft, ob sie auch existiert.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.3</b> (vom 11.4.2007)</p>\r
+\r
+<ul>\r
+<li><b>Umgebungsvariablen im Mailtext:</b><br />\r
+Man kann jetzt Server-Umgebungsvariablen im Mailtext unterbringen. Welche Variablen das sein dürfen, lässt sich über das neue Konfigurations-Array <code>$allowed_envs</code> festlegen. In der Mail-Template kann man dann Variablen unterbringen, die mit <code>ENV_</code> beginnen und dann durch die entsprechende Umgebungsvariable ersetzt werden.</li>\r
+<li><b>Zeichensatz konfigurierbar:</b><br />\r
+Der Zeichensatz, mit dem die Mails codiert werden, kan nnun durch die neue Konfigurationsvaraible <code>$charset</code> eingestellt werden.</li>\r
+<li><b>Zeitzonen konfigurierbar:</b><br />\r
+Neuere Versionen von PHP geben immer (bei entsprechender Einstellung zumindest) eine Fehlermeldung aus, wenn keine Standard-Zeitzone definiert wurde. <i>Form E-Mail</i> definiert jetzt als Standard-Zeitzone <tt>Europe/Berlin</tt>, das lässt sich aber durch die neue Konfigurationsvariable <code>$timezone</code> beliebig anpassen.</li>\r
+<li><b>Template-Klasse aktualisiert:</b><br />\r
+Die <a href="http://www.patshaping.de/redirector/redirect.php?page=template-class" target="_blank">Template-Klasse</a> wurde auf die aktuelle Version 2.0 aktualisiert. Von den neuen Methoden wird Gebrauch gemacht.</li>\r
+<li><b><i>patShaping</i> gestrichen:</b><br />\r
+Im Mailheader und in den Kopfkommentaren der Scripts steht jetzt nur noch <i>Form E-Mail</i>, das Wort <i>patShaping</i> wurde entfernt.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.2.2</b> (vom 9.6.2006)</p>\r
+\r
+<ul>\r
+<li><b>Zeilenumbrüche ersetzen:</b><br />\r
+Sämtliche Zeilenumbrüche im Header und im Text der E-Mail werden nun durch die Zeilenumbruchsfolge des Betriebssystems ersetzt, um Anzeigeprobleme in manchen E-Mail-Programmen (z.B. bei <i>The Bat!</i>) zu beheben (eigentlich sind es keine Probleme, die Zeilenumbrüche werden so dargestellt, wie das Programm sie zu Gesicht bekommt).</li>\r
+<li><b>Anderer Statuscode bei Redirect nach Versand:</b><br />\r
+Wenn nach dem Versand einer E-Mail ein Redirect ausgelöst werden soll, wird nun der Status-Code <tt>303</tt> an den Client zurückgegeben, damit dieser mit <tt>GET</tt> auf die URL zugreift.</li>\r
+<li><b><code>{}</code> vs. <code>[]</code>:</b><br />\r
+Eigentlich planten ja die PHP-Entwickler, dass man mit <code>{}</code> auf einzelne Zeichen einer Zeichenkette zugreifen kann und <code>[]</code> nicht mehr verwendet werden soll. Da das aber keiner gemacht hat, soll <code>{}</code> in PHP 6 wieder rausfliegen (siehe <a href="http://www.php.net/~derick/meeting-notes.html#cleanup-for-vs" target="_blank">http://www.php.net/~derick/meeting-notes.html#cleanup-for-vs</a>) und man soll wieder <code>[]</code>. <i>Form E-Mail</i> wurde entsprechend angepasst, die Änderung nach <code>{}</code> war ohnehin unvollständig.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.2.1</b> (vom 18.6.2005)</p>\r
+\r
+<ul>\r
+<li><b>Keine "Notices" mehr:</b><br />\r
+<i>Form E-Mail</i> sollte nun auch ordnungsgemäß funktionieren, wenn für <code>error_reporting</code> der Wert <code>E_ALL</code> eingestellt wurde.</li>\r
+<li><b>Template-Klasse aktualisiert:</b><br />\r
+Die <a href="http://www.patshaping.de/redirector/redirect.php?page=template-class" target="_blank">Template-Klasse</a> wurde auf Version 1.5a aktualisiert.</li>\r
+<li><b>Verschiedene Änderungen:</b><br />\r
+Es wurden verschiedene kleine Änderungen durchgeführt:\r
+<ul>\r
+<li>Die Funktion <code>sizeof()</code> wurde durch <code>count()</code> ersetzt. <code>sizeof()</code> ist nämlich ein Alias - und von der Verwendung von Aliasen wird abgeraten.</li>\r
+<li>PHP bietet aus Gründen der Abwärtskompatibilität an, auf einzelne Zeichen einer Zeichenkette wie auf die Elemente eines Arrays zuzugreifen. Das wird jetzt nicht mehr gemacht, stattdessen wird die moderne Variante mit geschweiften Klammern verwendet.</li>\r
+<li>Wo es angebracht war, wurden doppelte Anführungszeichen durch einfache ersetzt.</li>\r
+</ul>\r
+</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.2</b> (vom 29.8.2004)</p>\r
+\r
+<ul>\r
+<li><b>Redirect nach Versand:</b><br />\r
+<i>Form E-Mail</i> lässt sich jetzt wahlweise so einstellen, dass es nach dem Versand der Mail per HTTP-Redirect auf eine andere Seite umleitet.<br />\r
+<b style="color:#FF0000">Achtung:</b> Ich habe zwar etwas eingebaut, was hier relative URLs in absolute umwandelt, um dem HTTP-Standard gerecht zu werden, aber ich garantiere nicht, dass diese Umwandlung immer einwandfrei funktioniert. Seien Sie bei relativen URLs also sehr vorsichtig und verwenden Sie im Fehlerfall absolute.</li>\r
+<li><b>Maximallängen:</b><br />\r
+Zusätzlich zu den Mindestlängen aus Version 3.1 lassen sich für Name, Betreff und Text auch Maximallängen angeben.</li>\r
+<li><b>Absender-Adressen ohne Top-Level-Domain:</b><br />\r
+Wenn man die neue Option <code>$no_tld</code> auf "1" setzt, kann man nun als Absender auch eine E-Mail-Adresse angeben, die keine Top-Level-Domain hat.</li>\r
+<li><b>Konfiguration abgespalten:</b><br />\r
+Die Konfigurationsvariablen wurden in die Datei <i>config.php</i> ausgelagert, was für etwas mehr Übersicht sorgt.</li>\r
+<li><b>Template-Klasse aktualisiert:</b><br />\r
+Die <a href="http://www.patshaping.de/redirector/redirect.php?page=template-class" target="_blank">Template-Klasse</a> wurde auf die aktuelle Version 1.3 aktualisiert.</li>\r
+<li><b>Kleine Korrekturen:</b><br />\r
+Am Quelltext wurden kleinere Korrekturen vorgenommen.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.1</b> (vom 20.1.2004)</p>\r
+\r
+<ul>\r
+<li><b>Immer noch Bug in E-Mail-Adressen-Überprüfung:</b><br />\r
+Der reguläre Ausdruck, der die E-Mail-Adressen auf syntaktische Gültigkeit überprüft, war immer noch fehlerhaft. Es gab immer noch E-Mail-Adressen, die das Script überlasten konnten.</li>\r
+<li><b>Mindestlängen:</b><br />\r
+Es ist jetzt möglich, für Name, Betreff und Text Mindestlängen anzugeben.</li>\r
+<li><b>Alias-Empfänger:</b><br />\r
+Es ist nun möglich, über die Formulardaten einen einer oder mehreren Adressen zugeordneten Wert an <i>Form E-Mail</i> zu übergeben. An die dem Wert zugeordneten Adressen wird die Mail dann gesendet.</li>\r
+<li><b>Template-Klasse:</b><br />\r
+<i>Form E-Mail</i> verwendet nun auch die <a href="http://www.patshaping.de/redirector/redirect.php?page=template-class" target="_blank">Template-Klasse</a>. Das sorgt für Übersicht und für eine bessere Erweiterbarkeit.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version 3.0</b> (vom 1.9.2003)</p>\r
+\r
+<ul>\r
+<li><b>Komplett neu programmiert:</b><br />\r
+<i>Form E-Mail 3.0</i> wurde von Grund auf neu programmiert, damit möglichst viele Fehler, die ich anfangs machte (<i>Form E-Mail</i> war eines meiner ersten Scripts) ausgemerzt werden konnten.</li>\r
+<li><b><code>$friendly_sender</code> erweitert:</b><br />\r
+Die Option <code>$friendly_sender</code> kann jetzt den Wert "2" annehmen. Dadurch erscheint zusätzlich der Name des Absenders im E-Mail-Programm. Sollte der Name Zeichen enthalten, die nicht aus dem ASCII-Zeichensatz stammen, wird er mit Base64 codiert (s.u.).</li>\r
+<li><b>Betreffcodierung erneuert:</b><br />\r
+Die Betreffcodierung arbeitet nun hoffentlich endlich zuverlässig, da sie nun Base64 verwendet. Mit der ursprünglichen Quoted-Printable-Codierung gab es Probleme.</li>\r
+<li><b>Mehrere Empfänger:</b><br />\r
+Es ist nun möglich, mehrere Empfänger für die Mail anzugeben.</li>\r
+<li><b>Referer-Überprüfung:</b><br />\r
+Der HTTP-Referer (also sozusagen die Seite, von der das Script aufgerufen wurde) kann nun auf Wunsch einem einfachen Test unterzogen werden: Wenn sich die Host-Angabe nicht in einer im Script definierten Positiv-Liste befindet, wird <i>Form E-Mail</i> mit einer Fehlermeldung beendet. Das ist nützlich, um dafür zu sorgen, dass <i>Form E-Mail</i> nicht von fremden Homepages ausgenutzt wird.</li>\r
+<li><b>Auf Wunsch nur <tt>POST</tt>:</b><br />\r
+<i>Form E-Mail</i> lässt sich mit der neuen Option <code>$only_post</code> so einstellen, dass es nur mit der HTTP-Zugriffsmethode <tt>POST</tt> aufgerufen werden kann.</li>\r
+<li><b>Vorlagen:</b><br />\r
+Es wird nun mit Vorlagen gearbeitet. So kann man jetzt den Text der Mail mit einer Vorlage steuern und die Formularfelder bei einem Fehler mit den bereits eingegebenen Daten vorbelegen lassen.</li>\r
+<li><b>Neue Zeitformatierung:</b><br />\r
+Die Uhrzeit wird nun mit <code>strftime()</code> formatiert, was mehr Freiheiten zulässt. Leider gibt es hier bei neueren PHP-Versionen Probleme, da die Wochentage und Monatsnamen trotz deutscher Spracheinstellungen englisch werden.</li>\r
+</ul>\r
+\r
+<hr width="80%" noshade="noshade" />\r
+\r
+<p align="center">Die Liste der Änderungen bis zur Version 3.0 finden Sie auf der <a href="http://www.patshaping.de/redirector/redirect.php?page=form-email"><i>Form E-Mail</i>-Infoseite</a>!</p>\r
+\r
+<hr width="80%" noshade="noshade" />\r
+\r
+<p><a href="readme.htm">ReadMe-Datei</a></p>\r
+\r
+<hr width="80%" noshade="noshade" />\r
+\r
+<p style="font-size:8pt">© 2002-2011 Patrick Canterino</p>\r
+\r
+<table border="0" cellspacing="0" style="font-size:8pt">\r
+<tr>\r
+<td>Homepage:</td>\r
+<td><a href="http://www.patshaping.de/" target="_blank">http://www.patshaping.de/</a></td>\r
+</tr>\r
+<tr>\r
+<td>E-Mail:</td>\r
+<td><a href="mailto:patrick@patshaping.de">patrick@patshaping.de</a></td>\r
+</tr>\r
+</table>\r
+</body>\r
+</html>
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+#\r
+# Form E-Mail 3.4.1 - captcha.php\r
+#\r
+# Generieren eines Captcha-Bilds\r
+#\r
+# Autor: Patrick Canterino <patrick@patshaping.de>\r
+# Letzte Aenderung: 11.1.2009\r
+#\r
+# Copyright (C) 2002-2011 Patrick Canterino\r
+#\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# weitergegeben und / oder veraendert werden.\r
+# Siehe:\r
+# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+#\r
+\r
+require('config.php');\r
+require('functions.php');\r
+require('class.Template.php');\r
+\r
+if($captcha_enable)\r
+{\r
+ session_start();\r
+\r
+ if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max)\r
+ {\r
+ show_fatal($err_captcha_max);\r
+ }\r
+ else\r
+ {\r
+ unset($_SESSION['captcha']);\r
+\r
+ # Zufaellige Zeichenkette erzeugen\r
+\r
+ $captcha_string = '';\r
+\r
+ $x = 0;\r
+ srand();\r
+\r
+ while($x<$captcha_length)\r
+ {\r
+ $rand = rand(0,strlen($captcha_possible)-1);\r
+ $captcha_string .= $captcha_possible[$rand];\r
+\r
+ $x++;\r
+ }\r
+\r
+ $_SESSION['captcha'] = $captcha_string;\r
+\r
+ # Ein Bild mit dem generierten Text erzeugen\r
+\r
+ if($captcha_image_bg && file_exists($captcha_image_bg))\r
+ {\r
+ # Es wurde ein Hintergrundbild angegeben\r
+\r
+ $captcha_img = imagecreatefrompng($captcha_image_bg);\r
+\r
+ $image_size = getimagesize($captcha_image_bg);\r
+ $captcha_width = $image_size[0];\r
+ $captcha_height = $image_size[1];\r
+ }\r
+ else\r
+ {\r
+ # Es wurde kein Hintergrundbild angegeben\r
+\r
+ $captcha_img = imagecreate($captcha_width,$captcha_height);\r
+ }\r
+\r
+ $white = imagecolorallocate($captcha_img,$captcha_color_bg[0],$captcha_color_bg[1],$captcha_color_bg[2]);\r
+ $black = imagecolorallocate($captcha_img,$captcha_color_text[0],$captcha_color_text[1],$captcha_color_text[2]);\r
+\r
+ $angle = rand($captcha_angle[0],$captcha_angle[1]);\r
+ $t_x = rand($captcha_x[0],$captcha_y[1]);\r
+ $t_y = rand($captcha_y[0],$captcha_y[1]);\r
+ \r
+ imagettftext($captcha_img,$captcha_font_size,$angle,$t_x,$t_y,$black,$captcha_font,$captcha_string);\r
+\r
+ # Zufaellige Linien einfuegen\r
+\r
+ $y = 0;\r
+\r
+ while($y<$captcha_lines)\r
+ {\r
+ $begin_x = rand(0,$captcha_width);\r
+ $begin_y = rand(0,$captcha_height);\r
+ $end_x = rand(0,$captcha_width);\r
+ $end_y = rand(0,$captcha_height);\r
+\r
+ imageline($captcha_img,$begin_x,$begin_y,$end_x,$end_y,$black);\r
+\r
+ $y++;\r
+ }\r
+\r
+ # Bild ausgeben\r
+\r
+ header('Content-type: image/png');\r
+ imagepng($captcha_img);\r
+\r
+ imagedestroy($captcha_img);\r
+ }\r
+}\r
+else\r
+{\r
+ show_fatal($err_captcha_disabled);\r
+}\r
+\r
+#\r
+### Ende ###\r
+\r
+?>
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+#\r
+# Template (Version 2.0)\r
+#\r
+# Klasse zum Parsen von Templates\r
+#\r
+# Autor: Patrick Canterino <patrick@patshaping.de>\r
+# Letzte Aenderung: 3.7.2006\r
+#\r
+\r
+class Template\r
+{\r
+ var $file;\r
+ var $template;\r
+ var $original;\r
+ var $vars = array();\r
+ var $defined_vars = array();\r
+ var $loop_vars = array();\r
+\r
+ # get_template()\r
+ #\r
+ # Kompletten Vorlagentext zurueckgeben\r
+ #\r
+ # Parameter: -keine-\r
+ #\r
+ # Rueckgabe: Kompletter Vorlagentext (String)\r
+\r
+ function get_template()\r
+ {\r
+ return $this->template;\r
+ }\r
+\r
+ # set_template()\r
+ #\r
+ # Kompletten Vorlagentext aendern\r
+ #\r
+ # Parameter: Vorlagentext\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function set_template($text)\r
+ {\r
+ $this->template = $text;\r
+ }\r
+\r
+ # add_text()\r
+ #\r
+ # Vorlagentext ans Template-Objekt anhaengen\r
+ #\r
+ # Parameter: Vorlagentext\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function add_text($text)\r
+ {\r
+ $this->set_template($this->get_template().$text);\r
+ }\r
+\r
+ # read_file()\r
+ #\r
+ # Einlesen einer Vorlagendatei und {INCLUDE}-Anweisungen ggf. verarbeiten\r
+ # (Text wird an bereits vorhandenen Text angehaengt)\r
+ #\r
+ # Parameter: 1. Datei zum Einlesen\r
+ # 2. Status-Code (Boolean):\r
+ # true => {INCLUDE}-Anweisungen nicht verarbeiten\r
+ # false => {INCLUDE}-Anweisungen verarbeiten (Standard)\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function read_file($file,$not_include=0)\r
+ {\r
+ $this->file = $file;\r
+\r
+ if(filesize($file) > 0)\r
+ {\r
+ $fp = fopen($file,'r');\r
+ if(!$fp) die;\r
+ $content = fread($fp,filesize($file));\r
+ fclose($fp);\r
+ }\r
+ else $content = '';\r
+\r
+ $this->add_text($content);\r
+ $this->save_state();\r
+\r
+ if(!$not_include) $this->parse_includes();\r
+ }\r
+\r
+ # set_var()\r
+ #\r
+ # Wert einer Variable setzen\r
+ #\r
+ # Parameter: 1. Name der Variable\r
+ # 2. Wert, den die Variable erhalten soll\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function set_var($var,$content)\r
+ {\r
+ $this->vars[$var] = $content;\r
+ }\r
+\r
+ # get_var()\r
+ #\r
+ # Wert einer Variable zurueckgeben\r
+ #\r
+ # Parameter: (optional) Variablenname\r
+ #\r
+ # Rueckgabe: Wert der Variable;\r
+ # wenn die Variable nicht existiert, false;\r
+ # wenn kein Variablenname angegeben wurde, wird ein\r
+ # Array mit den Variablennamen zurueckgegeben\r
+\r
+ function get_var($var=false)\r
+ {\r
+ if($var !== false)\r
+ {\r
+ if(isset($this->vars[$var]))\r
+ {\r
+ return $this->vars[$var];\r
+ }\r
+ else\r
+ {\r
+ return false;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ return array_keys($this->vars);\r
+ }\r
+ }\r
+\r
+ # set_loop_data()\r
+ #\r
+ # Daten fuer eine Schleife setzen\r
+ #\r
+ # Parameter: 1. Name der Schleife\r
+ # 2. Array mit den Arrays mit den Variablen fuer\r
+ # die Schleifendurchgaenge\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function set_loop_data($loop,$data)\r
+ {\r
+ $this->loop_vars[$loop] = $data;\r
+ }\r
+\r
+ # add_loop_data()\r
+ #\r
+ # Daten fuer einen Schleifendurchgang hinzufuegen\r
+ #\r
+ # Parameter: 1. Name der Schleife\r
+ # 2. Array mit den Variablen fuer den\r
+ # Schleifendurchgang\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function add_loop_data($loop,$data)\r
+ {\r
+ if(isset($this->loop_vars[$loop]) && is_array($this->loop_vars[$loop]))\r
+ {\r
+ array_push($this->loop_vars[$loop],$data);\r
+ }\r
+ else\r
+ {\r
+ $this->loop_vars[$loop] = array($data);\r
+ }\r
+ }\r
+\r
+ # parse()\r
+ #\r
+ # In der Template definierte Variablen auslesen, Variablen\r
+ # ersetzen, {IF}- und {TRIM}-Bloecke parsen\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function parse()\r
+ {\r
+ # Zuerst die Schleifen parsen\r
+\r
+ if(is_array($this->loop_vars) && ($loops = array_keys($this->loop_vars)))\r
+ {\r
+ foreach($loops as $loop)\r
+ {\r
+ $this->parse_loop($loop);\r
+ }\r
+ }\r
+\r
+ # Normale Variablen durchgehen\r
+\r
+ if(($vars = $this->get_var()) !== false && is_array($vars))\r
+ {\r
+ foreach($vars as $var)\r
+ {\r
+ $val = $this->get_var($var);\r
+\r
+ $this->parse_if_block($var,$val);\r
+\r
+ if(is_array($val))\r
+ {\r
+ $this->fillin_array($var,$val);\r
+ }\r
+ else\r
+ {\r
+ $this->fillin($var,$val);\r
+ }\r
+\r
+ unset($val);\r
+ }\r
+ }\r
+\r
+ # Jetzt dasselbe mit denen, die direkt in der Template-Datei definiert\r
+ # sind, machen. Ich weiss, dass das eine ziemlich unsaubere Loesung ist,\r
+ # aber es funktioniert\r
+\r
+ $this->get_defined_vars();\r
+\r
+ foreach($this->defined_vars as $var)\r
+ {\r
+ $val = $this->get_var($var);\r
+\r
+ $this->parse_if_block($var,$val);\r
+ $this->fillin($var,$val);\r
+\r
+ unset($val);\r
+ }\r
+\r
+ # {TRIM}-Bloecke entfernen\r
+\r
+ $this->parse_trim_blocks();\r
+ }\r
+\r
+ # fillin()\r
+ #\r
+ # Variablen durch Text ersetzen\r
+ #\r
+ # Parameter: 1. Variable zum Ersetzen\r
+ # 2. Text, durch den die Variable ersetzt werden soll\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function fillin($var,$text)\r
+ {\r
+ $template = $this->get_template();\r
+ $template = str_replace('{'.$var.'}',$text,$template);\r
+\r
+ $this->set_template($template);\r
+ }\r
+\r
+ # fillin_array()\r
+ #\r
+ # Variable durch Array ersetzen\r
+ #\r
+ # Parameter: 1. Variable zum Ersetzen\r
+ # 2. Array, durch das die Variable ersetzt werden soll\r
+ # 3. Zeichenkette, mit der das Array verbunden werden soll\r
+ # (Standard: '')\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function fillin_array($var,$array,$glue='')\r
+ {\r
+ $this->fillin($var,implode($glue,$array));\r
+ }\r
+\r
+ # to_file()\r
+ #\r
+ # Template in Datei schreiben\r
+ #\r
+ # Parameter: Datei-Handle\r
+ #\r
+ # Rueckgabe: Status-Code (Boolean)\r
+\r
+ function to_file($handle)\r
+ {\r
+ return @fwrite($handle,$this->get_template());\r
+ }\r
+\r
+ # reset()\r
+ #\r
+ # Den gesicherten Stand des Template-Textes sichern\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function reset()\r
+ {\r
+ $this->template = $this->original;\r
+ }\r
+\r
+ # save_state()\r
+ #\r
+ # Aktuellen Stand des Template-Textes sichern\r
+ # (alte Sicherung wird ueberschrieben)\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function save_state()\r
+ {\r
+ $this->original = $this->template;\r
+ }\r
+\r
+ # parse_loop()\r
+ #\r
+ # Eine Schleife parsen\r
+ #\r
+ # Parameter: Name der Schleife\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function parse_loop($name)\r
+ {\r
+ $template = $this->get_template();\r
+ if(strpos($template,'{LOOP '.$name.'}') === false) return;\r
+\r
+ $offset = 0;\r
+ $name_len = strlen($name);\r
+\r
+ while(($begin = strpos($template,'{LOOP '.$name.'}',$offset)) !== false)\r
+ {\r
+ if(($end = strpos($template,'{ENDLOOP}',$begin+6+$name_len)) !== false)\r
+ {\r
+ $block = substr($template,$begin,$end+9-$begin);\r
+ $content = substr($block,$name_len+7,-9);\r
+\r
+ $parsed_block = '';\r
+\r
+ for($x=0;$x<count($this->loop_vars[$name]);$x++)\r
+ {\r
+ $loop_data = $this->loop_vars[$name][$x];\r
+ $loop_vars = array_keys($loop_data);\r
+\r
+ $ctpl = new Template;\r
+ $ctpl->set_template($content);\r
+\r
+ foreach($loop_vars as $loop_var)\r
+ {\r
+ $ctpl->set_var($name.'.'.$loop_var,$loop_data[$loop_var]);\r
+ }\r
+\r
+ $ctpl->parse();\r
+ $parsed_block .= $ctpl->get_template();\r
+\r
+ unset($ctpl);\r
+ }\r
+\r
+ $template = str_replace($block,$parsed_block,$template);\r
+ $offset = $begin+strlen($parsed_block);\r
+ }\r
+ else break;\r
+ }\r
+\r
+ $this->set_template($template);\r
+ }\r
+\r
+ # get_defined_vars()\r
+ #\r
+ # In der Template-Datei definierte Variablen auslesen\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function get_defined_vars()\r
+ {\r
+ $template = $this->get_template();\r
+ if(strpos($template,'{DEFINE ') === false) return;\r
+\r
+ $offset = 0;\r
+\r
+ while(strpos($template,'{DEFINE ',$offset) !== false)\r
+ {\r
+ $begin = strpos($template,'{DEFINE ',$offset)+8;\r
+ $offset = $begin;\r
+\r
+ $name = '';\r
+ $content = '';\r
+\r
+ $var_open = 0;\r
+ $name_found = 0;\r
+ $define_block = 0;\r
+\r
+ for($x=$begin;$x<strlen($template);$x++)\r
+ {\r
+ if($template[$x] == "\012" || $template[$x] == "\015")\r
+ {\r
+ # Wenn in einem {DEFINE}-Block ein Zeilenumbruch gefunden wird,\r
+ # brechen wir mit dem Parsen des Blockes ab\r
+\r
+ break;\r
+ }\r
+\r
+ if($var_open == 1)\r
+ {\r
+ if($template[$x] == '"')\r
+ {\r
+ # Der Inhalt der Variable ist hier zu Ende\r
+\r
+ $var_open = 0;\r
+\r
+ if($template[$x+1] == '}')\r
+ {\r
+ # Hier ist der Block zu Ende\r
+\r
+ if($this->get_var($name) === false)\r
+ {\r
+ # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+ $this->set_var($name,$content);\r
+ array_push($this->defined_vars,$name);\r
+ }\r
+\r
+ # {DEFINE}-Block entfernen\r
+\r
+ $pre = substr($template,0,$begin-8);\r
+ $post = substr($template,$x+2);\r
+\r
+ $template = $pre.$post;\r
+\r
+ # Fertig!\r
+\r
+ $offset = strlen($pre);\r
+ break;\r
+ }\r
+ }\r
+ elseif($template[$x] == '\\')\r
+ {\r
+ # Ein Backslash wurde gefunden, er dient zum Escapen von Zeichen\r
+\r
+ if($template[$x+1] == 'n')\r
+ {\r
+ # "\n" in Zeilenumbrueche umwandeln\r
+\r
+ $content .= "\n";\r
+ }\r
+ else $content .= $template[$x+1];\r
+\r
+ $x++;\r
+ }\r
+ else $content .= $template[$x];\r
+ }\r
+ else\r
+ {\r
+ if($name_found == 1)\r
+ {\r
+ if($var_open == 0)\r
+ {\r
+ if($template[$x] == '"') $var_open = 1;\r
+ else break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ # Variablennamen auslesen\r
+\r
+ if($template[$x] == '}' && $name != '')\r
+ {\r
+ # Wir haben einen {DEFINE}-Block\r
+\r
+ $name_found = 1;\r
+ $define_block = 1;\r
+\r
+ # Alles ab hier sollte mit dem Teil verbunden werden, der das\r
+ # {DEFINE} in einer Zeile verarbeitet\r
+\r
+ # Der Parser fuer {DEFINE}-Bloecke ist nicht rekursiv, was auch\r
+ # nicht noetig sein sollte\r
+\r
+ if(($end = strpos($template,'{ENDDEFINE}',$x)) !== false)\r
+ {\r
+ $x++;\r
+\r
+ $content = substr($template,$x,$end-$x);\r
+\r
+ if($this->get_var($name) === false)\r
+ {\r
+ # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+ $this->set_var($name,$content);\r
+ array_push($this->defined_vars,$name);\r
+ }\r
+\r
+ $pre = substr($template,0,$begin-8);\r
+ $post = substr($template,$end+11);\r
+\r
+ $template = $pre.$post;\r
+\r
+ # Fertig!\r
+\r
+ $offset = strlen($pre);\r
+ break;\r
+ }\r
+ else break;\r
+ }\r
+ elseif($template[$x] != ' ')\r
+ {\r
+ $name .= $template[$x];\r
+ }\r
+ elseif($name != '')\r
+ {\r
+ $name_found = 1;\r
+ }\r
+ else break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ $this->set_template($template);\r
+ }\r
+\r
+ # parse_if_block()\r
+ #\r
+ # IF-Bloecke verarbeiten\r
+ #\r
+ # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht)\r
+ # 2. Status-Code (true => Inhalt anzeigen\r
+ # false => Inhalt nicht anzeigen\r
+ # 3. true => Verneinten Block nicht parsen\r
+ # false => Verneinten Block parsen (Standard)\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function parse_if_block($name,$state,$no_negate=0)\r
+ {\r
+ $template = $this->get_template();\r
+\r
+ $count = 0;\r
+\r
+ while(strpos($template,'{IF '.$name.'}') !== false)\r
+ {\r
+ # Das alles hier ist nicht wirklich elegant geloest...\r
+ # ... aber solange es funktioniert... ;-)\r
+\r
+ $count++;\r
+\r
+ $start = strpos($template,'{IF '.$name.'}');\r
+ $tpl_tmp = substr($template,$start);\r
+ $splitted = explode('{ENDIF}',$tpl_tmp);\r
+\r
+ $block = ''; # Kompletter bedingter Block\r
+ $ifs = 0; # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt)\r
+\r
+ # {IF}\r
+\r
+ for($x=0;$x<count($splitted);$x++)\r
+ {\r
+ if($x == count($splitted)-1) die('Nesting error found while parsing IF block "'.$name.'" nr. '.$count.' in template file "'.$this->file.'"');\r
+\r
+ $ifs += substr_count($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
+ $ifs--; # Zaehler um 1 erniedrigen\r
+ $block .= $splitted[$x].'{ENDIF}'; # Daten zum Block hinzufuegen\r
+\r
+ if($ifs == 0)\r
+ {\r
+ # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-))\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ $if_block = substr($block,strlen($name)+5,-7); # Alles zwischen {IF} und {ENDIF}\r
+\r
+ # {ELSE}\r
+\r
+ $else_block = ''; # Alles ab {ELSE}\r
+ $ifs = 0; # IF-Zaehler\r
+\r
+ $splitted = explode('{ELSE}',$if_block);\r
+\r
+ for($x=0;$x<count($splitted);$x++)\r
+ {\r
+ $ifs += substr_count($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
+ $ifs -= substr_count($splitted[$x],'{ENDIF}'); # Vom Zaehler jedes Vorkommen von ENDIF abziehen\r
+\r
+ if($ifs == 0)\r
+ {\r
+ # Zaehler 0, also haben wir das Ende des IF-Abschnitts gefunden\r
+\r
+ # Aus dem Rest den ELSE-Block zusammenbauen\r
+\r
+ for($y=$x+1;$y<count($splitted);$y++)\r
+ {\r
+ $else_block .= '{ELSE}'.$splitted[$y];\r
+ }\r
+\r
+ if($else_block)\r
+ {\r
+ $if_block = substr($if_block,0,strlen($if_block)-strlen($else_block));\r
+ $else_block = substr($else_block,6);\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ # Block durch die jeweiligen Daten ersetzen\r
+\r
+ $replacement = ($state) ? $if_block : $else_block;\r
+\r
+ $template = str_replace($block,$replacement,$template);\r
+ }\r
+\r
+ $this->set_template($template);\r
+\r
+ # Evtl. verneinte Form parsen\r
+\r
+ if(!$no_negate)\r
+ {\r
+ $this->parse_if_block('!'.$name,!$state,1);\r
+ }\r
+ }\r
+\r
+ # parse_trim_blocks()\r
+ #\r
+ # {TRIM}-Bloecke parsen\r
+ #\r
+ # Dieser Parser ist nicht rekursiv, was auch nicht\r
+ # noetig sein sollte.\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function parse_trim_blocks()\r
+ {\r
+ $template = $this->get_template();\r
+ if(strpos($template,'{TRIM}') === false) return;\r
+\r
+ $offset = 0;\r
+\r
+ while(($begin = strpos($template,'{TRIM}',$offset)) !== false)\r
+ {\r
+ if(($end = strpos($template,'{ENDTRIM}',$begin+6)) !== false)\r
+ {\r
+ $block = substr($template,$begin,$end+9-$begin);\r
+ $content = substr($block,6,-9);\r
+\r
+ $trimmed = trim($content);\r
+\r
+ $template = str_replace($block,$trimmed,$template);\r
+\r
+ $offset = $begin+strlen($trimmed);\r
+ }\r
+ else break;\r
+ }\r
+\r
+ $this->set_template($template);\r
+ }\r
+\r
+ # parse_condtag()\r
+ #\r
+ # Bedingungstags in einem Vorlagentext verarbeiten\r
+ #\r
+ # Parameter: 1. Tagname\r
+ # 2. Status-Code (true => Tag-Inhalt anzeigen\r
+ # false => Tag-Inhalt nicht anzeigen\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function parse_condtag($condtag,$state)\r
+ {\r
+ $template = $this->get_template();\r
+\r
+ while(strpos($template,'<'.$condtag.'>') !== false)\r
+ {\r
+ $start = strpos($template,'<'.$condtag.'>'); # Beginn des Blocks\r
+ $end = strpos($template,'</'.$condtag.'>')+strlen($condtag)+3; # Ende des Blocks\r
+\r
+ $extract = substr($template,$start,$end-$start); # Kompletten Bedingungsblock extrahieren...\r
+\r
+ $replacement = ($state) ? substr($extract,strlen($condtag)+2,0-strlen($condtag)-3) : '';\r
+\r
+ $template = str_replace($extract,$replacement,$template); # Block durch neue Daten ersetzen\r
+ }\r
+ $this->set_template($template);\r
+ }\r
+\r
+ # parse_includes()\r
+ #\r
+ # {INCLUDE}-Anweisungen verarbeiten\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function parse_includes()\r
+ {\r
+ $template = $this->get_template();\r
+ if(strpos($template,'{INCLUDE ') === false) return;\r
+\r
+ $offset = 0;\r
+\r
+ $y = 0;\r
+\r
+ while(($begin = strpos($template,'{INCLUDE ',$offset)) !== false)\r
+ {\r
+ $y++;\r
+\r
+ $start = $begin+9;\r
+ $offset = $start;\r
+ $long = 0;\r
+\r
+ if($template[$start] == '"')\r
+ {\r
+ $long = 1;\r
+ $start++;\r
+ }\r
+\r
+ $file = '';\r
+ $skip = 0;\r
+\r
+ for($x=$start;$x<strlen($template);$x++)\r
+ {\r
+ if($template[$x] == "\012" || $template[$x] == "\015")\r
+ {\r
+ $skip = 1;\r
+ break;\r
+ }\r
+ elseif($long == 0 && $template[$x] == ' ')\r
+ {\r
+ $skip = 1;\r
+ break;\r
+ }\r
+ elseif($long == 1 && $template[$x] == '"')\r
+ {\r
+ if($template[$x+1] != '}') $skip = 1;\r
+ break;\r
+ }\r
+ elseif($long == 0 && $template[$x] == '}')\r
+ {\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ $file .= $template[$x];\r
+ }\r
+ }\r
+\r
+ if($skip == 1) continue;\r
+\r
+ if($file != '')\r
+ {\r
+ $filepath = $file;\r
+\r
+ $is_absolute = (strtoupper(substr(PHP_OS,0,3)) === 'WIN')\r
+ ? preg_match('!^([a-z]:)?/!i',$file)\r
+ : preg_match('!^/!',$file);\r
+\r
+ if(!$is_absolute)\r
+ {\r
+ if(!empty($this->file)) $dir = dirname($this->file);\r
+ else $dir = '.';\r
+\r
+ $dir = str_replace('\\','/',$dir);\r
+\r
+ if(!preg_match('!/+$!',$dir)) $dir .= '/';\r
+\r
+ $filepath = $dir.$file;\r
+ }\r
+\r
+ if(is_file($filepath))\r
+ {\r
+ $inc = new Template;\r
+ $inc->read_file($filepath);\r
+\r
+ $end = ($long == 1)\r
+ ? $start + strlen($file) + 2\r
+ : $start + strlen($file) + 1;\r
+\r
+ $pre = substr($template,0,$begin);\r
+ $post = substr($template,$end);\r
+\r
+ $template = $pre.$inc->get_template().$post;\r
+ $offset = strlen($pre)+strlen($inc->get_template());\r
+\r
+ unset($inc);\r
+ }\r
+ }\r
+ }\r
+\r
+ $this->set_template($template);\r
+ }\r
+}\r
+\r
+#\r
+### Ende ###\r
+\r
+?>
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+#\r
+# Form E-Mail 3.4.1 - config.php\r
+#\r
+# Konfiguration fuer Form E-Mail\r
+#\r
+# Autor: Patrick Canterino <patrick@patshaping.de>\r
+# Letzte Aenderung: 11.1.2009\r
+#\r
+# Copyright (C) 2002-2011 Patrick Canterino\r
+#\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# weitergegeben und / oder veraendert werden.\r
+# Siehe:\r
+# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+#\r
+\r
+# Empfaenger - wichtigste Einstellung\r
+\r
+$mailto = '';\r
+$aliases = array();\r
+\r
+# Allgemeines\r
+\r
+$default_subject = 'E-Mail geliefert von Form E-Mail';\r
+$friendly_sender = 2;\r
+$line_break = 0;\r
+$add_header = 1;\r
+$timeformat = '%d.%m.%Y um %H:%M:%S';\r
+$return_url = '';\r
+$no_tld = 0;\r
+$allowed_envs = array('HTTP_USER_AGENT','REMOTE_ADDR');\r
+$charset = 'iso-8859-1';\r
+$timezone = 'Europe/Berlin';\r
+\r
+# Laengenueberpruefung\r
+\r
+$name_min = 0;\r
+$subject_min = 0;\r
+$text_min = 0;\r
+\r
+$name_max = 0;\r
+$subject_max = 0;\r
+$text_max = 0;\r
+\r
+# Sicherheit\r
+\r
+$only_post = 0;\r
+$check_referer = 0;\r
+$referer_ok = '';\r
+\r
+# Captcha\r
+\r
+$captcha_enable = 0;\r
+$captcha_case = 1;\r
+$captcha_max = 0;\r
+$captcha_length = 6;\r
+$captcha_width = 120;\r
+$captcha_height = 40;\r
+$captcha_angle = array(-5,10);\r
+$captcha_x = array(5,30);\r
+$captcha_y = array(30,35);\r
+$captcha_possible = 'ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';\r
+$captcha_font = 'XFILES.TTF';\r
+$captcha_font_size = 15;\r
+$captcha_lines = 4;\r
+$captcha_color_bg = array(255,255,255);\r
+$captcha_color_text = array(0,0,0);\r
+$captcha_image_bg = '';\r
+\r
+# Fehlermeldungen\r
+\r
+$err_nothing = 'Es wurden keine Daten eingeben!';\r
+$err_no_name = 'Sie haben keinen Namen angegeben!';\r
+$err_no_email = 'Sie haben keine E-Mail-Adresse angegeben!';\r
+$err_invalid_email = 'Die von Ihnen eingegebene E-Mail-Adresse ist ungültig!';\r
+$err_no_text = 'Sie haben keinen Text für die E-Mail eingegeben!';\r
+\r
+$err_name_short = 'Der eingegebene Name ist zu kurz!';\r
+$err_subject_short = 'Der eingegebene Betreff ist zu kurz!';\r
+$err_text_short = 'Der eingegebene Text ist zu kurz!';\r
+\r
+$err_name_long = 'Der eingegebene Name ist zu lang!';\r
+$err_subject_long = 'Der eingegebene Betreff ist zu lang!';\r
+$err_text_long = 'Der eingegebene Text ist zu lang!';\r
+\r
+$err_send_error = 'Beim Versenden der Mail ist ein Fehler aufgetreten!';\r
+$err_only_post = 'Dieser Form-Mailer kann leider nur mit POST aufgerufen werden.';\r
+$err_referer_not_ok = 'Der im HTTP-Referer angegebene Host darf keine Mails versenden.';\r
+\r
+$err_captcha_incorrect = 'Der eingegebene Sicherheitscode ist nicht korrekt!';\r
+$err_captcha_max = 'Sie haben den Sicherheitscode zu oft falsch eingegeben!';\r
+$err_captcha_disabled = 'Captchas sind nicht aktiviert!';\r
+$err_captcha_session_failure = 'Keine gültige Session!';\r
+\r
+# Templates\r
+\r
+$tpl_mail = 'mail.txt';\r
+$tpl_sent = 'sent.htm';\r
+$tpl_user_error = 'user_error.htm';\r
+$tpl_fatal = 'fatal.htm';\r
+\r
+#\r
+### Ende ###\r
+\r
+?>
\ No newline at end of file
--- /dev/null
+<html>\r
+<head>\r
+<title>Fehler</title>\r
+</head>\r
+<body>\r
+\r
+<h1>Fehler</h1>\r
+\r
+<p>{ERROR}</p>\r
+</body>\r
+</html>
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+#\r
+# Form E-Mail 3.4.1 - functions.php\r
+#\r
+# Verschiedene gemeinsam genutze Funktionen\r
+#\r
+# Autor: Patrick Canterino <patrick@patshaping.de>\r
+# Letzte Aenderung: 11.1.2009\r
+#\r
+# Copyright (C) 2002-2011 Patrick Canterino\r
+#\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# weitergegeben und / oder veraendert werden.\r
+# Siehe:\r
+# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+#\r
+\r
+# formdata()\r
+#\r
+# Formulardaten bei deaktiviertem register_globals auslesen\r
+#\r
+# Parameter: Name des Formularfeldes\r
+#\r
+# Rueckgabe: Inhalt des Formularfeldes (String oder Array)\r
+#\r
+# Bemerkungen: - Wenn der HTTP-Zugriff nicht POST oder GET ist,\r
+# wird nichts zurueckgegeben.\r
+# - Codierende Backslashes werden automatisch entfernt\r
+\r
+function formdata($param)\r
+{\r
+ switch($_SERVER['REQUEST_METHOD'])\r
+ {\r
+ case 'GET':\r
+ if(isset($_GET[$param]))\r
+ {\r
+ $value = $_GET[$param];\r
+ break;\r
+ }\r
+ else return null;\r
+\r
+ case 'POST':\r
+ if(isset($_POST[$param]))\r
+ {\r
+ $value = $_POST[$param];\r
+ break;\r
+ }\r
+ else return null;\r
+\r
+ default:\r
+ return null;\r
+ }\r
+\r
+ if(get_magic_quotes_gpc())\r
+ {\r
+ if(is_array($value)) return array_map('stripslashes',$value);\r
+ else return stripslashes($value);\r
+ }\r
+ else return $value;\r
+}\r
+\r
+# plain()\r
+#\r
+# Text fuer HTML-Ausgabe vorbereiten (Entities,\r
+# Zeilenumbrueche, Leerzeichen)\r
+#\r
+# Parameter: 1. Text\r
+# 2. Zeilenumbruchskennung (Standard = <br>)\r
+#\r
+# Rueckgabe: Bearbeiteter Text (String)\r
+\r
+function &plain(&$text,$linebreak='<br>')\r
+{\r
+ $htmltext = htmlentities($text);\r
+ $htmltext = preg_replace("/\015\012|\012|\015/",$linebreak,$htmltext);\r
+\r
+ for($x=0;$x<strlen($htmltext);$x++)\r
+ {\r
+ if($htmltext[$x] == ' ' && $htmltext[$x+1] == ' ') $htmltext[$x] = "\240";\r
+ }\r
+\r
+ $htmltext = str_replace("\240",' ',$htmltext);\r
+ $htmltext = str_replace($linebreak.' ',$linebreak.' ',$htmltext);\r
+\r
+ return $htmltext;\r
+}\r
+\r
+# semicolon_split()\r
+#\r
+# Durch Semikola getrennte Werte aufteilen und Leerzeichen\r
+# an Anfang und Ende der Werte entfernen\r
+#\r
+# Parameter: Zeichenkette\r
+#\r
+# Rueckgabe: Aufgeteilte Zeichenkette (Array)\r
+\r
+function semicolon_split($string)\r
+{\r
+ $parts = explode(';',$string);\r
+ $parts = array_map('trim',$parts);\r
+\r
+ return $parts;\r
+}\r
+\r
+# show_fatal()\r
+#\r
+# Fehlermeldung anzeigen (Benutzer kann den Fehler\r
+# nicht korrigieren)\r
+#\r
+# Parameter: Fehlermeldung\r
+\r
+function show_fatal(&$errmsg)\r
+{\r
+ global $tpl_fatal;\r
+\r
+ $tpl = new Template;\r
+ $tpl->read_file($tpl_fatal);\r
+\r
+ $tpl->fillin('ERROR',$errmsg);\r
+\r
+ print $tpl->get_template();\r
+ exit;\r
+}\r
+\r
+# show_user_error()\r
+#\r
+# Fehlermeldung anzeigen (Benutzer kann den Fehler\r
+# aber noch korrigieren)\r
+#\r
+# Parameter: Fehlermeldung\r
+\r
+function show_user_error(&$errmsg)\r
+{\r
+ global $captcha_enable, $email, $name, $subject, $text, $tpl_user_error;\r
+\r
+ $tpl = new Template;\r
+ $tpl->read_file($tpl_user_error);\r
+\r
+ $tpl->parse_if_block('CAPTCHA',$captcha_enable);\r
+ \r
+ $tpl->set_var('EMAIL', htmlentities($email));\r
+ $tpl->set_var('ERROR', $errmsg);\r
+ $tpl->set_var('NAME', htmlentities($name));\r
+ $tpl->set_var('SUBJECT',htmlentities($subject));\r
+ $tpl->set_var('TEXT', htmlentities($text));\r
+\r
+ $tpl->parse();\r
+\r
+ print $tpl->get_template();\r
+ exit;\r
+}\r
+\r
+#\r
+### Ende ###\r
+\r
+?>
\ No newline at end of file
--- /dev/null
+{NAME} ({EMAIL}) schrieb am {TIME}:\r
+\r
+{TEXT}
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+#\r
+# Form E-Mail 3.4.1\r
+#\r
+# Versenden einer E-Mail, die ueber ein Kontaktformular\r
+# geschrieben wurde.\r
+#\r
+# Autor: Patrick Canterino <patrick@patshaping.de>\r
+# Letzte Aenderung: 24.2.2011\r
+#\r
+# Copyright (C) 2002-2011 Patrick Canterino\r
+#\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 1.0"\r
+# weitergegeben und / oder veraendert werden.\r
+# Siehe:\r
+# http://www.opensource.org/licenses/artistic-license-1.0.php\r
+#\r
+\r
+# ===========\r
+# Hauptteil\r
+# ===========\r
+\r
+require('config.php');\r
+require('functions.php');\r
+require('class.Template.php');\r
+\r
+if($only_post && $_SERVER['REQUEST_METHOD'] != 'POST') show_fatal($err_only_post);\r
+\r
+# Wenn Captchas aktiviert sind, Session starten\r
+\r
+if($captcha_enable)\r
+{\r
+ session_start();\r
+\r
+ # Pruefen, ob die zulaessige Zahl der Falscheingaben bei Captchas ueberschritten wurde\r
+\r
+ if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max)\r
+ {\r
+ show_fatal($err_captcha_max);\r
+ }\r
+}\r
+\r
+# Bestimmte Werte in Integers umwandeln\r
+\r
+$name_min = intval($name_min);\r
+$subject_min = intval($subject_min);\r
+$text_min = intval($text_min);\r
+$name_max = intval($name_max);\r
+$subject_max = intval($subject_max);\r
+$text_max = intval($text_max);\r
+$line_break = intval($line_break);\r
+\r
+# Formulardaten auslesen\r
+\r
+$email = formdata('email');\r
+$name = formdata('name');\r
+$recipient = formdata('recipient');\r
+$subject = formdata('subject');\r
+$text = formdata('text');\r
+\r
+# Pruefen, ob ueberhaupt was ausgefuellt wurde\r
+\r
+if(!$name && !$email && !$text) show_user_error($err_nothing);\r
+\r
+# Pruefen, ob alle wichtigen Formular-Felder ausgefuellt wurden\r
+\r
+if(!$name) show_user_error($err_no_name);\r
+if(!$email) show_user_error($err_no_email);\r
+if(!$text) show_user_error($err_no_text);\r
+\r
+if(!$subject) $subject = $default_subject; # Standard-Betreff\r
+\r
+# Pruefen, ob Name, Betreff und Text lang genug sind\r
+\r
+if($name_min && strlen($name) < $name_min) show_user_error($err_name_short);\r
+if($subject_min && strlen($subject) < $subject_min) show_user_error($err_subject_short);\r
+if($text_min && strlen($text) < $text_min) show_user_error($err_text_short);\r
+\r
+# Pruefen, ob Name, Betreff und Text nicht zu lang sind\r
+\r
+if($name_max && strlen($name) > $name_max) show_user_error($err_name_long);\r
+if($subject_max && strlen($subject) > $subject_max) show_user_error($err_subject_long);\r
+if($text_max && strlen($text) > $text_max) show_user_error($err_text_long);\r
+\r
+# Pruefen, ob eingegebene E-Mail-Adresse gueltig ist\r
+# Danke an "ich" aus dem SELFHTML Forum fuer die Muehe\r
+\r
+$mail_regexp = ($no_tld)\r
+ ? '/^([a-z0-9]+([\.]?|[-]?|[_]?)?)*([a-z0-9]+([\.]?[_]?)?)@([a-z0-9]+([\.]?|[-]?)?)*[a-z0-9]$/i'\r
+ : '/^([a-z0-9]+([\.]?|[-]?|[_]?)?)*([a-z0-9]+([\.]?[_]?)?)@([a-z0-9]+([\.]?|[-]?)?)*[a-z0-9]+\.{1}[a-z]{2,6}$/i';\r
+\r
+if(!preg_match($mail_regexp,$email)) show_user_error($err_invalid_email);\r
+\r
+# Captcha ueberpruefen\r
+\r
+if($captcha_enable)\r
+{\r
+ $captcha_input = formdata('captcha');\r
+ $captcha_incorrect = false;\r
+\r
+ if(isset($_SESSION) && isset($_SESSION['captcha']))\r
+ {\r
+ if($captcha_case)\r
+ {\r
+ if(!$captcha_input || empty($captcha_input) || $captcha_input != $_SESSION['captcha']) $captcha_incorrect = true;\r
+ }\r
+ else\r
+ {\r
+ if(!$captcha_input || empty($captcha_input) || strtolower($captcha_input) != strtolower($_SESSION['captcha'])) $captcha_incorrect = true;\r
+ }\r
+ \r
+ if($captcha_incorrect)\r
+ {\r
+ if($captcha_max)\r
+ {\r
+ if(isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'])\r
+ {\r
+ $_SESSION['captcha_failed']++;\r
+ }\r
+ else\r
+ {\r
+ $_SESSION['captcha_failed'] = 1;\r
+ }\r
+ }\r
+\r
+ if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max)\r
+ {\r
+ show_fatal($err_captcha_max);\r
+ }\r
+ else\r
+ { \r
+ show_user_error($err_captcha_incorrect);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ show_fatal($err_captcha_session_failure);\r
+ }\r
+}\r
+\r
+# Referer ueberpruefen\r
+\r
+if($check_referer)\r
+{\r
+ $referer_ok = semicolon_split($referer_ok);\r
+\r
+ $referer_parts = parse_url($_SERVER['HTTP_REFERER']);\r
+ $referer_host = $referer_parts['host'];\r
+\r
+ if(in_array($referer_host,$referer_ok) === false) show_fatal($err_referer_not_ok);\r
+}\r
+\r
+# Zeilenumbrueche in Namen und Betreff durch Leerzeichen ersetzen\r
+\r
+$name = preg_replace("/\015\012|\012|\015/",' ',$name);\r
+$subject = preg_replace("/\015\012|\012|\015/",' ',$subject);\r
+\r
+# Uhrzeit formatieren\r
+\r
+date_default_timezone_set($timezone);\r
+$time = strftime($timeformat);\r
+\r
+# Header der Mail\r
+\r
+$header = '';\r
+\r
+if($friendly_sender)\r
+{\r
+ if($friendly_sender == 2)\r
+ {\r
+ if(preg_match("/[\200-\377]/",$name))\r
+ {\r
+ # Absendernamen mit Base64 codieren\r
+\r
+ $encoded_name = base64_encode($name);\r
+ $encoded_name = wordwrap($encoded_name,56,"\015\012",1);\r
+ $encoded_name = "=?$charset?B?$encoded_name?=";\r
+ $encoded_name = str_replace("\015\012","?=\015\012 =?$charset?B?",$encoded_name);\r
+ }\r
+ else\r
+ {\r
+ # Bestimmte Zeichen im Absendernamen codieren\r
+\r
+ $encoded_name = str_replace('"','\"',$name);\r
+ $encoded_name = str_replace('(','\\(',$encoded_name);\r
+ $encoded_name = str_replace(')','\\)',$encoded_name);\r
+ $encoded_name = '"'.$encoded_name.'"';\r
+ }\r
+\r
+ $header = "From: $encoded_name <$email>\n";\r
+ }\r
+ else $header = "From: $email\n";\r
+}\r
+\r
+if($add_header)\r
+{\r
+ if(!$friendly_sender) $header .= "Reply-To: $email\n";\r
+ $header .= 'Content-Type: text/plain; charset="'.$charset.'"'."\n";\r
+ $header .= 'Content-Transfer-Encoding: 8bit'."\n";\r
+ $header .= 'MIME-Version: 1.0'."\n";\r
+ $header .= 'X-Mailer: Form E-Mail 3.4.1'."\n";\r
+ $header .= 'X-Sender-IP: ['.$_SERVER['REMOTE_ADDR'].']';\r
+}\r
+else $header .= "Reply-To: $email";\r
+\r
+$header = preg_replace("/\015\012|\012|\015/","\n",$header);\r
+\r
+# Betreff mit Base64 codieren, wenn er Zeichen enthaelt,\r
+# die nicht aus dem ASCII-Zeichensatz stammen\r
+\r
+if(preg_match("/[\200-\377]/",$subject))\r
+{\r
+ $encoded_subject = base64_encode($subject);\r
+ $encoded_subject = wordwrap($encoded_subject,56,"\015\012",1);\r
+ $encoded_subject = "=?$charset?B?$encoded_subject?=";\r
+ $encoded_subject = str_replace("\015\012","?=\015\012 =?$charset?B?",$encoded_subject);\r
+}\r
+else $encoded_subject = $subject;\r
+\r
+# Mailtext formatieren...\r
+\r
+$mtpl = new Template;\r
+$mtpl->read_file($tpl_mail);\r
+\r
+$mtpl->set_var('EMAIL', $email);\r
+$mtpl->set_var('NAME', $name);\r
+$mtpl->set_var('SUBJECT',$subject);\r
+$mtpl->set_var('TIME', $time);\r
+\r
+# ... Umgebungsvariablen einfuegen\r
+\r
+if(isset($allowed_envs) && is_array($allowed_envs))\r
+{\r
+ foreach($allowed_envs as $allowed_env)\r
+ {\r
+ if(isset($_SERVER[$allowed_env]))\r
+ {\r
+ $mtpl->set_var('ENV_'.$allowed_env,$_SERVER[$allowed_env]);\r
+ }\r
+ else\r
+ {\r
+ $mtpl->set_var('ENV_'.$allowed_env,'');\r
+ }\r
+ }\r
+}\r
+\r
+$mtpl->set_var('TEXT',$text);\r
+\r
+$mtpl->parse();\r
+\r
+$mailtext = $mtpl->get_template();\r
+\r
+if($line_break) $mailtext = wordwrap($mailtext,$line_break);\r
+\r
+$mailtext = preg_replace("/\015\012|\012|\015/","\n",$mailtext);\r
+\r
+# ... und die Mail abschicken (bei einem Fehler erscheint eine Meldung)\r
+\r
+if($recipient && is_array($aliases) && $aliases[$recipient])\r
+{\r
+ # Empfaenger mit Alias-Namen\r
+\r
+ $mailto = $aliases[$recipient];\r
+}\r
+\r
+$mailto = semicolon_split($mailto);\r
+\r
+for($x=0;$x<count($mailto);$x++)\r
+{\r
+ mail($mailto[$x],$encoded_subject,$mailtext,$header) or die($err_send_error);\r
+}\r
+\r
+if($captcha_enable) session_destroy();\r
+\r
+# Mail wurde erfolgreich versendet, also wird die Dankesseite angezeigt\r
+\r
+if($return_url)\r
+{\r
+ # Per Redirect auf Seite umleiten\r
+\r
+ if(!preg_match('!://!',$return_url))\r
+ {\r
+ # URL vervollstaendigen\r
+\r
+ $http_host = ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];\r
+ $protocol = '';\r
+ $port = '';\r
+\r
+ if($_SERVER['HTTPS'])\r
+ {\r
+ # SSL-verschluesseltes HTTP\r
+\r
+ $protocol = 'https://';\r
+ if($_SERVER['SERVER_PORT'] != 443) $port = ':'.$_SERVER['SERVER_PORT'];\r
+ }\r
+ else\r
+ {\r
+ # Normales HTTP\r
+\r
+ $protocol = 'http://';\r
+ if($_SERVER['SERVER_PORT'] != 80) $port = ':'.$_SERVER['SERVER_PORT'];\r
+ }\r
+\r
+ if(preg_match('!^/!',$return_url))\r
+ {\r
+ $return_url = $protocol.$http_host.$port.$return_url;\r
+ }\r
+ else\r
+ {\r
+ if(preg_match('!/$!',$_SERVER['SCRIPT_NAME'])) $path = substr($_SERVER['SCRIPT_NAME'],0,-1);\r
+ $path = substr($path,0,strrpos($path,'/')+1);\r
+ if(!preg_match('!^/!',$path)) $path = '/'.$path;\r
+\r
+ $return_url = $protocol.$http_host.$port.$path.$return_url;\r
+ }\r
+ }\r
+\r
+ header('Status: 303 See Other');\r
+ header('Location: '.$return_url);\r
+}\r
+else\r
+{\r
+ # Mit Template formatierte Seite anzeigen\r
+\r
+ $stpl = new Template;\r
+ $stpl->read_file($tpl_sent);\r
+\r
+ $stpl->set_var('EMAIL', plain($email));\r
+ $stpl->set_var('MAIL', plain($mailtext));\r
+ $stpl->set_var('NAME', plain($name));\r
+ $stpl->set_var('SUBJECT',plain($subject));\r
+ $stpl->set_var('TEXT', plain($text));\r
+ $stpl->set_var('TIME', plain($time));\r
+\r
+ $stpl->parse();\r
+\r
+ print $stpl->get_template();\r
+}\r
+\r
+#\r
+### Ende ###\r
+\r
+?>
\ No newline at end of file
--- /dev/null
+<html>\r
+<head>\r
+<title></title>\r
+</head>\r
+<body>\r
+<p>Die Mail wurde erfolgreich versendet.</p>\r
+\r
+<p><tt>{MAIL}</tt></p>\r
+</body>\r
+</html>
\ No newline at end of file
--- /dev/null
+<html>\r
+<head>\r
+<title>Fehler</title>\r
+</head>\r
+<body>\r
+\r
+<h1>Fehler</h1>\r
+\r
+<p>{ERROR}</p>\r
+\r
+<form action="mailer.php" method="post">\r
+<p>Dein Name:<br>\r
+<input type="text" name="name" value="{NAME}"></p>\r
+<p>Deine E-Mail-Adresse:<br>\r
+<input type="text" name="email" value="{EMAIL}"></p>\r
+<p>Betreff für die Mail:<br>\r
+<input type="subject" name="subject" value="{SUBJECT}"></p>\r
+<p>Dein Kommentar:<br>\r
+<textarea name="text" rows="20" cols="50">\r
+{TEXT}</textarea></p>\r
+<input type="submit" value="Los!">\r
+<input type="reset" value="Zurücksetzen">\r
+</form>\r
+</body>\r
+</html>
\ No newline at end of file
--- /dev/null
+<html>\r
+<head>\r
+<title></title>\r
+</head>\r
+<body>\r
+\r
+<form action="mailer.php" method="post">\r
+<p>Dein Name:<br>\r
+<!-- In diesem Feld kann der Absender seinen Namen angeben -->\r
+<input type="text" name="name"></p>\r
+<!-- In diesem Feld kann der Absender seine E-Mail-Adresse angeben -->\r
+<p>Deine E-Mail-Adresse:<br>\r
+<input type="text" name="email"></p>\r
+<!-- In diesem Feld kann der Absender einen Betreff angeben -->\r
+<p>Betreff für die Mail:<br>\r
+<input type="subject" name="subject"></p>\r
+<!-- In diesem Feld kann der Absender den Text der Mail angeben -->\r
+<p>Dein Kommentar:<br>\r
+<textarea name="text" rows="20" cols="50">\r
+</textarea></p>\r
+<!-- Wenn Sie die Captcha-Funktion nutzen moechten: -->\r
+<p>Sicherheitscode eingeben: <input type="text" name="captcha"><img src="captcha.php"></p>\r
+<!-- Buttons zum Absenden und Zuruecksetzen -->\r
+<input type="submit" value="Los!">\r
+<input type="reset" value="Zurücksetzen">\r
+</form>\r
+</body>\r
+</html>
\ No newline at end of file
--- /dev/null
+ The "Artistic License"\r
+\r
+ Preamble\r
+\r
+The intent of this document is to state the conditions under which a\r
+Package may be copied, such that the Copyright Holder maintains some\r
+semblance of artistic control over the development of the package,\r
+while giving the users of the package the right to use and distribute\r
+the Package in a more-or-less customary fashion, plus the right to make\r
+reasonable modifications.\r
+\r
+Definitions:\r
+\r
+ "Package" refers to the collection of files distributed by the\r
+ Copyright Holder, and derivatives of that collection of files\r
+ created through textual modification.\r
+\r
+ "Standard Version" refers to such a Package if it has not been\r
+ modified, or has been modified in accordance with the wishes\r
+ of the Copyright Holder as specified below.\r
+\r
+ "Copyright Holder" is whoever is named in the copyright or\r
+ copyrights for the package.\r
+\r
+ "You" is you, if you're thinking about copying or distributing\r
+ this Package.\r
+\r
+ "Reasonable copying fee" is whatever you can justify on the\r
+ basis of media cost, duplication charges, time of people involved,\r
+ and so on. (You will not be required to justify it to the\r
+ Copyright Holder, but only to the computing community at large\r
+ as a market that must bear the fee.)\r
+\r
+ "Freely Available" means that no fee is charged for the item\r
+ itself, though there may be fees involved in handling the item.\r
+ It also means that recipients of the item may redistribute it\r
+ under the same conditions they received it.\r
+\r
+1. You may make and give away verbatim copies of the source form of the\r
+Standard Version of this Package without restriction, provided that you\r
+duplicate all of the original copyright notices and associated disclaimers.\r
+\r
+2. You may apply bug fixes, portability fixes and other modifications\r
+derived from the Public Domain or from the Copyright Holder. A Package\r
+modified in such a way shall still be considered the Standard Version.\r
+\r
+3. You may otherwise modify your copy of this Package in any way, provided\r
+that you insert a prominent notice in each changed file stating how and\r
+when you changed that file, and provided that you do at least ONE of the\r
+following:\r
+\r
+ a) place your modifications in the Public Domain or otherwise make them\r
+ Freely Available, such as by posting said modifications to Usenet or\r
+ an equivalent medium, or placing the modifications on a major archive\r
+ site such as uunet.uu.net, or by allowing the Copyright Holder to include\r
+ your modifications in the Standard Version of the Package.\r
+\r
+ b) use the modified Package only within your corporation or organization.\r
+\r
+ c) rename any non-standard executables so the names do not conflict\r
+ with standard executables, which must also be provided, and provide\r
+ a separate manual page for each non-standard executable that clearly\r
+ documents how it differs from the Standard Version.\r
+\r
+ d) make other distribution arrangements with the Copyright Holder.\r
+\r
+4. You may distribute the programs of this Package in object code or\r
+executable form, provided that you do at least ONE of the following:\r
+\r
+ a) distribute a Standard Version of the executables and library files,\r
+ together with instructions (in the manual page or equivalent) on where\r
+ to get the Standard Version.\r
+\r
+ b) accompany the distribution with the machine-readable source of\r
+ the Package with your modifications.\r
+\r
+ c) give non-standard executables non-standard names, and clearly\r
+ document the differences in manual pages (or equivalent), together\r
+ with instructions on where to get the Standard Version.\r
+\r
+ d) make other distribution arrangements with the Copyright Holder.\r
+\r
+5. You may charge a reasonable copying fee for any distribution of this\r
+Package. You may charge any fee you choose for support of this\r
+Package. You may not charge a fee for this Package itself. However,\r
+you may distribute this Package in aggregate with other (possibly\r
+commercial) programs as part of a larger (possibly commercial) software\r
+distribution provided that you do not advertise this Package as a\r
+product of your own. You may embed this Package's interpreter within\r
+an executable of yours (by linking); this shall be construed as a mere\r
+form of aggregation, provided that the complete Standard Version of the\r
+interpreter is so embedded.\r
+\r
+6. The scripts and library files supplied as input to or produced as\r
+output from the programs of this Package do not automatically fall\r
+under the copyright of this Package, but belong to whoever generated\r
+them, and may be sold commercially, and may be aggregated with this\r
+Package. If such scripts or library files are aggregated with this\r
+Package via the so-called "undump" or "unexec" methods of producing a\r
+binary executable image, then distribution of such an image shall\r
+neither be construed as a distribution of this Package nor shall it\r
+fall under the restrictions of Paragraphs 3 and 4, provided that you do\r
+not represent such an executable image as a Standard Version of this\r
+Package.\r
+\r
+7. C subroutines (or comparably compiled subroutines in other\r
+languages) supplied by you and linked into this Package in order to\r
+emulate subroutines and variables of the language defined by this\r
+Package shall not be considered part of this Package, but are the\r
+equivalent of input as in Paragraph 6, provided these subroutines do\r
+not change the language in any way that would cause it to fail the\r
+regression tests for the language.\r
+\r
+8. Aggregation of this Package with a commercial distribution is always\r
+permitted provided that the use of this Package is embedded; that is,\r
+when no overt attempt is made to make this Package's interfaces visible\r
+to the end user of the commercial distribution. Such use shall not be\r
+construed as a distribution of this Package.\r
+\r
+9. The name of the Copyright Holder may not be used to endorse or promote\r
+products derived from this software without specific prior written permission.\r
+\r
+10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR\r
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\r
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+\r
+ The End
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="iso-8859-1" ?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\r
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+<title>ReadMe für Form E-Mail 3.4.1</title>\r
+<meta name="author" content="Patrick Canterino" />\r
+<style type="text/css">\r
+<!--\r
+.upanddown\r
+{\r
+ font-size: 8pt;\r
+ background-color: #E8E8E8;\r
+ padding: 3px;\r
+ margin-left: 0.5cm;\r
+ margin-right: 0.5cm;\r
+ white-space: nowrap;\r
+}\r
+a:link, a:visited, a:active, a:focus\r
+{\r
+ font-weight: normal;\r
+ text-decoration: none;\r
+ color: #0000FF;\r
+ cursor: hand;\r
+}\r
+a:link:hover, a:visited:hover, a:active:hover, a:focus:hover\r
+{\r
+ font-weight: normal;\r
+ text-decoration: underline;\r
+ color: #0000FF;\r
+ cursor: hand;\r
+}\r
+body\r
+{\r
+ font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;\r
+ font-size: 10pt;\r
+ color: #000000;\r
+ background-color: #FFFFFF;\r
+}\r
+code\r
+{\r
+ font-family: 'Courier New', Courier, monospace;\r
+ font-size: 10pt;\r
+ color: #0000B0;\r
+}\r
+h1\r
+{\r
+ font-size: 18pt;\r
+ font-weight: bold;\r
+}\r
+h2\r
+{\r
+ font-size: 13pt;\r
+ font-weight: bold;\r
+ padding-left: 0.2cm;\r
+ padding-right: 0.2cm;\r
+}\r
+li\r
+{\r
+ margin-top: 3px;\r
+}\r
+p\r
+{\r
+ padding-left: 0.5cm;\r
+ padding-right: 0.5cm;\r
+}\r
+table\r
+{\r
+ font-size: 10pt;\r
+ margin-left: 0.5cm;\r
+ margin-right: 0.5cm;\r
+}\r
+td\r
+{\r
+ vertical-align: top;\r
+}\r
+ul\r
+{\r
+ padding-left: 0.5cm;\r
+ padding-right: 0.5cm;\r
+ margin-left: 1cm;\r
+}\r
+-->\r
+</style>\r
+<base target="_self" />\r
+</head>\r
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#0000FF" alink="#0000FF">\r
+\r
+<h1><a name="top" id="top">ReadMe für Form E-Mail 3.4.1</a></h1>\r
+\r
+<p>\r
+<a href="#wasistfeml">Was ist <i>Form E-Mail</i>?</a><br />\r
+<a href="#einrichten">Einrichten von <i>Form E-Mail</i></a><br />\r
+<a href="#einstellungen">Einstellungen</a><br />\r
+<a href="#templates">Templates anpassen</a>\r
+</p>\r
+\r
+<h2><a name="wasistfeml" id="wasistfeml">Was ist <i>Form E-Mail</i>?</a></h2>\r
+\r
+<p><i>Form E-Mail</i> ist ein in PHP programmierter Form-Mailer, der speziell darauf ausgerichtet ist, ein Kontaktformular zu verarbeiten. Unter Kontaktformular verstehe ich ein Formular mit Feldern für Name und E-Mail-Adresse des Absenders, eines für den Betreff und ein weiteres für den Text der Mail.<br />\r
+Auf diese Weise müssen Sie zum Beispiel nicht überall auf Ihrer Homepage Ihre E-Mail-Adresse angeben und sie so nicht der Gefahr aussetzen, ein Opfer von Spammern zu werden.</p>\r
+\r
+<p class="upanddown"><a href="#top">Nach oben</a></p>\r
+\r
+<h2><a name="einrichten" id="einrichten">Einrichten von <i>Form E-Mail</i></a></h2>\r
+\r
+<p>Sie brauchen als erstes ein HTML-Formular. Dieses muss mindestens diese Felder enthalten:</p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Feldname</b></td>\r
+<td><b>Zweck</b></td>\r
+</tr>\r
+<tr>\r
+<td><i>email</i></td>\r
+<td>E-Mail-Adresse des Absenders</td>\r
+</tr>\r
+<tr>\r
+<td><i>name</i></td>\r
+<td>Name des Absenders</td>\r
+</tr>\r
+<tr>\r
+<td><i>text</i></td>\r
+<td>Text der E-Mail</td>\r
+</tr>\r
+</table>\r
+\r
+<p>Sie können außerdem noch ein Feld namens <i>subject</i> anlegen. Hier kann ein Betreff für die Mail eingegeben werden. Wenn Sie auf dieses Feld verzichten, erhalten die E-Mails automatisch den in <code>$default_subject</code> definierten Betreff (s.u.).<br />\r
+Weiterhin ist noch ein Feld namens <i>recipient</i> möglich. Dieses Feld enthält einen Alias-Empfänger. Wie das funktioniert, können Sie bei der Beschreibung der Einstellung <code>$aliases</code> lesen.</p>\r
+\r
+<p>Wenn Sie Captchas (zufällige Zeichenfolgen, die der Benutzer vor dem Absenden des Formulars eingeben muss, um Spambots auszuschließen) benutzen wollen (siehe unten), müssen Sie im Formular die Datei <i>captcha.php</i> als Bild einbinden (<code><img></code>-Tag). Bedenken Sie, dass Sie diese Datei auch in den <a href="#templates">Templates</a> einbinden müssen!</p>\r
+\r
+<p>Das Formular muss noch die Daten an die Datei <i>mailer.php</i> (oder wie Sie die Datei genannt haben) senden. Ob Sie dafür <tt>GET</tt> oder <tt>POST</tt> verwenden, ist egal (es sei denn, Sie haben <i>Form E-Mail</i> so eingestellt, dass es nur <tt>POST</tt> erlaubt).</p>\r
+\r
+<p>Ein beispielhaftes Formular finden Sie in der Datei <a href="formular.htm" target="_blank"><i>formular.htm</i></a>.</p>\r
+\r
+<p>Die Adresse, an der die mit <i>Form E-Mail</i> erzeugte Mail gesendet werden soll, wird in der Datei <i>config.php</i> festgelegt. Öffnen Sie die Datei mit einem beliebigen Editor und suchen Sie nach dieser Zeile:</p>\r
+\r
+<p><code>$mailto = '';</code></p>\r
+\r
+<p>Geben Sie zwischen den einfachen Anführungszeichen die Adresse an, an die die Mail gehen soll. Wenn die Mail an mehrere Empfänger gehen soll, so trennen Sie die einzelnen E-Mail-Adressen ganz einfach durch Semikolons.</p>\r
+\r
+<p>Das war es im Grunde genommen. Aber <i>Form E-Mail</i> lässt sich noch weiter konfigurieren. Mehr dazu finden Sie in den nächsten beiden Abschnitten.</p>\r
+\r
+<p class="upanddown"><a href="#top">Nach oben</a></p>\r
+\r
+<h2><a name="einstellungen" id="einstellungen">Einstellungen</a></h2>\r
+\r
+<p><b>Empfänger</b></p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Einstellung</b></td>\r
+<td><b>Beschreibung</b></td>\r
+</tr>\r
+<tr>\r
+<td><code>$mailto</code></td>\r
+<td>siehe oben</td>\r
+</tr>\r
+<tr>\r
+<td><code>$aliases</code></td>\r
+<td>Hier können Sie eine Alias-Namen für Empfänger angeben. Soll einem Alias mehrere Empfänger zugeordnet werden, gilt dasselbe wie für <code>$mailto</code>.<br />\r
+Die Aliase werden mit Hilfe eines assoziativen PHP-Arrays definiert. Da es wohl einige gibt, die von so etwas keine Ahnung haben und ich es nicht gut erklären kann, hier ein Beispiel:<br /><br />\r
+<code>array('info' => 'info@IhreDomain.xyz', 'support' => 'support@IhreDomain.xyz',<br />\r
+ 'alle' => 'info@IhreDomain.xyz; support@IhreDomain.xyz')</code></td>\r
+</tr>\r
+</table>\r
+\r
+<p><b>Allgemeines</b></p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Einstellung</b></td>\r
+<td><b>Beschreibung</b></td>\r
+</tr>\r
+<tr>\r
+<td><code>$default_subject</code></td>\r
+<td>Der Standard-Betreff. Dieser wird verwendet, wenn der Benutzer keinen Betreff für seine Mail angegeben hat.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$friendly_sender</code></td>\r
+<td>Wenn 1, wird die E-Mail-Adresse des Autors der Mail als Absender angegeben. Bei 0 erscheint das, was der Server als Absender einträgt. Wenn 2, wird zusätzlich noch der Name als Absender angegeben.<br />\r
+Bitte setzen Sie diese Option nur auf 0, wenn es wirklich sein muss!</td>\r
+</tr>\r
+<tr>\r
+<td><code>$line_break</code></td>\r
+<td>Legt fest, ab wievielen Zeichen ein automatischer Zeilenumbruch durchgeführt werden soll (0 für keine Zeilenumbrüche).</td>\r
+</tr>\r
+<tr>\r
+<td><code>$add_header</code></td>\r
+<td>Legt beim Wert 1 fest, ob <i>Form E-Mail</i> Informationen zur Zeichencodierung, MIME-Version usw. in den Mail-Header schreiben soll.<br />\r
+Bitte setzen Sie diese Option nur auf 0, wenn es wirklich sein muss!</td>\r
+</tr>\r
+<tr>\r
+<td><code>$timeformat</code></td>\r
+<td>Legt das Aussehen der Zeitangaben der Mail fest. Was hier alles möglich ist, finden Sie im PHP-Handbuch bei der <a href="http://www.php.net/manual/de/function.strftime.php">Beschreibung zu <code>strftime()</code></a>.<br />\r
+Beachten Sie bitte, dass bei neueren PHP-Versionen, trotz deutscher Spracheinstellungen, die Namen von Wochentagen und Monaten englisch dargestellt werden. Es handelt sich hierbei aber um ein allgemeines Problem.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$return_url</code></td>\r
+<td>Geben Sie hier die URL einer Seite an, auf die nach dem erfolgreichen Versenden einer Mail weitergeleitet werden soll. Wenn Sie hier nichts angeben, wird eine per Template formatierte Seite angezeigt.<br />\r
+<b style="color:#FF0000">Achtung:</b> Benutzen Sie hier nach Möglichkeit absolute URLs! Ich habe zwar etwas eingebaut, was hier relative URLs in absolute umwandelt, um dem HTTP-Standard gerecht zu werden, aber ich garantiere nicht, dass diese Umwandlung immer einwandfrei funktioniert. Seien Sie bei relativen URLs also sehr vorsichtig und verwenden Sie im Fehlerfall absolute.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$no_tld</code></td>\r
+<td>Setzen Sie diese Option auf 1, wenn der Absender auch E-Mail-Adressen ohne Top-Level-Domain angeben darf.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$allowed_envs</code></td>\r
+<td>Geben Sie hier die Server-Umgebungsvariablen, die im Mailtext angezeigt werden dürfen, als normales PHP-Array an (siehe auch die Erläuterungen zur Template-Datei <i>mail.txt</i>).<br />\r
+Beispiel: <code>array('HTTP_USER_AGENT','REMOTE_ADDR')</code></td>\r
+</tr>\r
+<tr>\r
+<td><code>$charset</code></td>\r
+<td>Geben Sie hier den Zeichensatz, der für die E-Mail verwendet werden soll, an.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$timezone</code></td>\r
+<td>Geben Sie hier Ihre Zeitzone an (dies ist bei neueren PHP-Versionen nötig, da ansonsten eine Fehlermeldung auftreten kann).</td>\r
+</tr>\r
+</table>\r
+\r
+<p><b>Längenüberprüfungen</b></p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Einstellung</b></td>\r
+<td><b>Beschreibung</b></td>\r
+</tr>\r
+<tr>\r
+<td><code>$name_min</code></td>\r
+<td>Geben Sie hier an, wie lang der vom Benutzer eingebene Name mindestens sein muss (0 = beliebig lang)</td>\r
+</tr>\r
+<tr>\r
+<td><code>$subject_min</code></td>\r
+<td>Geben Sie hier an, wie lang der vom Benutzer eingebene Betreff mindestens sein muss (0 = beliebig lang)</td>\r
+</tr>\r
+<tr>\r
+<td><code>$text_min</code></td>\r
+<td>Geben Sie hier an, wie lang der vom Benutzer eingebene Text mindestens sein muss (0 = beliebig lang)</td>\r
+</tr>\r
+<tr>\r
+<td><code>$name_max</code></td>\r
+<td>Geben Sie hier an, wie lang der vom Benutzer eingebene Name höchstens sein darf (0 = beliebig lang)</td>\r
+</tr>\r
+<tr>\r
+<td><code>$subject_max</code></td>\r
+<td>Geben Sie hier an, wie lang der vom Benutzer eingebene Betreff höchstens sein darf (0 = beliebig lang)</td>\r
+</tr>\r
+<tr>\r
+<td><code>$text_max</code></td>\r
+<td>Geben Sie hier an, wie lang der vom Benutzer eingebene Text höchstens sein darf (0 = beliebig lang)</td>\r
+</tr>\r
+</table>\r
+\r
+<p><b>Sicherheit</b></p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Einstellung</b></td>\r
+<td><b>Beschreibung</b></td>\r
+</tr>\r
+<tr>\r
+<td><code>$only_post</code></td>\r
+<td>Wenn > 0, kann <i>Form E-Mail</i> nur mit der HTTP-Zugriffsmethode <tt>POST</tt> aufgerufen werden</td>\r
+</tr>\r
+<tr>\r
+<td><code>$check_referer</code></td>\r
+<td>Wenn > 0, überprüft <i>Form E-Mail</i> die Host-Angabe im HTTP-Referer. Das ist nützlich, wenn Sie verhindern wollen, dass irgendjemand Ihr Script für sich ausnutzt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$referer_ok</code></td>\r
+<td>Geben Sie hier die Hosts an, von denen <i>Form E-Mail</i> aus aufgerufen werden darf (zum Beispiel <i>www.IhreDomain.xyz</i>). Trennen Sie mehrere Hosts durch Semikolons.<br />\r
+<b style="color:#FF0000">Achtung:</b> Mit einer Referer-Prüfung kann man zwar unbedarfte Anwender abschrecken, aber wirklich zuverlässig ist diese Methode nicht, da sich der Referer fälschen lässt oder auch komplett fehlen kann.</td>\r
+</tr>\r
+</table>\r
+\r
+<p><b>Captchas</b></p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Einstellung</b></td>\r
+<td><b>Beschreibung</b></td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_enable</code></td>\r
+<td>Wenn > 0, wird die Captcha-Überprüfung aktiviert.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_case</code></td>\r
+<td>Wenn 1, wird bei Captchas auf Groß- und Kleinschreibung geachtet. Beachten Sie bitte, dass bei deaktiverter Einstellung im Captcha selbst immer noch Groß- und Kleinbuchstaben angezeigt werden - lediglich bei der Auswertung wird die Groß- und Kleinschreibung nicht berücksichtigt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_max</code></td>\r
+<td>Wenn > 0, ist nur eine bestimmte Anzahl von Fehlversuchen bei der Eingabe des Captcha-Texts möglich.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_length</code></td>\r
+<td>Geben Sie hier die Länge des Captcha-Textes an.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_width</code></td>\r
+<td>Geben Sie hier die Breite des Captcha-Bilds an (in Pixeln). Dieser Wert wird überschrieben, wenn <code>$captcha_image_bg</code> gesetzt ist.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_height</code></td>\r
+<td>Geben Sie hier die Höhe des Captcha-Bilds an (in Pixeln). Dieser Wert wird überschrieben, wenn <code>$captcha_image_bg</code> gesetzt ist.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_angle</code></td>\r
+<td>Geben Sie hier den Winkel-Bereich an, in dem der Captcha-Text ausgerichtet werden soll. Es wird ein zufälliger Wert aus diesem Bereich ausgewählt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_x</code></td>\r
+<td>Geben Sie hier den Bereich an, in dem sich der horizontale Startpunkt des Captcha-Texts befinden soll. Es wird ein zufälliger Wert aus diesem Bereich ausgewählt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_y</code></td>\r
+<td>Geben Sie hier den Bereich an, in dem sich der vertikale Startpunkt des Captcha-Texts befinden soll. Es wird ein zufälliger Wert aus diesem Bereich ausgewählt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_possible</code></td>\r
+<td>Geben Sie hier die möglichen Zeichen des Captcha-Texts an. Standardmäßig vorgegeben ist <i>'ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'</i>.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_font</code></td>\r
+<td>Schriftart für den Captcha-Text. Geben Sie hier den Pfad zu einer <i>.ttf</i>-Datei an. Standardmäßig ist hier die mitgelieferte <i>XFILES.TTF</i> angegeben.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_font_size</code></td>\r
+<td>Geben Sie hier die Schriftgröße des Captcha-Textes an.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_lines</code></td>\r
+<td>Wenn > 0, werden zufällige Störlinien in das Captcha-Bild eingefügt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_color_bg</code></td>\r
+<td>Geben Sie hier die RGB-Werte (in Form eines PHP-Arrays) der Hintergrundfarbe des Captcha-Bilds an.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_color_text</code></td>\r
+<td>Geben Sie hier die RGB-Werte (in Form eines PHP-Arrays) der Textfarbe des Captcha-Bilds an.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_image_bg</code></td>\r
+<td>Hier können Sie, wenn Sie möchten, ein Hintergrundbild für das Captcha-Bild angeben. Diese Option überschreibt <code>$captcha_length</code> und <code>$captcha_height</code> mit den Angaben aus dem Bild.</td>\r
+</tr>\r
+</table>\r
+\r
+<p><b>Fehlermeldungen</b></p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Einstellung</b></td>\r
+<td><b>Beschreibung</b></td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_nothing</code></td>\r
+<td>Der Benutzer hat überhaupt nichts eingegeben</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_no_name</code></td>\r
+<td>Der Benutzer hat keinen Namen angegeben</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_no_email</code></td>\r
+<td>Der Benutzer hat keine E-Mail-Adresse angegeben</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_invalid_email</code></td>\r
+<td>Der Benutzer hat eine von der Syntax her ungültige E-Mail-Adresse angegeben</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_no_text</code></td>\r
+<td>Der Benutzer hat keinen Text angegeben</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_name_short</code></td>\r
+<td>Der vom Benutzer eingegebene Name ist nicht lang genug</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_subject_short</code></td>\r
+<td>Der vom Benutzer eingegebene Betreff ist nicht lang genug</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_text_short</code></td>\r
+<td>Der vom Benutzer eingegebene Text ist nicht lang genug</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_send_error</code></td>\r
+<td>Die Mail konnte nicht versendet werden</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_only_post</code></td>\r
+<td><i>Form E-Mail</i> darf nur mit <tt>POST</tt> aufgerufen werden</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_referer_not_ok</code></td>\r
+<td>Der im HTTP-Referer angegebene Host darf keine Mails über das Script senden</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_captcha_incorrect</code></td>\r
+<td>Der vom Benutzer eingegebene Captcha-Code ist nicht korrekt</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_captcha_max</code></td>\r
+<td>Der Benutzer hat den Captcha-Code zu oft falsch eingegeben</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_captcha_disabled</code></td>\r
+<td>Wird angezeigt, wenn <i>captcha.php</i> aufgerufen wird und Captchas eigentlich deaktiviert sind.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$err_captcha_session_failure</code></td>\r
+<td>Wird angezeigt, wenn keine Session-Variablen gefunden werden konnten.</td>\r
+</tr>\r
+</table>\r
+\r
+<p><b>Pfade zu Templates</b></p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td><b>Einstellung</b></td>\r
+<td><b>Beschreibung</b></td>\r
+</tr>\r
+<tr>\r
+<td><code>$tpl_mail</code></td>\r
+<td>Template für die Mail</td>\r
+</tr>\r
+<tr>\r
+<td><code>$tpl_sent</code></td>\r
+<td>Die Mail wurde erfolgreich versendet</td>\r
+</tr>\r
+<tr>\r
+<td><code>$tpl_user_error</code></td>\r
+<td>Der Benutzer hat etwas falsch gemacht</td>\r
+</tr>\r
+<tr>\r
+<td><code>$tpl_fatal</code></td>\r
+<td>Es ist ein Fehler aufgetreten, den der Benutzer nicht mehr beheben kann</td>\r
+</tr>\r
+</table>\r
+\r
+<p class="upanddown"><a href="#top">Nach oben</a></p>\r
+\r
+<h2><a name="templates" id="templates">Templates anpassen</a></h2>\r
+\r
+<p>Die Anpassung der Ausgaben von <i>Form E-Mail</i> erfolgt über Templates (englisch für "Vorlagen"). Jede der Templates enthält Variablen der Form <b>{VARIABLENNAME}</b>, die dann von <i>Form E-Mail</i> durch entsprechende Daten ersetzt werden.</p>\r
+\r
+<p>Hier nun eine Auflistung der einzelnen Templates und der verwendeten Variablen (ohne geschweifte Klammern):</p>\r
+\r
+<table border="1">\r
+<tr>\r
+<td width="20%"><b>Datei</b></td>\r
+<td width="40%"><b>Zweck</b></td>\r
+<td width="40%"><b>Verwendete Variablen</b></td>\r
+</tr>\r
+<tr>\r
+<td><i>fatal.htm</i></td>\r
+<td>Wird angezeigt, wenn ein Fehler aufgetreten ist, den der Benutzer nicht mehr beheben kann</td>\r
+<td>\r
+<ul>\r
+<li><b>ERROR</b><br />\r
+Die Fehlermeldung</li>\r
+</ul>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td><i>mail.txt</i></td>\r
+<td>Legt das Aussehen der Mail fest</td>\r
+<td>\r
+<ul>\r
+<li><b>EMAIL</b><br />\r
+Die eingegebene E-Mail-Adresse</li>\r
+<li><b>NAME</b><br />\r
+Der eingegebene Name</li>\r
+<li><b>SUBJECT</b><br />\r
+Der Betreff der Mail</li>\r
+<li><b>TEXT</b><br />\r
+Der eingegebene Mail-Text</li>\r
+<li><b>TIME</b><br />\r
+Die formatierte Zeitangabe</li>\r
+</ul>\r
+\r
+Zusätzlich können Sie hier durch Variablen, die mit <b>ENV_</b> beginnen, Server-Umgebungsvariablen im Text einfügen (siehe auch Konfigurationsvariable <code>$allowed_envs</code>.\r
+</td>\r
+</tr>\r
+<tr>\r
+<td><i>sent.htm</i></td>\r
+<td>Wird angezeigt, wenn die Mail erfolgreich versendet wurde</td>\r
+<td>\r
+<ul>\r
+<li><b>EMAIL</b><br />\r
+Die eingegebene E-Mail-Adresse</li>\r
+<li><b>MAIL</b><br />\r
+Die komplette Mail, so wie sie versendet wurde (natürlich ohne Header)</li>\r
+<li><b>NAME</b><br />\r
+Der eingegebene Name</li>\r
+<li><b>SUBJECT</b><br />\r
+Der Betreff der Mail</li>\r
+<li><b>TEXT</b><br />\r
+Der eingegebene Mail-Text</li>\r
+<li><b>TIME</b><br />\r
+Die formatierte Zeitangabe</li>\r
+</ul>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td><i>user_error.htm</i></td>\r
+<td>Wird angezeigt, wenn der Benutzer einen Fehler gemacht hat, der sich aber noch beheben lässt (zum Beispiel wenn ein Formularfeld nicht ausgefüllt wurde)</td>\r
+<td>\r
+<ul>\r
+<li><b>EMAIL</b><br />\r
+Die eingegebene E-Mail-Adresse</li>\r
+<li><b>ERROR</b><br />\r
+Die Fehlermeldung</li>\r
+<li><b>NAME</b><br />\r
+Der eingegebene Name</li>\r
+<li><b>SUBJECT</b><br />\r
+Der Betreff der Mail</li>\r
+<li><b>TEXT</b><br />\r
+Der eingegebene Mail-Text</li>\r
+</ul>\r
+\r
+Zusätzlich ist es möglich, einen Bereich, der nur angezeigt werden soll, wenn Captchas aktiviert sind, anzuzeigen, indem Sie diesen in folgenden Block einschließen (der <code>{ELSE}</code>-Teil ist optional):<br />\r
+<br />\r
+<code>{IF CAPTCHA}Captchas sind aktiviert{ELSE}Captchas sind nicht aktiviert{ENDIF}</code>\r
+</td>\r
+</tr>\r
+</table>\r
+\r
+<p> </p>\r
+\r
+<hr width="80%" noshade="noshade" />\r
+\r
+<p><a href="changes.htm">Versionshistorie</a></p>\r
+\r
+<hr width="80%" noshade="noshade" />\r
+\r
+<p style="font-size:8pt">© 2002-2011 Patrick Canterino</p>\r
+\r
+<table border="0" cellspacing="0" style="font-size:8pt">\r
+<tr>\r
+<td>Homepage:</td>\r
+<td><a href="http://www.patshaping.de/" target="_blank">http://www.patshaping.de/</a></td>\r
+</tr>\r
+<tr>\r
+<td><a name="bottom" id="bottom">E-Mail:</a></td>\r
+<td><a href="mailto:patrick@patshaping.de">patrick@patshaping.de</a></td>\r
+</tr>\r
+</table>\r
+</body>\r
+</html>
\ No newline at end of file