From: Patrick Canterino Date: Fri, 2 Dec 2011 20:17:36 +0000 (+0000) Subject: Bisherige Aenderungen ins SVN kopiert: X-Git-Tag: 3.5~62 X-Git-Url: https://git.p6c8.net/form-email.git/commitdiff_plain/f1f62b07946e764d3b51d1da4eeb7aa83702bec6 Bisherige Aenderungen ins SVN kopiert: - Anderer Programmierstil - Lizenz zur Artistic License 2.0 geaendert - Erster Versuch fuer die individuellen Formularfelder - Template-Klasse auf 2.5 aktualisiert --- diff --git a/form-email/captcha.php b/form-email/captcha.php index f796b46..2672cc3 100644 --- a/form-email/captcha.php +++ b/form-email/captcha.php @@ -1,109 +1,101 @@ -# Letzte Aenderung: 11.1.2009 +# Letzte Aenderung: 7.11.2011 # # Copyright (C) 2002-2011 Patrick Canterino # -# Diese Datei kann unter den Bedingungen der "Artistic License 1.0" +# Diese Datei kann unter den Bedingungen der "Artistic License 2.0" # weitergegeben und / oder veraendert werden. # Siehe: -# http://www.opensource.org/licenses/artistic-license-1.0.php +# http://www.opensource.org/licenses/artistic-license-2.0 # require('config.php'); require('functions.php'); require('class.Template.php'); -if($captcha_enable) -{ - session_start(); +if($captcha_enable) { + session_start(); - if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) - { - show_fatal($err_captcha_max); - } - else - { - unset($_SESSION['captcha']); + if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) { + show_fatal($err_captcha_max); + } + else { + unset($_SESSION['captcha']); - # Zufaellige Zeichenkette erzeugen + # Zufaellige Zeichenkette erzeugen - $captcha_string = ''; + $captcha_string = ''; - $x = 0; - srand(); + $x = 0; + srand(); - while($x<$captcha_length) - { - $rand = rand(0,strlen($captcha_possible)-1); - $captcha_string .= $captcha_possible[$rand]; + while($x<$captcha_length) { + $rand = rand(0,strlen($captcha_possible)-1); + $captcha_string .= $captcha_possible[$rand]; - $x++; - } + $x++; + } - $_SESSION['captcha'] = $captcha_string; + $_SESSION['captcha'] = $captcha_string; - # Ein Bild mit dem generierten Text erzeugen + # Ein Bild mit dem generierten Text erzeugen - if($captcha_image_bg && file_exists($captcha_image_bg)) - { - # Es wurde ein Hintergrundbild angegeben + if($captcha_image_bg && file_exists($captcha_image_bg)) { + # Es wurde ein Hintergrundbild angegeben - $captcha_img = imagecreatefrompng($captcha_image_bg); + $captcha_img = imagecreatefrompng($captcha_image_bg); - $image_size = getimagesize($captcha_image_bg); - $captcha_width = $image_size[0]; - $captcha_height = $image_size[1]; - } - else - { - # Es wurde kein Hintergrundbild angegeben + $image_size = getimagesize($captcha_image_bg); + $captcha_width = $image_size[0]; + $captcha_height = $image_size[1]; + } + else { + # Es wurde kein Hintergrundbild angegeben - $captcha_img = imagecreate($captcha_width,$captcha_height); - } + $captcha_img = imagecreate($captcha_width,$captcha_height); + } - $white = imagecolorallocate($captcha_img,$captcha_color_bg[0],$captcha_color_bg[1],$captcha_color_bg[2]); - $black = imagecolorallocate($captcha_img,$captcha_color_text[0],$captcha_color_text[1],$captcha_color_text[2]); + $white = imagecolorallocate($captcha_img,$captcha_color_bg[0],$captcha_color_bg[1],$captcha_color_bg[2]); + $black = imagecolorallocate($captcha_img,$captcha_color_text[0],$captcha_color_text[1],$captcha_color_text[2]); - $angle = rand($captcha_angle[0],$captcha_angle[1]); - $t_x = rand($captcha_x[0],$captcha_y[1]); - $t_y = rand($captcha_y[0],$captcha_y[1]); - - imagettftext($captcha_img,$captcha_font_size,$angle,$t_x,$t_y,$black,$captcha_font,$captcha_string); + $angle = rand($captcha_angle[0],$captcha_angle[1]); + $t_x = rand($captcha_x[0],$captcha_y[1]); + $t_y = rand($captcha_y[0],$captcha_y[1]); - # Zufaellige Linien einfuegen + imagettftext($captcha_img,$captcha_font_size,$angle,$t_x,$t_y,$black,$captcha_font,$captcha_string); - $y = 0; + # Zufaellige Linien einfuegen - while($y<$captcha_lines) - { - $begin_x = rand(0,$captcha_width); - $begin_y = rand(0,$captcha_height); - $end_x = rand(0,$captcha_width); - $end_y = rand(0,$captcha_height); + $y = 0; - imageline($captcha_img,$begin_x,$begin_y,$end_x,$end_y,$black); + while($y<$captcha_lines) { + $begin_x = rand(0,$captcha_width); + $begin_y = rand(0,$captcha_height); + $end_x = rand(0,$captcha_width); + $end_y = rand(0,$captcha_height); - $y++; - } + imageline($captcha_img,$begin_x,$begin_y,$end_x,$end_y,$black); - # Bild ausgeben + $y++; + } - header('Content-type: image/png'); - imagepng($captcha_img); + # Bild ausgeben - imagedestroy($captcha_img); - } + header('Content-type: image/png'); + imagepng($captcha_img); + + imagedestroy($captcha_img); + } } -else -{ - show_fatal($err_captcha_disabled); +else { + show_fatal($err_captcha_disabled); } # diff --git a/form-email/class.Template.php b/form-email/class.Template.php index ad6dc0e..5b43d0b 100644 --- a/form-email/class.Template.php +++ b/form-email/class.Template.php @@ -1,793 +1,854 @@ -# Letzte Aenderung: 3.7.2006 +# Letzte Aenderung: 25.11.2011 +# +# Copyright (C) 2002-2011 Patrick Canterino +# +# Diese Datei kann unter den Bedingungen der "Artistic License 2.0" +# weitergegeben und / oder veraendert werden. +# Siehe: +# http://www.opensource.org/licenses/artistic-license-2.0 # -class Template -{ - var $file; - var $template; - var $original; - var $vars = array(); - var $defined_vars = array(); - var $loop_vars = array(); - - # get_template() - # - # Kompletten Vorlagentext zurueckgeben - # - # Parameter: -keine- - # - # Rueckgabe: Kompletter Vorlagentext (String) - - function get_template() - { - return $this->template; - } - - # set_template() - # - # Kompletten Vorlagentext aendern - # - # Parameter: Vorlagentext - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function set_template($text) - { - $this->template = $text; - } - - # add_text() - # - # Vorlagentext ans Template-Objekt anhaengen - # - # Parameter: Vorlagentext - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function add_text($text) - { - $this->set_template($this->get_template().$text); - } - - # read_file() - # - # Einlesen einer Vorlagendatei und {INCLUDE}-Anweisungen ggf. verarbeiten - # (Text wird an bereits vorhandenen Text angehaengt) - # - # Parameter: 1. Datei zum Einlesen - # 2. Status-Code (Boolean): - # true => {INCLUDE}-Anweisungen nicht verarbeiten - # false => {INCLUDE}-Anweisungen verarbeiten (Standard) - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function read_file($file,$not_include=0) - { - $this->file = $file; - - if(filesize($file) > 0) - { - $fp = fopen($file,'r'); - if(!$fp) die; - $content = fread($fp,filesize($file)); - fclose($fp); - } - else $content = ''; - - $this->add_text($content); - $this->save_state(); - - if(!$not_include) $this->parse_includes(); - } - - # set_var() - # - # Wert einer Variable setzen - # - # Parameter: 1. Name der Variable - # 2. Wert, den die Variable erhalten soll - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function set_var($var,$content) - { - $this->vars[$var] = $content; - } - - # get_var() - # - # Wert einer Variable zurueckgeben - # - # Parameter: (optional) Variablenname - # - # Rueckgabe: Wert der Variable; - # wenn die Variable nicht existiert, false; - # wenn kein Variablenname angegeben wurde, wird ein - # Array mit den Variablennamen zurueckgegeben - - function get_var($var=false) - { - if($var !== false) - { - if(isset($this->vars[$var])) - { - return $this->vars[$var]; - } - else - { - return false; - } - } - else - { - return array_keys($this->vars); - } - } - - # set_loop_data() - # - # Daten fuer eine Schleife setzen - # - # Parameter: 1. Name der Schleife - # 2. Array mit den Arrays mit den Variablen fuer - # die Schleifendurchgaenge - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function set_loop_data($loop,$data) - { - $this->loop_vars[$loop] = $data; - } - - # add_loop_data() - # - # Daten fuer einen Schleifendurchgang hinzufuegen - # - # Parameter: 1. Name der Schleife - # 2. Array mit den Variablen fuer den - # Schleifendurchgang - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function add_loop_data($loop,$data) - { - if(isset($this->loop_vars[$loop]) && is_array($this->loop_vars[$loop])) - { - array_push($this->loop_vars[$loop],$data); - } - else - { - $this->loop_vars[$loop] = array($data); - } - } - - # parse() - # - # In der Template definierte Variablen auslesen, Variablen - # ersetzen, {IF}- und {TRIM}-Bloecke parsen - # - # Parameter: -nichts- - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function parse() - { - # Zuerst die Schleifen parsen - - if(is_array($this->loop_vars) && ($loops = array_keys($this->loop_vars))) - { - foreach($loops as $loop) - { - $this->parse_loop($loop); - } - } - - # Normale Variablen durchgehen - - if(($vars = $this->get_var()) !== false && is_array($vars)) - { - foreach($vars as $var) - { - $val = $this->get_var($var); - - $this->parse_if_block($var,$val); - - if(is_array($val)) - { - $this->fillin_array($var,$val); +class Template { + var $file; + var $template; + var $original; + var $old_parsing = 0; + var $vars = array(); + var $defined_vars = array(); + var $loop_vars = array(); + + # get_template() + # + # Kompletten Vorlagentext zurueckgeben + # + # Parameter: -keine- + # + # Rueckgabe: Kompletter Vorlagentext (String) + + function get_template() { + return $this->template; } - else - { - $this->fillin($var,$val); + + # set_template() + # + # Kompletten Vorlagentext aendern + # + # Parameter: Vorlagentext + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function set_template($text) { + $this->template = $text; } - unset($val); - } - } - - # Jetzt dasselbe mit denen, die direkt in der Template-Datei definiert - # sind, machen. Ich weiss, dass das eine ziemlich unsaubere Loesung ist, - # aber es funktioniert - - $this->get_defined_vars(); - - foreach($this->defined_vars as $var) - { - $val = $this->get_var($var); - - $this->parse_if_block($var,$val); - $this->fillin($var,$val); - - unset($val); - } - - # {TRIM}-Bloecke entfernen - - $this->parse_trim_blocks(); - } - - # fillin() - # - # Variablen durch Text ersetzen - # - # Parameter: 1. Variable zum Ersetzen - # 2. Text, durch den die Variable ersetzt werden soll - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function fillin($var,$text) - { - $template = $this->get_template(); - $template = str_replace('{'.$var.'}',$text,$template); - - $this->set_template($template); - } - - # fillin_array() - # - # Variable durch Array ersetzen - # - # Parameter: 1. Variable zum Ersetzen - # 2. Array, durch das die Variable ersetzt werden soll - # 3. Zeichenkette, mit der das Array verbunden werden soll - # (Standard: '') - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function fillin_array($var,$array,$glue='') - { - $this->fillin($var,implode($glue,$array)); - } - - # to_file() - # - # Template in Datei schreiben - # - # Parameter: Datei-Handle - # - # Rueckgabe: Status-Code (Boolean) - - function to_file($handle) - { - return @fwrite($handle,$this->get_template()); - } - - # reset() - # - # Den gesicherten Stand des Template-Textes sichern - # - # Parameter: -nichts- - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function reset() - { - $this->template = $this->original; - } - - # save_state() - # - # Aktuellen Stand des Template-Textes sichern - # (alte Sicherung wird ueberschrieben) - # - # Parameter: -nichts- - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function save_state() - { - $this->original = $this->template; - } - - # parse_loop() - # - # Eine Schleife parsen - # - # Parameter: Name der Schleife - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function parse_loop($name) - { - $template = $this->get_template(); - if(strpos($template,'{LOOP '.$name.'}') === false) return; - - $offset = 0; - $name_len = strlen($name); - - while(($begin = strpos($template,'{LOOP '.$name.'}',$offset)) !== false) - { - if(($end = strpos($template,'{ENDLOOP}',$begin+6+$name_len)) !== false) - { - $block = substr($template,$begin,$end+9-$begin); - $content = substr($block,$name_len+7,-9); - - $parsed_block = ''; - - for($x=0;$xloop_vars[$name]);$x++) - { - $loop_data = $this->loop_vars[$name][$x]; - $loop_vars = array_keys($loop_data); - - $ctpl = new Template; - $ctpl->set_template($content); - - foreach($loop_vars as $loop_var) - { - $ctpl->set_var($name.'.'.$loop_var,$loop_data[$loop_var]); - } - - $ctpl->parse(); - $parsed_block .= $ctpl->get_template(); - - unset($ctpl); + # add_text() + # + # Vorlagentext ans Template-Objekt anhaengen + # + # Parameter: Vorlagentext + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function add_text($text) { + $this->set_template($this->get_template().$text); } - $template = str_replace($block,$parsed_block,$template); - $offset = $begin+strlen($parsed_block); - } - else break; - } - - $this->set_template($template); - } - - # get_defined_vars() - # - # In der Template-Datei definierte Variablen auslesen - # - # Parameter: -nichts- - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function get_defined_vars() - { - $template = $this->get_template(); - if(strpos($template,'{DEFINE ') === false) return; - - $offset = 0; - - while(strpos($template,'{DEFINE ',$offset) !== false) - { - $begin = strpos($template,'{DEFINE ',$offset)+8; - $offset = $begin; - - $name = ''; - $content = ''; - - $var_open = 0; - $name_found = 0; - $define_block = 0; - - for($x=$begin;$x {INCLUDE}-Anweisungen nicht verarbeiten + # false => {INCLUDE}-Anweisungen verarbeiten (Standard) + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function read_file($file,$not_include=0) { + $this->file = $file; + + if(filesize($file) > 0) { + $fp = fopen($file,'r'); + if(!$fp) die; + $content = fread($fp,filesize($file)); + fclose($fp); + } + else $content = ''; + + $this->add_text($content); + $this->save_state(); + + if(!$not_include) $this->parse_includes(); } - if($var_open == 1) - { - if($template[$x] == '"') - { - # Der Inhalt der Variable ist hier zu Ende + # set_var() + # + # Wert einer Variable setzen + # + # Parameter: 1. Name der Variable + # 2. Wert, den die Variable erhalten soll + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function set_var($var,$content) { + $this->vars[$var] = $content; + } - $var_open = 0; + # get_var() + # + # Wert einer Variable zurueckgeben + # + # Parameter: (optional) Variablenname + # + # Rueckgabe: Wert der Variable; + # wenn die Variable nicht existiert, false; + # wenn kein Variablenname angegeben wurde, wird ein + # Array mit den Variablennamen zurueckgegeben + + function get_var($var=false) { + if($var !== false) { + if(isset($this->vars[$var])) { + return $this->vars[$var]; + } + else { + return false; + } + } + else { + return array_keys($this->vars); + } + } - if($template[$x+1] == '}') - { - # Hier ist der Block zu Ende + # set_vars() + # + # Komplettes Variablen-Array mit einem anderen Array ueberschreiben + # + # Parameter: Array + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - if($this->get_var($name) === false) - { - # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist + function set_vars($vars) { + $this->vars = $vars; + } - $this->set_var($name,$content); - array_push($this->defined_vars,$name); - } + # add_vars() + # + # Zum bestehenden Variablen-Array weitere Variablen in Form eines Arrays + # hinzufuegen + # + # Parameter: Array + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function add_vars($vars) { + $this->vars = array_merge($this->vars,$vars); + } - # {DEFINE}-Block entfernen + # set_loop_data() + # + # Daten fuer eine Schleife setzen + # + # Parameter: 1. Name der Schleife + # 2. Array mit den Arrays mit den Variablen fuer + # die Schleifendurchgaenge + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function set_loop_data($loop,$data) { + $this->loop_vars[$loop] = $data; + } - $pre = substr($template,0,$begin-8); - $post = substr($template,$x+2); + # add_loop_data() + # + # Daten fuer einen Schleifendurchgang hinzufuegen + # + # Parameter: 1. Name der Schleife + # 2. Array mit den Variablen fuer den + # Schleifendurchgang + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function add_loop_data($loop,$data) { + if(isset($this->loop_vars[$loop]) && is_array($this->loop_vars[$loop])) { + array_push($this->loop_vars[$loop],$data); + } + else { + $this->loop_vars[$loop] = array($data); + } + } + + # parse() + # + # In der Template definierte Variablen auslesen, Variablen + # ersetzen, {IF}- und {TRIM}-Bloecke parsen + # + # Parameter: -nichts- + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function parse() { + if($this->old_parsing) return $this->parse_old(); + + # Zuerst die Schleifen parsen + + if(is_array($this->loop_vars) && ($loops = array_keys($this->loop_vars))) { + foreach($loops as $loop) { + $this->parse_loop($loop); + } + } - $template = $pre.$post; + # In Template-Datei definierte Variablen auslesen - # Fertig! + $this->get_defined_vars(); - $offset = strlen($pre); - break; - } - } - elseif($template[$x] == '\\') - { - # Ein Backslash wurde gefunden, er dient zum Escapen von Zeichen + # Variablen ersetzen - if($template[$x+1] == 'n') - { - # "\n" in Zeilenumbrueche umwandeln + if(($vars = $this->get_var()) !== false && is_array($vars)) { + $this->parse_if_blocks(); + $this->replace_vars(); + } - $content .= "\n"; - } - else $content .= $template[$x+1]; + # {TRIM}-Bloecke entfernen - $x++; - } - else $content .= $template[$x]; + $this->parse_trim_blocks(); } - else - { - if($name_found == 1) - { - if($var_open == 0) - { - if($template[$x] == '"') $var_open = 1; - else break; - } - } - else - { - # Variablennamen auslesen - - if($template[$x] == '}' && $name != '') - { - # Wir haben einen {DEFINE}-Block - - $name_found = 1; - $define_block = 1; - - # Alles ab hier sollte mit dem Teil verbunden werden, der das - # {DEFINE} in einer Zeile verarbeitet - - # Der Parser fuer {DEFINE}-Bloecke ist nicht rekursiv, was auch - # nicht noetig sein sollte - - if(($end = strpos($template,'{ENDDEFINE}',$x)) !== false) - { - $x++; - - $content = substr($template,$x,$end-$x); - - if($this->get_var($name) === false) - { - # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist - - $this->set_var($name,$content); - array_push($this->defined_vars,$name); + + # parse_old() + # + # In der Template definierte Variablen auslesen, Variablen + # ersetzen, {IF}- und {TRIM}-Bloecke parsen + # (alte Methode) + # + # Parameter: -nichts- + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function parse_old() { + # Zuerst die Schleifen parsen + + if(is_array($this->loop_vars) && ($loops = array_keys($this->loop_vars))) { + foreach($loops as $loop) { + $this->parse_loop($loop); + } } - $pre = substr($template,0,$begin-8); - $post = substr($template,$end+11); - - $template = $pre.$post; - - # Fertig! - - $offset = strlen($pre); - break; - } - else break; - } - elseif($template[$x] != ' ') - { - $name .= $template[$x]; - } - elseif($name != '') - { - $name_found = 1; - } - else break; - } - } - } - } + # Normale Variablen durchgehen - $this->set_template($template); - } + if(($vars = $this->get_var()) !== false && is_array($vars)) { + foreach($vars as $var) { + $val = $this->get_var($var); - # parse_if_block() - # - # IF-Bloecke verarbeiten - # - # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht) - # 2. Status-Code (true => Inhalt anzeigen - # false => Inhalt nicht anzeigen - # 3. true => Verneinten Block nicht parsen - # false => Verneinten Block parsen (Standard) - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + $this->parse_if_block($var,$val); - function parse_if_block($name,$state,$no_negate=0) - { - $template = $this->get_template(); + if(is_array($val)) { + $this->fillin_array($var,$val); + } + else { + $this->fillin($var,$val); + } - $count = 0; + unset($val); + } + } - while(strpos($template,'{IF '.$name.'}') !== false) - { - # Das alles hier ist nicht wirklich elegant geloest... - # ... aber solange es funktioniert... ;-) + # Jetzt dasselbe mit denen, die direkt in der Template-Datei definiert + # sind, machen. Ich weiss, dass das eine ziemlich unsaubere Loesung ist, + # aber es funktioniert - $count++; + $this->get_defined_vars(); - $start = strpos($template,'{IF '.$name.'}'); - $tpl_tmp = substr($template,$start); - $splitted = explode('{ENDIF}',$tpl_tmp); + foreach($this->defined_vars as $var) { + $val = $this->get_var($var); - $block = ''; # Kompletter bedingter Block - $ifs = 0; # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt) + $this->parse_if_block($var,$val); + $this->fillin($var,$val); - # {IF} + unset($val); + } - for($x=0;$xfile.'"'); + # {TRIM}-Bloecke entfernen - $ifs += substr_count($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen - $ifs--; # Zaehler um 1 erniedrigen - $block .= $splitted[$x].'{ENDIF}'; # Daten zum Block hinzufuegen + $this->parse_trim_blocks(); + } + + # fillin() + # + # Variablen durch Text ersetzen + # + # Parameter: 1. Variable zum Ersetzen + # 2. Text, durch den die Variable ersetzt werden soll + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - if($ifs == 0) - { - # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-)) + function fillin($var,$text) { + $template = $this->get_template(); + $template = str_replace('{'.$var.'}',$text,$template); - break; + $this->set_template($template); } - } - $if_block = substr($block,strlen($name)+5,-7); # Alles zwischen {IF} und {ENDIF} + # fillin_array() + # + # Variable durch Array ersetzen + # + # Parameter: 1. Variable zum Ersetzen + # 2. Array, durch das die Variable ersetzt werden soll + # 3. Zeichenkette, mit der das Array verbunden werden soll + # (Standard: '') + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function fillin_array($var,$array,$glue='') { + $this->fillin($var,implode($glue,$array)); + } - # {ELSE} + # replace_vars() + # + # Variablen eine nach der anderen ersetzen. Sollte in einer Variable eine + # andere Variable auftauchen, so wird diese nicht ersetzt. + # + # Parameter: Array mit zu parsenden Variablen (optional) + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - $else_block = ''; # Alles ab {ELSE} - $ifs = 0; # IF-Zaehler + function replace_vars($valid=array()) { + $template = $this->get_template(); - $splitted = explode('{ELSE}',$if_block); + $valid_vars = (empty($valid)) ? $this->get_var() : $valid; - for($x=0;$xget_var($var))) { + $content = implode('',$this->get_var($var)); + } + else { + $content = $this->get_var($var); + } - # Aus dem Rest den ELSE-Block zusammenbauen + # Daten vor und nach der Variable - for($y=$x+1;$yset_template($template); + } - $template = str_replace($block,$replacement,$template); - } + # to_file() + # + # Template in Datei schreiben + # + # Parameter: Datei-Handle + # + # Rueckgabe: Status-Code (Boolean) - $this->set_template($template); + function to_file($handle) { + return @fwrite($handle,$this->get_template()); + } - # Evtl. verneinte Form parsen - - if(!$no_negate) - { - $this->parse_if_block('!'.$name,!$state,1); - } - } + # reset() + # + # Den gesicherten Stand des Template-Textes wiederherstellen + # + # Parameter: -nichts- + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - # parse_trim_blocks() - # - # {TRIM}-Bloecke parsen - # - # Dieser Parser ist nicht rekursiv, was auch nicht - # noetig sein sollte. - # - # Parameter: -nichts- - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function parse_trim_blocks() - { - $template = $this->get_template(); - if(strpos($template,'{TRIM}') === false) return; - - $offset = 0; - - while(($begin = strpos($template,'{TRIM}',$offset)) !== false) - { - if(($end = strpos($template,'{ENDTRIM}',$begin+6)) !== false) - { - $block = substr($template,$begin,$end+9-$begin); - $content = substr($block,6,-9); - - $trimmed = trim($content); - - $template = str_replace($block,$trimmed,$template); - - $offset = $begin+strlen($trimmed); - } - else break; - } - - $this->set_template($template); - } - - # parse_condtag() - # - # Bedingungstags in einem Vorlagentext verarbeiten - # - # Parameter: 1. Tagname - # 2. Status-Code (true => Tag-Inhalt anzeigen - # false => Tag-Inhalt nicht anzeigen - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function parse_condtag($condtag,$state) - { - $template = $this->get_template(); - - while(strpos($template,'<'.$condtag.'>') !== false) - { - $start = strpos($template,'<'.$condtag.'>'); # Beginn des Blocks - $end = strpos($template,'')+strlen($condtag)+3; # Ende des Blocks - - $extract = substr($template,$start,$end-$start); # Kompletten Bedingungsblock extrahieren... - - $replacement = ($state) ? substr($extract,strlen($condtag)+2,0-strlen($condtag)-3) : ''; - - $template = str_replace($extract,$replacement,$template); # Block durch neue Daten ersetzen - } - $this->set_template($template); - } - - # parse_includes() - # - # {INCLUDE}-Anweisungen verarbeiten - # - # Parameter: -nichts- - # - # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - - function parse_includes() - { - $template = $this->get_template(); - if(strpos($template,'{INCLUDE ') === false) return; - - $offset = 0; - - $y = 0; - - while(($begin = strpos($template,'{INCLUDE ',$offset)) !== false) - { - $y++; - - $start = $begin+9; - $offset = $start; - $long = 0; - - if($template[$start] == '"') - { - $long = 1; - $start++; - } - - $file = ''; - $skip = 0; - - for($x=$start;$xtemplate = $this->original; } - elseif($long == 0 && $template[$x] == ' ') - { - $skip = 1; - break; + + # save_state() + # + # Aktuellen Stand des Template-Textes sichern + # (alte Sicherung wird ueberschrieben) + # + # Parameter: -nichts- + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function save_state() { + $this->original = $this->template; } - elseif($long == 1 && $template[$x] == '"') - { - if($template[$x+1] != '}') $skip = 1; - break; + + # parse_loop() + # + # Eine Schleife parsen + # + # Parameter: Name der Schleife + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function parse_loop($name) { + $template = $this->get_template(); + if(strpos($template,'{LOOP '.$name.'}') === false) return; + + $offset = 0; + $name_len = strlen($name); + + while(($begin = strpos($template,'{LOOP '.$name.'}',$offset)) !== false) { + if(($end = strpos($template,'{ENDLOOP}',$begin+6+$name_len)) !== false) { + $block = substr($template,$begin,$end+9-$begin); + $content = substr($block,$name_len+7,-9); + + $parsed_block = ''; + + for($x=0;$xloop_vars[$name]);$x++) { + $loop_data = $this->loop_vars[$name][$x]; + $loop_vars = array_keys($loop_data); + + $ctpl = new Template; + $ctpl->set_template($content); + + foreach($loop_vars as $loop_var) { + $ctpl->set_var($name.'.'.$loop_var,$loop_data[$loop_var]); + } + + if($this->old_parsing) { + $ctpl->parse_old(); + } + else { + $ctpl->parse(); + } + + $parsed_block .= $ctpl->get_template(); + + unset($ctpl); + } + + $template = str_replace($block,$parsed_block,$template); + $offset = $begin+strlen($parsed_block); + } + else break; + } + + $this->set_template($template); + } + + # get_defined_vars() + # + # In der Template-Datei definierte Variablen auslesen + # + # Parameter: -nichts- + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function get_defined_vars() { + $template = $this->get_template(); + if(strpos($template,'{DEFINE ') === false) return; + + $offset = 0; + + while(strpos($template,'{DEFINE ',$offset) !== false) { + $begin = strpos($template,'{DEFINE ',$offset)+8; + $offset = $begin; + + $name = ''; + $content = ''; + + $var_open = 0; + $name_found = 0; + $define_block = 0; + + for($x=$begin;$xget_var($name) === false) { + # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist + + $this->set_var($name,$content); + array_push($this->defined_vars,$name); + } + + # {DEFINE}-Block entfernen + + $pre = substr($template,0,$begin-8); + $post = substr($template,$x+2); + + $template = $pre.$post; + + # Fertig! + + $offset = strlen($pre); + break; + } + } + elseif($template[$x] == '\\') { + # Ein Backslash wurde gefunden, er dient zum Escapen von Zeichen + + if($template[$x+1] == 'n') { + # "\n" in Zeilenumbrueche umwandeln + + $content .= "\n"; + } + else $content .= $template[$x+1]; + + $x++; + } + else $content .= $template[$x]; + } + else { + if($name_found == 1) { + if($var_open == 0) { + if($template[$x] == '"') $var_open = 1; + else break; + } + } + else { + # Variablennamen auslesen + + if($template[$x] == '}' && $name != '') { + # Wir haben einen {DEFINE}-Block + + $name_found = 1; + $define_block = 1; + + # Alles ab hier sollte mit dem Teil verbunden werden, der das + # {DEFINE} in einer Zeile verarbeitet + + # Der Parser fuer {DEFINE}-Bloecke ist nicht rekursiv, was auch + # nicht noetig sein sollte + + if(($end = strpos($template,'{ENDDEFINE}',$x)) !== false) { + $x++; + + $content = substr($template,$x,$end-$x); + + if($this->get_var($name) === false) { + # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist + + $this->set_var($name,$content); + array_push($this->defined_vars,$name); + } + + $pre = substr($template,0,$begin-8); + $post = substr($template,$end+11); + + $template = $pre.$post; + + # Fertig! + + $offset = strlen($pre); + break; + } + else break; + } + elseif($template[$x] != ' ') { + $name .= $template[$x]; + } + elseif($name != '') { + $name_found = 1; + } + else break; + } + } + } + } + + $this->set_template($template); } - elseif($long == 0 && $template[$x] == '}') - { - break; + + # parse_if_block() + # + # IF-Bloecke verarbeiten + # + # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht) + # 2. Status-Code (true => Inhalt anzeigen + # false => Inhalt nicht anzeigen + # 3. true => Verneinten Block nicht parsen + # false => Verneinten Block parsen (Standard) + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function parse_if_block($name,$state,$no_negate=0) { + $template = $this->get_template(); + + $count = 0; + + while(strpos($template,'{IF '.$name.'}') !== false) { + # Das alles hier ist nicht wirklich elegant geloest... + # ... aber solange es funktioniert... ;-) + + $count++; + + $start = strpos($template,'{IF '.$name.'}'); + $tpl_tmp = substr($template,$start); + $splitted = explode('{ENDIF}',$tpl_tmp); + + $block = ''; # Kompletter bedingter Block + $ifs = 0; # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt) + + # {IF} + + for($x=0;$xfile.'"'); + + $ifs += substr_count($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen + $ifs--; # Zaehler um 1 erniedrigen + $block .= $splitted[$x].'{ENDIF}'; # Daten zum Block hinzufuegen + + if($ifs == 0) { + # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-)) + + break; + } + } + + $if_block = substr($block,strlen($name)+5,-7); # Alles zwischen {IF} und {ENDIF} + + # {ELSE} + + $else_block = ''; # Alles ab {ELSE} + $ifs = 0; # IF-Zaehler + + $splitted = explode('{ELSE}',$if_block); + + for($x=0;$xset_template($template); + + # Evtl. verneinte Form parsen + + if(!$no_negate) { + $this->parse_if_block('!'.$name,!$state,1); + } } - else - { - $file .= $template[$x]; + + # parse_if_blocks() + # + # IF-Bloecke zu allen definierten Variablen verarbeiten + # + # Parameter: Array mit zu verarbeitenden IF-Bloecken (optional) + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function parse_if_blocks($valid=array()) { + $valid_vars = (empty($valid)) ? $this->get_var() : $valid; + + foreach($valid_vars as $valid_var) { + $this->parse_if_block($valid_var,$this->get_var($valid_var)); + } } - } - if($skip == 1) continue; + # parse_trim_blocks() + # + # {TRIM}-Bloecke parsen + # + # Dieser Parser ist nicht rekursiv, was auch nicht + # noetig sein sollte. + # + # Parameter: -nichts- + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) - if($file != '') - { - $filepath = $file; + function parse_trim_blocks() { + $template = $this->get_template(); + if(strpos($template,'{TRIM}') === false) return; - $is_absolute = (strtoupper(substr(PHP_OS,0,3)) === 'WIN') - ? preg_match('!^([a-z]:)?/!i',$file) - : preg_match('!^/!',$file); + $offset = 0; - if(!$is_absolute) - { - if(!empty($this->file)) $dir = dirname($this->file); - else $dir = '.'; + while(($begin = strpos($template,'{TRIM}',$offset)) !== false) { + if(($end = strpos($template,'{ENDTRIM}',$begin+6)) !== false) { + $block = substr($template,$begin,$end+9-$begin); + $content = substr($block,6,-9); - $dir = str_replace('\\','/',$dir); + $trimmed = trim($content); - if(!preg_match('!/+$!',$dir)) $dir .= '/'; + $template = str_replace($block,$trimmed,$template); - $filepath = $dir.$file; + $offset = $begin+strlen($trimmed); + } + else break; + } + + $this->set_template($template); } - if(is_file($filepath)) - { - $inc = new Template; - $inc->read_file($filepath); + # parse_condtag() + # + # Bedingungstags in einem Vorlagentext verarbeiten + # + # Parameter: 1. Tagname + # 2. Status-Code (true => Tag-Inhalt anzeigen + # false => Tag-Inhalt nicht anzeigen + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function parse_condtag($condtag,$state) { + $template = $this->get_template(); - $end = ($long == 1) - ? $start + strlen($file) + 2 - : $start + strlen($file) + 1; + while(strpos($template,'<'.$condtag.'>') !== false) { + $start = strpos($template,'<'.$condtag.'>'); # Beginn des Blocks + $end = strpos($template,'')+strlen($condtag)+3; # Ende des Blocks - $pre = substr($template,0,$begin); - $post = substr($template,$end); + $extract = substr($template,$start,$end-$start); # Kompletten Bedingungsblock extrahieren... - $template = $pre.$inc->get_template().$post; - $offset = strlen($pre)+strlen($inc->get_template()); + $replacement = ($state) ? substr($extract,strlen($condtag)+2,0-strlen($condtag)-3) : ''; + + $template = str_replace($extract,$replacement,$template); # Block durch neue Daten ersetzen + } - unset($inc); + $this->set_template($template); } - } - } - $this->set_template($template); - } + # parse_includes() + # + # {INCLUDE}-Anweisungen verarbeiten + # + # Parameter: -nichts- + # + # Rueckgabe: -nichts- (Template-Objekt wird modifiziert) + + function parse_includes() { + $template = $this->get_template(); + if(strpos($template,'{INCLUDE ') === false) return; + + $offset = 0; + + $y = 0; + + while(($begin = strpos($template,'{INCLUDE ',$offset)) !== false) { + $y++; + + $start = $begin+9; + $offset = $start; + $long = 0; + + if($template[$start] == '"') { + $long = 1; + $start++; + } + + $file = ''; + $skip = 0; + + for($x=$start;$xfile)) $dir = dirname($this->file); + else $dir = '.'; + + $dir = str_replace('\\','/',$dir); + + if(!preg_match('!/+$!',$dir)) $dir .= '/'; + + $filepath = $dir.$file; + } + + if(is_file($filepath)) { + $inc = new Template; + $inc->read_file($filepath); + + $end = ($long == 1) + ? $start + strlen($file) + 2 + : $start + strlen($file) + 1; + + $pre = substr($template,0,$begin); + $post = substr($template,$end); + + $template = $pre.$inc->get_template().$post; + $offset = strlen($pre)+strlen($inc->get_template()); + + unset($inc); + } + } + } + + $this->set_template($template); + } } # diff --git a/form-email/config.php b/form-email/config.php index cee87df..13e68b8 100644 --- a/form-email/config.php +++ b/form-email/config.php @@ -1,25 +1,25 @@ -# Letzte Aenderung: 11.1.2009 +# Letzte Aenderung: 7.11.2009 # # Copyright (C) 2002-2011 Patrick Canterino # -# Diese Datei kann unter den Bedingungen der "Artistic License 1.0" +# Diese Datei kann unter den Bedingungen der "Artistic License 2.0" # weitergegeben und / oder veraendert werden. # Siehe: -# http://www.opensource.org/licenses/artistic-license-1.0.php +# http://www.opensource.org/licenses/artistic-license-2.0 # # Empfaenger - wichtigste Einstellung -$mailto = ''; -$aliases = array(); +$mailto = 'patrick@test.local'; +$aliases = array('patrick' => 'patrick@test.local', 'test' => 'test@test.local', 'alle' => 'patrick@test.local; test@test.local'); # Allgemeines @@ -44,6 +44,20 @@ $name_max = 0; $subject_max = 0; $text_max = 0; +# Individuelle Felder + +$user_fields['beruf']['min'] = 5; +$user_fields['beruf']['max'] = 50; +$user_fields['beruf']['optional'] = 0; +$user_fields['beruf']['regex'] = '/^[A-Za-z]$/'; +$user_fields['beruf']['check'] = ''; +$user_fields['beruf']['tpl_var'] = 'BERUF'; + +$user_fields['beruf']['errors']['too_short'] = 'Der Beruf muss mind. 5 Zeichen lang sein!'; +$user_fields['beruf']['errors']['too_long'] = 'Der Beruf darf höchstens 50 Zeichen lang sein!'; +$user_fields['beruf']['errors']['not_set'] = 'Sie haben keinen Beruf eingegeben!'; +$user_fields['beruf']['errors']['no_match'] = 'Der Beruf darf nur aus Buchstaben bestehen!'; + # Sicherheit $only_post = 0; @@ -96,7 +110,7 @@ $err_captcha_session_failure = 'Keine g # Templates -$tpl_mail = 'mail.txt'; +$tpl_mail = 'mail_individual.txt'; $tpl_sent = 'sent.htm'; $tpl_user_error = 'user_error.htm'; $tpl_fatal = 'fatal.htm'; diff --git a/form-email/functions.php b/form-email/functions.php index 9f5937d..f470011 100644 --- a/form-email/functions.php +++ b/form-email/functions.php @@ -1,19 +1,20 @@ -# Letzte Aenderung: 11.1.2009 +# Letzte Aenderung: 7.11.2011 # # Copyright (C) 2002-2011 Patrick Canterino # -# Diese Datei kann unter den Bedingungen der "Artistic License 1.0" +# Diese Datei kann unter den Bedingungen der "Artistic License 2.0" # weitergegeben und / oder veraendert werden. # Siehe: -# http://www.opensource.org/licenses/artistic-license-1.0.php +# http://www.opensource.org/licenses/artistic-license-2.0 # # formdata() diff --git a/form-email/mailer.php b/form-email/mailer.php index 9ff120d..c85d206 100644 --- a/form-email/mailer.php +++ b/form-email/mailer.php @@ -1,20 +1,20 @@ -# Letzte Aenderung: 24.2.2011 +# Letzte Aenderung: 7.11.2011 # # Copyright (C) 2002-2011 Patrick Canterino # -# Diese Datei kann unter den Bedingungen der "Artistic License 1.0" +# Diese Datei kann unter den Bedingungen der "Artistic License 2.0" # weitergegeben und / oder veraendert werden. # Siehe: -# http://www.opensource.org/licenses/artistic-license-1.0.php +# http://www.opensource.org/licenses/artistic-license-2.0 # # =========== @@ -29,16 +29,14 @@ if($only_post && $_SERVER['REQUEST_METHOD'] != 'POST') show_fatal($err_only_post # Wenn Captchas aktiviert sind, Session starten -if($captcha_enable) -{ - session_start(); +if($captcha_enable) { + session_start(); - # Pruefen, ob die zulaessige Zahl der Falscheingaben bei Captchas ueberschritten wurde + # Pruefen, ob die zulaessige Zahl der Falscheingaben bei Captchas ueberschritten wurde - if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) - { - show_fatal($err_captcha_max); - } + if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) { + show_fatal($err_captcha_max); + } } # Bestimmte Werte in Integers umwandeln @@ -92,64 +90,74 @@ $mail_regexp = ($no_tld) if(!preg_match($mail_regexp,$email)) show_user_error($err_invalid_email); +# Individuelle Felder einlesen + +$prepared_user_fields = array(); + +while(list($user_field,$user_field_data) = each($user_fields)) { + $user_field_content = formdata($user_field); + + if(isset($user_field_data['check']) && $user_field_data['check'] != '') { + if(function_exists($user_field_data['check']) && call_user_func($user_field_data['check'],$user_field_content)) { + show_user_error($user_field_data['errors']['check_fail']); + } + } + + if(isset($user_field_data['regex']) && $user_field_data['regex'] != '') { + if(preg_match($user_field_data['regex'],$user_field_content)) { + show_user_error($user_field_data['errors']['match_fail']); + } + } + + $prepared_user_fields[$user_field_data['tpl_var']] = $user_field_content; +} + # Captcha ueberpruefen -if($captcha_enable) -{ - $captcha_input = formdata('captcha'); - $captcha_incorrect = false; - - if(isset($_SESSION) && isset($_SESSION['captcha'])) - { - if($captcha_case) - { - if(!$captcha_input || empty($captcha_input) || $captcha_input != $_SESSION['captcha']) $captcha_incorrect = true; - } - else - { - if(!$captcha_input || empty($captcha_input) || strtolower($captcha_input) != strtolower($_SESSION['captcha'])) $captcha_incorrect = true; - } +if($captcha_enable) { + $captcha_input = formdata('captcha'); + $captcha_incorrect = false; + + if(isset($_SESSION) && isset($_SESSION['captcha'])) { + if($captcha_case) { + if(!$captcha_input || empty($captcha_input) || $captcha_input != $_SESSION['captcha']) $captcha_incorrect = true; + } + else { + if(!$captcha_input || empty($captcha_input) || strtolower($captcha_input) != strtolower($_SESSION['captcha'])) $captcha_incorrect = true; + } - if($captcha_incorrect) - { - if($captcha_max) - { - if(isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed']) - { - $_SESSION['captcha_failed']++; + if($captcha_incorrect) { + if($captcha_max) { + if(isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed']) { + $_SESSION['captcha_failed']++; + } + else { + $_SESSION['captcha_failed'] = 1; + } + } + + if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) { + show_fatal($err_captcha_max); + } + else { + show_user_error($err_captcha_incorrect); + } + } } - else - { - $_SESSION['captcha_failed'] = 1; + else { + show_fatal($err_captcha_session_failure); } - } - - if($captcha_max && isset($_SESSION['captcha_failed']) && $_SESSION['captcha_failed'] >= $captcha_max) - { - show_fatal($err_captcha_max); - } - else - { - show_user_error($err_captcha_incorrect); - } - } - } - else - { - show_fatal($err_captcha_session_failure); - } } # Referer ueberpruefen -if($check_referer) -{ - $referer_ok = semicolon_split($referer_ok); +if($check_referer) { + $referer_ok = semicolon_split($referer_ok); - $referer_parts = parse_url($_SERVER['HTTP_REFERER']); - $referer_host = $referer_parts['host']; + $referer_parts = parse_url($_SERVER['HTTP_REFERER']); + $referer_host = $referer_parts['host']; - if(in_array($referer_host,$referer_ok) === false) show_fatal($err_referer_not_ok); + if(in_array($referer_host,$referer_ok) === false) show_fatal($err_referer_not_ok); } # Zeilenumbrueche in Namen und Betreff durch Leerzeichen ersetzen @@ -166,42 +174,37 @@ $time = strftime($timeformat); $header = ''; -if($friendly_sender) -{ - if($friendly_sender == 2) - { - if(preg_match("/[\200-\377]/",$name)) - { - # Absendernamen mit Base64 codieren - - $encoded_name = base64_encode($name); - $encoded_name = wordwrap($encoded_name,56,"\015\012",1); - $encoded_name = "=?$charset?B?$encoded_name?="; - $encoded_name = str_replace("\015\012","?=\015\012 =?$charset?B?",$encoded_name); - } - else - { - # Bestimmte Zeichen im Absendernamen codieren - - $encoded_name = str_replace('"','\"',$name); - $encoded_name = str_replace('(','\\(',$encoded_name); - $encoded_name = str_replace(')','\\)',$encoded_name); - $encoded_name = '"'.$encoded_name.'"'; - } - - $header = "From: $encoded_name <$email>\n"; - } - else $header = "From: $email\n"; +if($friendly_sender) { + if($friendly_sender == 2) { + if(preg_match("/[\200-\377]/",$name)) { + # Absendernamen mit Base64 codieren + + $encoded_name = base64_encode($name); + $encoded_name = wordwrap($encoded_name,56,"\015\012",1); + $encoded_name = "=?$charset?B?$encoded_name?="; + $encoded_name = str_replace("\015\012","?=\015\012 =?$charset?B?",$encoded_name); + } + else { + # Bestimmte Zeichen im Absendernamen codieren + + $encoded_name = str_replace('"','\"',$name); + $encoded_name = str_replace('(','\\(',$encoded_name); + $encoded_name = str_replace(')','\\)',$encoded_name); + $encoded_name = '"'.$encoded_name.'"'; + } + + $header = "From: $encoded_name <$email>\n"; + } + else $header = "From: $email\n"; } -if($add_header) -{ - if(!$friendly_sender) $header .= "Reply-To: $email\n"; - $header .= 'Content-Type: text/plain; charset="'.$charset.'"'."\n"; - $header .= 'Content-Transfer-Encoding: 8bit'."\n"; - $header .= 'MIME-Version: 1.0'."\n"; - $header .= 'X-Mailer: Form E-Mail 3.4.1'."\n"; - $header .= 'X-Sender-IP: ['.$_SERVER['REMOTE_ADDR'].']'; +if($add_header) { + if(!$friendly_sender) $header .= "Reply-To: $email\n"; + $header .= 'Content-Type: text/plain; charset="'.$charset.'"'."\n"; + $header .= 'Content-Transfer-Encoding: 8bit'."\n"; + $header .= 'MIME-Version: 1.0'."\n"; + $header .= 'X-Mailer: Form E-Mail 3.4.1'."\n"; + $header .= 'X-Sender-IP: ['.$_SERVER['REMOTE_ADDR'].']'; } else $header .= "Reply-To: $email"; @@ -210,12 +213,11 @@ $header = preg_replace("/\015\012|\012|\015/","\n",$header); # Betreff mit Base64 codieren, wenn er Zeichen enthaelt, # die nicht aus dem ASCII-Zeichensatz stammen -if(preg_match("/[\200-\377]/",$subject)) -{ - $encoded_subject = base64_encode($subject); - $encoded_subject = wordwrap($encoded_subject,56,"\015\012",1); - $encoded_subject = "=?$charset?B?$encoded_subject?="; - $encoded_subject = str_replace("\015\012","?=\015\012 =?$charset?B?",$encoded_subject); +if(preg_match("/[\200-\377]/",$subject)) { + $encoded_subject = base64_encode($subject); + $encoded_subject = wordwrap($encoded_subject,56,"\015\012",1); + $encoded_subject = "=?$charset?B?$encoded_subject?="; + $encoded_subject = str_replace("\015\012","?=\015\012 =?$charset?B?",$encoded_subject); } else $encoded_subject = $subject; @@ -229,21 +231,23 @@ $mtpl->set_var('NAME', $name); $mtpl->set_var('SUBJECT',$subject); $mtpl->set_var('TIME', $time); -# ... Umgebungsvariablen einfuegen - -if(isset($allowed_envs) && is_array($allowed_envs)) -{ - foreach($allowed_envs as $allowed_env) - { - if(isset($_SERVER[$allowed_env])) - { - $mtpl->set_var('ENV_'.$allowed_env,$_SERVER[$allowed_env]); - } - else - { - $mtpl->set_var('ENV_'.$allowed_env,''); - } - } +# ... Umgebungsvariablen einfuegen... + +if(isset($allowed_envs) && is_array($allowed_envs)) { + foreach($allowed_envs as $allowed_env) { + if(isset($_SERVER[$allowed_env])) { + $mtpl->set_var('ENV_'.$allowed_env,$_SERVER[$allowed_env]); + } + else { + $mtpl->set_var('ENV_'.$allowed_env,''); + } + } +} + +# ... eigene Felder einfuegen + +while(list($tpl_var,$user_field_content) = each($prepared_user_fields)) { + $mtpl->set_var($tpl_var,$user_field_content); } $mtpl->set_var('TEXT',$text); @@ -258,85 +262,76 @@ $mailtext = preg_replace("/\015\012|\012|\015/","\n",$mailtext); # ... und die Mail abschicken (bei einem Fehler erscheint eine Meldung) -if($recipient && is_array($aliases) && $aliases[$recipient]) -{ - # Empfaenger mit Alias-Namen +if($recipient && is_array($aliases) && $aliases[$recipient]) { + # Empfaenger mit Alias-Namen - $mailto = $aliases[$recipient]; + $mailto = $aliases[$recipient]; } $mailto = semicolon_split($mailto); -for($x=0;$xread_file($tpl_sent); + $stpl = new Template; + $stpl->read_file($tpl_sent); - $stpl->set_var('EMAIL', plain($email)); - $stpl->set_var('MAIL', plain($mailtext)); - $stpl->set_var('NAME', plain($name)); - $stpl->set_var('SUBJECT',plain($subject)); - $stpl->set_var('TEXT', plain($text)); - $stpl->set_var('TIME', plain($time)); + $stpl->set_var('EMAIL', plain($email)); + $stpl->set_var('MAIL', plain($mailtext)); + $stpl->set_var('NAME', plain($name)); + $stpl->set_var('SUBJECT',plain($subject)); + $stpl->set_var('TEXT', plain($text)); + $stpl->set_var('TIME', plain($time)); - $stpl->parse(); + $stpl->parse(); - print $stpl->get_template(); + print $stpl->get_template(); } #