]> git.p6c8.net - form-email.git/commitdiff
Form E-Mail 3.4.1 hinzugefuegt
authorPatrick Canterino <patrick@patshaping.de>
Fri, 2 Dec 2011 20:05:44 +0000 (20:05 +0000)
committerPatrick Canterino <patrick@patshaping.de>
Fri, 2 Dec 2011 20:05:44 +0000 (20:05 +0000)
14 files changed:
changes.htm [new file with mode: 0644]
form-email/XFILES.TTF [new file with mode: 0644]
form-email/captcha.php [new file with mode: 0644]
form-email/class.Template.php [new file with mode: 0644]
form-email/config.php [new file with mode: 0644]
form-email/fatal.htm [new file with mode: 0644]
form-email/functions.php [new file with mode: 0644]
form-email/mail.txt [new file with mode: 0644]
form-email/mailer.php [new file with mode: 0644]
form-email/sent.htm [new file with mode: 0644]
form-email/user_error.htm [new file with mode: 0644]
formular.htm [new file with mode: 0644]
license.txt [new file with mode: 0644]
readme.htm [new file with mode: 0644]

diff --git a/changes.htm b/changes.htm
new file mode 100644 (file)
index 0000000..1953bab
--- /dev/null
@@ -0,0 +1,218 @@
+<?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&nbsp;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&ouml;rner f&uuml;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&nbsp;3.4</b> (vom 25.1.2009)</p>\r
+\r
+<ul>\r
+<li><b>Captchas:</b><br />\r
+Es ist nun m&ouml;glich, im Mail-Formular sog. <a href="http://de.wikipedia.org/wiki/CAPTCHA">Captchas</a> anzuzeigen. Es handelt sich hierbei um einen zuf&auml;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&uuml;r <i>Form E-Mail</i> die Artistic License 1.0 gilt.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version&nbsp;3.3a</b> (vom 14.4.2007)</p>\r
+\r
+<ul>\r
+<li><b><code>date_default_timezone_set()</code> unter PHP&nbsp;4:</b><br />\r
+Unter PHP&nbsp;4 existiert <code>date_default_timezone_set()</code> nicht, weshalb <i>Form E-Mail</i> dort nicht lauff&auml;hig war. Jetzt wird vor der Anwendung dieser Funktion gepr&uuml;ft, ob sie auch existiert.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version&nbsp;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&uuml;rfen, l&auml;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&auml;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&nbsp;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&nbsp;3.2.2</b> (vom 9.6.2006)</p>\r
+\r
+<ul>\r
+<li><b>Zeilenumbr&uuml;che ersetzen:</b><br />\r
+S&auml;mtliche Zeilenumbr&uuml;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&uuml;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&ouml;st werden soll, wird nun der Status-Code <tt>303</tt> an den Client zur&uuml;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&nbsp;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 &Auml;nderung nach <code>{}</code> war ohnehin unvollst&auml;ndig.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version&nbsp;3.2.1</b> (vom 18.6.2005)</p>\r
+\r
+<ul>\r
+<li><b>Keine &quot;Notices&quot; mehr:</b><br />\r
+<i>Form E-Mail</i> sollte nun auch ordnungsgem&auml;&szlig; funktionieren, wenn f&uuml;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&nbsp;1.5a aktualisiert.</li>\r
+<li><b>Verschiedene &Auml;nderungen:</b><br />\r
+Es wurden verschiedene kleine &Auml;nderungen durchgef&uuml;hrt:\r
+<ul>\r
+<li>Die Funktion <code>sizeof()</code> wurde durch <code>count()</code> ersetzt. <code>sizeof()</code> ist n&auml;mlich ein Alias -&nbsp;und von der Verwendung von Aliasen wird abgeraten.</li>\r
+<li>PHP bietet aus Gr&uuml;nden der Abw&auml;rtskompatibilit&auml;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&uuml;hrungszeichen durch einfache ersetzt.</li>\r
+</ul>\r
+</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version&nbsp;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&auml;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&auml;ngen:</b><br />\r
+Zus&auml;tzlich zu den Mindestl&auml;ngen aus Version&nbsp;3.1 lassen sich f&uuml;r Name, Betreff und Text auch Maximall&auml;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 &quot;1&quot; 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&uuml;r etwas mehr &Uuml;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&nbsp;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&nbsp;3.1</b> (vom 20.1.2004)</p>\r
+\r
+<ul>\r
+<li><b>Immer noch Bug in E-Mail-Adressen-&Uuml;berpr&uuml;fung:</b><br />\r
+Der regul&auml;re Ausdruck, der die E-Mail-Adressen auf syntaktische G&uuml;ltigkeit &uuml;berpr&uuml;ft, war immer noch fehlerhaft. Es gab immer noch E-Mail-Adressen, die das Script &uuml;berlasten konnten.</li>\r
+<li><b>Mindestl&auml;ngen:</b><br />\r
+Es ist jetzt m&ouml;glich, f&uuml;r Name, Betreff und Text Mindestl&auml;ngen anzugeben.</li>\r
+<li><b>Alias-Empf&auml;nger:</b><br />\r
+Es ist nun m&ouml;glich, &uuml;ber die Formulardaten einen einer oder mehreren Adressen zugeordneten Wert an <i>Form E-Mail</i> zu &uuml;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&uuml;r &Uuml;bersicht und f&uuml;r eine bessere Erweiterbarkeit.</li>\r
+</ul>\r
+\r
+<p><b>Neu in Version&nbsp;3.0</b> (vom 1.9.2003)</p>\r
+\r
+<ul>\r
+<li><b>Komplett neu programmiert:</b><br />\r
+<i>Form E-Mail&nbsp;3.0</i> wurde von Grund auf neu programmiert, damit m&ouml;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 &quot;2&quot; annehmen. Dadurch erscheint zus&auml;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&auml;ssig, da sie nun Base64 verwendet. Mit der urspr&uuml;nglichen Quoted-Printable-Codierung gab es Probleme.</li>\r
+<li><b>Mehrere Empf&auml;nger:</b><br />\r
+Es ist nun m&ouml;glich, mehrere Empf&auml;nger f&uuml;r die Mail anzugeben.</li>\r
+<li><b>Referer-&Uuml;berpr&uuml;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&uuml;tzlich, um daf&uuml;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&auml;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&auml;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 &Auml;nderungen bis zur Version&nbsp;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">&copy;&nbsp;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
diff --git a/form-email/XFILES.TTF b/form-email/XFILES.TTF
new file mode 100644 (file)
index 0000000..c034793
Binary files /dev/null and b/form-email/XFILES.TTF differ
diff --git a/form-email/captcha.php b/form-email/captcha.php
new file mode 100644 (file)
index 0000000..f796b46
--- /dev/null
@@ -0,0 +1,112 @@
+<?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
diff --git a/form-email/class.Template.php b/form-email/class.Template.php
new file mode 100644 (file)
index 0000000..ad6dc0e
--- /dev/null
@@ -0,0 +1,796 @@
+<?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
diff --git a/form-email/config.php b/form-email/config.php
new file mode 100644 (file)
index 0000000..cee87df
--- /dev/null
@@ -0,0 +1,107 @@
+<?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&uuml;ltig!';\r
+$err_no_text        = 'Sie haben keinen Text f&uuml;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
diff --git a/form-email/fatal.htm b/form-email/fatal.htm
new file mode 100644 (file)
index 0000000..8891c23
--- /dev/null
@@ -0,0 +1,11 @@
+<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
diff --git a/form-email/functions.php b/form-email/functions.php
new file mode 100644 (file)
index 0000000..9f5937d
--- /dev/null
@@ -0,0 +1,157 @@
+<?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",'&nbsp;',$htmltext);\r
+ $htmltext = str_replace($linebreak.' ',$linebreak.'&nbsp;',$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
diff --git a/form-email/mail.txt b/form-email/mail.txt
new file mode 100644 (file)
index 0000000..27db7d8
--- /dev/null
@@ -0,0 +1,3 @@
+{NAME} ({EMAIL}) schrieb am {TIME}:\r
+\r
+{TEXT}
\ No newline at end of file
diff --git a/form-email/mailer.php b/form-email/mailer.php
new file mode 100644 (file)
index 0000000..9ff120d
--- /dev/null
@@ -0,0 +1,345 @@
+<?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
diff --git a/form-email/sent.htm b/form-email/sent.htm
new file mode 100644 (file)
index 0000000..d91c0ce
--- /dev/null
@@ -0,0 +1,10 @@
+<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
diff --git a/form-email/user_error.htm b/form-email/user_error.htm
new file mode 100644 (file)
index 0000000..117101a
--- /dev/null
@@ -0,0 +1,25 @@
+<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&uuml;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&uuml;cksetzen">\r
+</form>\r
+</body>\r
+</html>
\ No newline at end of file
diff --git a/formular.htm b/formular.htm
new file mode 100644 (file)
index 0000000..1c37bfb
--- /dev/null
@@ -0,0 +1,28 @@
+<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&uuml;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&uuml;cksetzen">\r
+</form>\r
+</body>\r
+</html>
\ No newline at end of file
diff --git a/license.txt b/license.txt
new file mode 100644 (file)
index 0000000..699679e
--- /dev/null
@@ -0,0 +1,127 @@
+                        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
diff --git a/readme.htm b/readme.htm
new file mode 100644 (file)
index 0000000..cf59179
--- /dev/null
@@ -0,0 +1,555 @@
+<?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&uuml;r Form E-Mail&nbsp;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&uuml;r Form E-Mail&nbsp;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&uuml;r Name und E-Mail-Adresse des Absenders, eines f&uuml;r den Betreff und ein weiteres f&uuml;r den Text der Mail.<br />\r
+Auf diese Weise m&uuml;ssen Sie zum Beispiel nicht &uuml;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&ouml;nnen au&szlig;erdem noch ein Feld namens <i>subject</i> anlegen. Hier kann ein Betreff f&uuml;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&ouml;glich. Dieses Feld enth&auml;lt einen Alias-Empf&auml;nger. Wie das funktioniert, k&ouml;nnen Sie bei der Beschreibung der Einstellung <code>$aliases</code> lesen.</p>\r
+\r
+<p>Wenn Sie Captchas (zuf&auml;llige Zeichenfolgen, die der Benutzer vor dem Absenden des Formulars eingeben muss, um Spambots auszuschlie&szlig;en) benutzen wollen (siehe unten), m&uuml;ssen Sie im Formular die Datei <i>captcha.php</i> als Bild einbinden (<code>&lt;img&gt;</code>-Tag). Bedenken Sie, dass Sie diese Datei auch in den <a href="#templates">Templates</a> einbinden m&uuml;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&uuml;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. &Ouml;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&uuml;hrungszeichen die Adresse an, an die die Mail gehen soll. Wenn die Mail an mehrere Empf&auml;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&auml;sst sich noch weiter konfigurieren. Mehr dazu finden Sie in den n&auml;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&auml;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&ouml;nnen Sie eine Alias-Namen f&uuml;r Empf&auml;nger angeben. Soll einem Alias mehrere Empf&auml;nger zugeordnet werden, gilt dasselbe wie f&uuml;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&auml;ren kann, hier ein Beispiel:<br /><br />\r
+<code>array('info' =&gt; 'info@IhreDomain.xyz', 'support' =&gt; 'support@IhreDomain.xyz',<br />\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'alle' =&gt; '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&uuml;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&auml;gt. Wenn 2, wird zus&auml;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&uuml;hrt werden soll (0 f&uuml;r keine Zeilenumbr&uuml;che).</td>\r
+</tr>\r
+<tr>\r
+<td><code>$add_header</code></td>\r
+<td>Legt beim Wert&nbsp;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&ouml;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&ouml;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&uuml;rfen, als normales PHP-Array an (siehe auch die Erl&auml;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&uuml;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&ouml;tig, da ansonsten eine Fehlermeldung auftreten kann).</td>\r
+</tr>\r
+</table>\r
+\r
+<p><b>L&auml;ngen&uuml;berpr&uuml;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 =&nbsp;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 =&nbsp;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 =&nbsp;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&ouml;chstens sein darf (0 =&nbsp;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&ouml;chstens sein darf (0 =&nbsp;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&ouml;chstens sein darf (0 =&nbsp;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 &gt; 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 &gt; 0, &uuml;berpr&uuml;ft <i>Form E-Mail</i> die Host-Angabe im HTTP-Referer. Das ist n&uuml;tzlich, wenn Sie verhindern wollen, dass irgendjemand Ihr Script f&uuml;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&uuml;fung kann man zwar unbedarfte Anwender abschrecken, aber wirklich zuverl&auml;ssig ist diese Methode nicht, da sich der Referer f&auml;lschen l&auml;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 &gt; 0, wird die Captcha-&Uuml;berpr&uuml;fung aktiviert.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_case</code></td>\r
+<td>Wenn 1, wird bei Captchas auf Gro&szlig;- und Kleinschreibung geachtet. Beachten Sie bitte, dass bei deaktiverter Einstellung im Captcha selbst immer noch Gro&szlig;- und Kleinbuchstaben angezeigt werden - lediglich bei der Auswertung wird die Gro&szlig;- und Kleinschreibung nicht ber&uuml;cksichtigt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_max</code></td>\r
+<td>Wenn &gt; 0, ist nur eine bestimmte Anzahl von Fehlversuchen bei der Eingabe des Captcha-Texts m&ouml;glich.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_length</code></td>\r
+<td>Geben Sie hier die L&auml;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 &uuml;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&ouml;he des Captcha-Bilds an (in Pixeln). Dieser Wert wird &uuml;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&auml;lliger Wert aus diesem Bereich ausgew&auml;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&auml;lliger Wert aus diesem Bereich ausgew&auml;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&auml;lliger Wert aus diesem Bereich ausgew&auml;hlt.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_possible</code></td>\r
+<td>Geben Sie hier die m&ouml;glichen Zeichen des Captcha-Texts an. Standardm&auml;&szlig;ig vorgegeben ist <i>'ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'</i>.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_font</code></td>\r
+<td>Schriftart f&uuml;r den Captcha-Text. Geben Sie hier den Pfad zu einer <i>.ttf</i>-Datei an. Standardm&auml;&szlig;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&ouml;&szlig;e des Captcha-Textes an.</td>\r
+</tr>\r
+<tr>\r
+<td><code>$captcha_lines</code></td>\r
+<td>Wenn &gt; 0, werden zuf&auml;llige St&ouml;rlinien in das Captcha-Bild eingef&uuml;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&ouml;nnen Sie, wenn Sie m&ouml;chten, ein Hintergrundbild f&uuml;r das Captcha-Bild angeben. Diese Option &uuml;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 &uuml;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&uuml;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 &uuml;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&uuml;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 &uuml;ber Templates (englisch f&uuml;r &quot;Vorlagen&quot;). Jede der Templates enth&auml;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&auml;tzlich k&ouml;nnen Sie hier durch Variablen, die mit <b>ENV_</b> beginnen, Server-Umgebungsvariablen im Text einf&uuml;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&uuml;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&auml;sst (zum Beispiel wenn ein Formularfeld nicht ausgef&uuml;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&auml;tzlich ist es m&ouml;glich, einen Bereich, der nur angezeigt werden soll, wenn Captchas aktiviert sind, anzuzeigen, indem Sie diesen in folgenden Block einschlie&szlig;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>&nbsp;</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">&copy;&nbsp;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

patrick-canterino.de