Kontaktformular PHP - eMail-Inhalt wird nicht angezeigt + Capcha
Marc R.
- php
Hallo!
Ich komme einfach nicht bei meiner Kontakt.php weiter, habe fortgeschrittene Erfahrungen im Html, Grundkenntnisse php.
Ich möchte ein Kontaktformular erstellen, dass per SMTP eine Mail generiert.
Optisch ist alle implementiert, leider bekomme ich die Mails jedoch nicht korrek zugesendet.
Die Mailadresse und der Betreff passt,
Daten wie Anschrift, Name, Ort etc werden nur in den Eigenschaften der Mail angezeigt, jedoch nicht wie gewollt in dem eigentlichen "Textbody" der Mail. Auch die eingegebene Nachricht wird nicht mit übermittelt.
Habe zusätzlich noch ein Tolles Capcha (php), was ich auch einfach nicht implementiert bekomme, dazu aber mehr, sobald das erste oben geschilderte Problem gelöst ist.
Ich bitte euch nicht, mir den Quellcode zu schreiben, aber woran liegt es?
while(list($Formularfeld, $Wert)=each($_REQUEST)) bedeutet doch, dass er jeweils alle eingegebenen Daten sammelt und diese dann gesammelt in einer Variiablen ausgibt. Leider aber eben nicht in der Mail als Text...
Hat vielleicht wer einen Rat?
MfG
Marc
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Kontaktt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../files/1458/style/css/content.css" media="screen,print" />
<link rel="stylesheet" type="text/css" href="../files/1458/style/css/layout.css" media="screen" />
<script type="text/javascript" src="../js/lib/prototype.js"></script>
<script type="text/javascript" src="../js/src/scriptaculous.js"></script>
<script type="text/javascript" src="../js/frontend.js"></script>
<script type="text/javascript" src="../files/1458/style/js/layout.js"></script>
<meta name="language" content="de"/>
<meta name="robots" content="index,follow"/>
<meta name="keywords" content="Kontakt"/>
<meta name="description" content="Kontakt"/>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../files/1458/style/img/favicon.ico" type="image/x-icon" rel="icon"/><link href="../files/1458/style/img/favicon.ico" type="image/x-icon" rel="shortcut icon"/>
</head>
<body class="page_24308">
<div class="site_body page_24308 lang_de">
<div class="site">
<div class="site_inner">
<div class="content" id="content">
<div class="content_inner" id="content_inner">
<h1>Kontakt</h1>
<br>
<br>
<?php
$Empfaenger = "test@test.de";
if($_REQUEST['Send'])
{
if(empty($_REQUEST['Name']) || empty($_REQUEST['Email']) || empty($_REQUEST['Nachricht']) || empty($_REQUEST['Betreff']))
{
echo"Bitte gehen Sie <a href=\"javascript:history.back();\">zurück</a> und füllen Sie alle Felder aus!";
}
else
{
$Mailbetreff .= $_REQUEST['Betreff'];
$Trenner = md5(uniqid(time()));
$Header = "From: ".$_REQUEST['Email'];
$Header .= "\n";
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
$Header .= "\n\n";
$Header .= "This is a multi-part message in MIME format";
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: text/plain";
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: 8bit";
$Header .= "\n";
$Header .= "\nDatum/Zeit: ";
$Header .= date("d.m.Y H:i:s");
$Header .= "\n";
$Header .= "Sie haben folgende Nachricht erhalten: \n";
while(list($Formularfeld, $Wert)=each($_REQUEST))
{
if($Formularfeld != "Send" && $Formularfeld != "Nachricht")
{
$Header .= $Formularfeld.": ".$Wert."\n";
}
}
$Header .= "\nDatum/Zeit: ";
$Header .= date("d.m.Y H:i:s");
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: ";
$Header .= $_FILES['Anhang']['type'];
$Header .= "; name=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: base64";
$Header .= "\n";
$Header .= "Content-Disposition: attachment; filename=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n\n";
$Header .= chunk_split(base64_encode($Dateiinhalt));
$Header .= "\n";
$Header .= "--$Trenner--";
mail($Empfaenger, $Mailbetreff,"", $Header);
echo"Vielen Dank für Ihre eMail, wir werden uns umgehend mit Ihnen in Verbindung setzten!";
}
}
else
{
?>
<table border="0" cellpadding="1" cellspacing="2">
<form action="<?php echo$_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<tr>
<td><strong>Name: </strong></td>
<td><input name="Name" size="25" type="text"></td>
</tr>
<tr>
<td>Firma: </td>
<td><input name="Firma" size="25" type="text"></td>
</tr>
<tr>
<td>Adresse: </td>
<td><input name="Adresse" size="25" type="text"></td>
</tr>
<tr>
<td>PLZ & Ort: </td>
<td><input name="PLZ" size="25" type="text"></td>
</tr>
<tr>
<td>Telefon: </td>
<td><input name="Telefon" size="25" type="text"></td>
</tr>
<tr>
<td>Fax: </td>
<td><input name="Fax" size="25" type="text"></td>
</tr>
<tr>
<td><strong>E-Mail: </strong></td>
<td><input name="Email" size="25" type="text"></td>
</tr>
<tr>
<td>Kontaktart:   </td>
<td><select name="Art" size="1"><option>Telefon</option><option>E-Mail</option><option>Post</option></select></td>
</tr>
<tr>
<td><br></td>
<td><br></td>
</tr>
<tr>
<td><strong>Betreff: <strong></td>
<td><input name="Betreff" size="25" type="text"></td>
</tr>
<tr>
<td><strong>Nachricht: </strong></td>
<td><textarea cols="50" name="Nachricht" rows="8"></textarea></td>
</tr>
<tr>
<td><strong>Sicherheitscode wiederholen:   </strong></td>
<td><input type="text" name="sicherheitscode" size="5"></td>
</tr>
<tr>
<td><img src="captcha.php" border="0" title="Sicherheitscode"></td>
<td></td>
</tr>
<tr>
<td align="center" colspan="2"><input name="Send" type="submit" value="Abschicken"> <input name="Reset" type="reset" value="Löschen"></td>
</tr>
</form>
</table>
<?php
}
?>
</body>
</html>
Lieber Marc,
Ich komme einfach nicht bei meiner Kontakt.php weiter, habe fortgeschrittene Erfahrungen im Html, Grundkenntnisse php.
Liebe Grüße,
Felix Riesterer.
Liebe Grüße,
Felix Riesterer.
Ich wollte eigentlich meiner Form treu bleiben und dort den Fehler wissen ;)
Hello,
auf welchem Host (Linux, WinDOS, ...) soll das ablaufen?
Das haben wir hier in den letzten Wochen mehrfach durchdiskutiert, dass es da Unterschiede gibt, die man meistens relativ einfach behandlen kann. Man kann die Scripte so schreiben, dass sie in den meisten Fällen auch problemlosvon einem WinDOS-Host auf eine Unix-Host oder einen (älteren) Mac übertragbar sind (neuere Macs sind quasi BSD-Unix-Hosts).
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
auf welchem Host (Linux, WinDOS, ...) soll das ablaufen?
Das ist noch nicht geklärt, da die Seite noch nicht online geht.
Gibt es da nichts universelles? =)
LG
Hello,
auf welchem Host (Linux, WinDOS, ...) soll das ablaufen?
Das ist noch nicht geklärt, da die Seite noch nicht online geht.
Gibt es da nichts universelles? =)
Du kannst die Funktion so bauen, dass sie auf unterschiedlichen Systemen (fast immer) läuft. Es wird sicherlich auch dann noch Ausnahmen geben, die händisch und individuell angepasst werden müssen.
Um Vinzenz' Gebetsmühle https://forum.selfhtml.org/?t=201700&m=1361158 noch einen weiteren Schubs zu geben, gehe ich nochmal auf seine berechtigten Einwände ein:
Die Verwendung von $_REQUEST ist deshalb so schädlich, weil sie eine Mischung aus $_GET, $_POST und $_COOKIE darstellt
http://php.net/manual/en/reserved.variables.request.php
Es wäre also möglich, Massenmails einfach per "Linkliste" zu versenden, also durch Request einer parametrisierten URL.
example.com/mail.php?send=1&Name=Thomas&Email=abc@localhost.de&Nachricht=Du+bist+doof&Betreff=Verarschung
So einen Link baut Dir jedes Kind zusammen. Das Formular wird nicht benötigt.
Einen Post-Request zu simulieren ist dann schon ein ganz kleines bisschen aufwändiger. Außerdem kann man den nicht so einfach weiterreichen, während ein Link leicht versendbar ist. Der Grund ist, dass ein Post-Request "on-the-fly" in den üblichen Desktopwerkzeugen nicht vorgesehen ist.
Zum Thema: welche Parameter sollen per Mail übertragen werden.
--------------------------------------------------------------
Sicherlich ist die Verwendung von foreach() heute der von while-list()-each() vorzuziehen. Du solltest aber nicht unbedingt einfach die übertragenen Parameter abscannen (iterieren) mit foreach(), sondern eine Vergleichsliste mit den benötigten und optionalen Parametern durchlaufen. Diese vergleichst Du dann mit den erhaltenen Parametern. Fehlt ein mandativer Parameter, gibt es Alarm. Bleibt am Ende ein Paramter in der Post-Liste übrig (dann wurde er unverlangt mitgesendet), gibt es ebenfalls Alarm. Bei den optionalen musst Du selber entscheiden, was geschehen soll.
Zum Thema: welche Inhalte gehören wohin?
----------------------------------------
Attachments gehören in die "additional Headers", nicht in das Message-Argument der mail()-Funktion. Anders lässt sich eine RFC-konforme Mail mit Attachments nicht aufbauen. Hier war Vinzenz etwas ungenau. Die reine Textnachricht gehört allerdings durchaus ins Message-Argument der Funktion.
Alle Header (To, Subject, Additional Headers) müssen codiert werden. Sie dürfen nur (druckbare) ASCII-Zeichen enthalten. Willst Du andere Zeichen versenden, so musst Du diese codieren.
Dazu eigent sich z.B. die Funktion mb_encode_mimeheader()
http://de.php.net/manual/en/function.mb-encode-mimeheader.php
oder die Funktion iconv_mime_encode()
http://de.php.net/manual/en/function.iconv-mime-encode.php
Dazu musst Du wissen, in welcher Codierung die Daten im Script ankommen, also i.d.R., in welcher Codierung das Formular verfasst wurde, das die Daten entgegen nimmt. Der Browser verwendet dann üblicherweise für den Request dieselbe Codierung.
Zum Thema Kontrolle: Affenformular und Trennung der Datenübertragung und des Mailversands
-----------------------------------------------------------------------------------------
Vinzen hat dir ja schon das Affenformular nahegelegt. In dieses Affenformular solltest Du dann die Parameterprüfung einbauen, wie ich sie Dir vorgeschlagen habe. Erst wenn das Affenformular erfolgreich bedient wurde, reichst Du die (in einem Array) gesammelten Daten an deine eigene sendmail()-Funktion weiter. Trenne also den Datenempfang (mit Dialog mit dem Benutzer) und die Weitersendung sauber in (mindestens) zwei Funktionen auf. Das vermeidet Kummer.
Das Thema Captcha: ganz schlechte Idee
--------------------------------------
Ein Captcha einzubauen, ist eine ganz schlechte Idee.
Ein Zeitfenster hilft meistens auch schon sehr gut gegen Roboter-Mails.
Um ein Zeitfenster bereitzustellen, sendest Du beim Aufruf des Mailformulars einen Parameter vom Server mit, der nur eine gewisse Zeit gültigkeit hat. Dieser muss auch beim Rücksenden wieder vorhanden sein. Üblicherweise wird dieser verschlüsselt, damit er sehr schwer erratbar ist, und beim Auswerten des Requests dann wieder entschlüsselt. Wie du ihn ver-/entschlüsselst, das verrätst Du natürlich niemandem.
Wie eng Du dein Zeitfenster machst, ist Versuchssache. Hotti hat einmal die sehr gute Zusatzanregung gegeben, auch die Eingabezeit für die Mail zu berücksichtigen, also z.B. die ersten acht Sekunden nach Formularaufruf auch auszuklammern. So schnell tippt nur ein Roboter, der sofort antwortet. Meistens sammeln die Roboter aber erst die Formulare ein, werten sie in Ruhe aus und senden dann erst nach Stunden die Spam-Mails. Dann wäre aber das Zeitfenster abgelaufen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
in einem Punkt muss ich deiner ausführlichen Darstellung widersprechen.
Zum Thema: welche Inhalte gehören wohin?
Attachments gehören in die "additional Headers", nicht in das Message-Argument der mail()-Funktion. Anders lässt sich eine RFC-konforme Mail mit Attachments nicht aufbauen.
Nein! Das ist falsch!
Attachments sind Teil der eigentlichen Nachricht, KEINE Header.
Es ist zwar nicht ganz trivial, solche Mails mit Attachment korrekt zu erstellen, weil die Sub-Parts korrekt markiert sein müssen und jeder wieder eigene, lokale Header hat. Außerdem muss man unter Umständen mit den MIME-Types multipart/mixed, multipart/related und multipart/alternative aufpassen, vor allem wenn das Endprodukt eine HTML-Mail mit eingebundenen Bildern und einem alternativen Plaintext-Teil sein soll.
Aber dennoch gehört das alles in den Message-Teil.
So long,
Martin
Hello,
in einem Punkt muss ich deiner ausführlichen Darstellung widersprechen.
Aua! Ja Du hast Recht.
Zum Thema: welche Inhalte gehören wohin?
Attachments gehören in die "additional Headers", nicht in das Message-Argument der mail()-Funktion. Anders lässt sich eine RFC-konforme Mail mit Attachments nicht aufbauen.
Nein! Das ist falsch!
Attachments sind Teil der eigentlichen Nachricht, KEINE Header.
Es ist zwar nicht ganz trivial, solche Mails mit Attachment korrekt zu erstellen, weil die Sub-Parts korrekt markiert sein müssen und jeder wieder eigene, lokale Header hat. Außerdem muss man unter Umständen mit den MIME-Types multipart/mixed, multipart/related und multipart/alternative aufpassen, vor allem wenn das Endprodukt eine HTML-Mail mit eingebundenen Bildern und einem alternativen Plaintext-Teil sein soll.
Aber dennoch gehört das alles in den Message-Teil.
Die Inhalte gehören, sauber in Boundaries verpackt, in den Message-Body. Nur die dazugehörigen (einleitenden) Header gehören selbstverständlich in den Header-Teil.
Da der Message-Teil vom Sendmail-Script auch nicht verändert wird, gelten hier auch echte CRLF (#13#10 oder 0x0D 0x0A) als die richtigen Zeilenendezeichen, was man zum Beispiel bei der Funktion word_wrap() beachten muss. Manche eMail-Clients können sonst die base64-codierten Teile, die mit word_wrap() und dem falschen EOL umgegbrochen wurden nicht wieder decodieren.
Nochmal danke für Deinen wichtigen Hinweis.
Jetzt sollten wir also alles beisammen haben, oder? Wäre also an der Zeit, das SelfHTML-Beispiel zu renovieren. Gib mir nur nicht sofort das <I>, ich habe noch eine Baustelle offen...
Aber ich würde mich an einem Wiki-Artikel zu (mehreren, von ganz einfach bis komplex) Form-Mailern beteiligen, wenn sich jemand berufen fühlte, den zu beginnen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Jetzt sollten wir also alles beisammen haben, oder? Wäre also an der Zeit, das SelfHTML-Beispiel zu renovieren. Gib mir nur nicht sofort das <I>, ich habe noch eine Baustelle offen...
ist gut, ich zieh mir den Schuh mal an. Dann wird's aber nicht einfach ein Ersatz für das SELFHTML-Beispiel, sondern ein allgemeiner Leitfaden zur Erstellung von e-Mails "zu Fuß" in Plaintext, in HTML, mit und ohne Attachments. Das Thema "Formmailer" mit seinen diversen Facetten (Kontextwechsel, Codierungen, Spamschutz, Header Injection, Affenformular) wird aber ein wichtiger Teil des Ganzen sein.
Aber bestimmt kann man daraus eine geraffte Fassung speziell für SELFHTML einkochen.
Aber ich würde mich an einem Wiki-Artikel zu (mehreren, von ganz einfach bis komplex) Form-Mailern beteiligen, wenn sich jemand berufen fühlte, den zu beginnen.
Ich werde voraussichtlich zum Wochenende hin ein paar Stunden Zeit dafür reservieren können, und werde das Opus zunächst mal nach und nach auf eigenem Webspace veröffentlichen und hier zur Diskussion stellen.
So long,
Martin
Hello,
Ich werde voraussichtlich zum Wochenende hin ein paar Stunden Zeit dafür reservieren können, und werde das Opus zunächst mal nach und nach auf eigenem Webspace veröffentlichen und hier zur Diskussion stellen.
Das ist super.
Wenn Du durch die letzten drei Monate Archiv recherchierst, sollten eigentlich viele Details zum Thema wieder hochkommen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi ihr beiden, danke für eure Hilfen habe mein Scrit fast fertig gestellt und nun fehlt noch der Feinschliff:
Vielleicht habt Ihr auch noch Lust und Zeit, einmal drüber zu schauen :)
Danke euch im Voraus!
Marc
Hello Ingrid,
Du kannst die Funktion so bauen, dass sie auf unterschiedlichen Systemen (fast immer) läuft. Es wird sicherlich auch dann noch Ausnahmen geben, die händisch und individuell angepasst werden müssen.
das hatte ich doch glatt vergessen:
Für den Zeilenumbruch bei den Headern nimm nicht "\n" und nicht "\r\n", sondern benutze die Konstante PHP_EOL. Dann sollte das Script in den meisten Fällen sowohl auf einem Linux-Host, als auch auf einem WinDOS-Host laufen.
http://php.net/manual/en/reserved.constants.php
http://de.php.net/manual/en/function.mail.php#100563
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo Marc,
es ist eine sehr lobenswerte Einstellung, etwas selbst machen zu wollen. Bei einem Kontaktformular, das Mails verschicken soll, ist es sehr wichtig, darauf zu achten, dass es nicht missbraucht werden kann, d.h. zu einer Spamschleuder werden kann. Dein Kontaktformular kann missbraucht werden.
Was Dir derzeit als Dein Hauptproblem erscheint, liegt daran, dass Du den Parameter der Funktion mail(), der für die Nachricht vorgesehen ist, überhaupt nicht nutzt. Übergib die Nachricht dem dritten Parameter ... und alles wird überhaupt nicht gut :-(
Dazu später mehr.
Die Mailadresse und der Betreff passt,
Nein Marc, die hier angegebene Mailadresse passt nicht! Es ist keine gute Idee, eine Mailadresse der Stiftung Warentest in einem Beispiel zu verwenden.
$Empfaenger = "test@test.de";
Verwende lieber example.org oder eine beliebige andere für diese Zwecke vorgesehene Domain, siehe RFC2606
Ich bitte euch nicht, mir den Quellcode zu schreiben, aber woran liegt es?
while(list($Formularfeld, $Wert)=each($_REQUEST)) bedeutet doch, dass er jeweils alle eingegebenen Daten sammelt und diese dann gesammelt in einer Variiablen ausgibt.
Nein, das bedeutet das nicht. Du solltest Dir eine bessere Grundlage zum Erlernen von PHP suchen, als das was Du bisher benutzt hast.
Es sieht danach aus, als sei es ursprünglich für PHP3 (fast genau zehn Jahre tot) geschrieben worden:
while(list()) ... each() ist dafür ein Anzeichen, seit PHP 4 gibt es dafür foreach.
und danach ganz leicht für PHP4 angepasst worden: immerhin wird auf $_REQUEST zugegriffen.
Zurück zum Thema: man sieht das Kopieren von Werten aus den superglobalen Arrays oft, es ist nur überflüssig, erhöht den Umfang und die Komplexität des Skriptes, verschleiert die Herkunft der Daten. Besser Du gewöhnst Dir dies so schnell wie möglich ab. Superglobale Arrays wie $_POST sind ebenfalls Variablen, Daten müssen aus diesen nicht "gesammelt" oder "abgeholt" werden. Auf diese Variablen darf man ganz normal zugreifen. Die superglobalen Variablen haben den zusätzlichen Vorteil, dass Du auch in Funktionen direkt darauf zugreifen kannst, ohne das Schlüsselwort global zu verwenden.
Nächster Kritikpunkt: Du verwendest die Methode POST, deswegen ist es eine gute Idee, die Daten genau aus $_POST auszulesen - und nicht aus $_REQUEST.
<?php
$Empfaenger = "test@test.de";
if($_REQUEST['Send'])
Wenn Du error_reporting auf E_ALL und display_errors so konfiguriert ist, dass Dir Fehler angezeigt werden, bekämst Du bei Nichtübermittlung von "Send" eine Warnung angezeigt. Sinnvoll wäre hier der Einsatz von empty:
if(![link:http://de2.php.net/manual/de/function.empty.php@title=empty]($_REQUEST['Send']))
... was Dir ja nicht unbekannt ist:
{
if(empty($_REQUEST['Name']) || empty($_REQUEST['Email']) || empty($_REQUEST['Nachricht']) || empty($_REQUEST['Betreff']))
{
echo"Bitte gehen Sie <a href="javascript:history.back();">zurück</a> und füllen Sie alle Felder aus!";
}
aber Du baust Dir hier das nächste Problem ein. Statt Dich auf Javascript zu verlassen, solltest Du die Technik des Affenformulars anwenden und dem Benutzer das Formular erneut vorlegen - mit allen bisherigen Eingaben.
...
$Mailbetreff .= $_REQUEST['Betreff'];
Der Betreff kann beliebige Zeichen enthalten, Du musst den Betreff daher codieren, zum Beispiel mit quoted-printable.
$Trenner = md5(uniqid(time()));
$Header = "From: ".$_REQUEST['Email'];
$Header .= "\n";
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
$Header .= "\n\n";
$Header .= "This is a multi-part message in MIME format";
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: text/plain";
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: 8bit";
$Header .= "\n";
$Header .= "\nDatum/Zeit: ";
$Header .= date("d.m.Y H:i:s");
$Header .= "\n";
$Header .= "Sie haben folgende Nachricht erhalten: \n";
while(list($Formularfeld, $Wert)=each($_REQUEST))
{
if($Formularfeld != "Send" && $Formularfeld != "Nachricht")
{
$Header .= $Formularfeld.": ".$Wert."\n";
}
}
[...]
mail($Empfaenger, $Mailbetreff,"", $Header);
Du versendest einen leeren Inhalt, denn der dritte Parameter ist die Nachricht. Du solltest Deine Nachricht, inklusive Attachments im dritten Parameter übermitteln. Durch das Nutzen der zusätzlichen Header (vierter Parameter) wirst Du anfällig für Header-Injection. Du übernimmst ungeprüft den vom Benutzer gesetzten Wert in den from-Header. Dadurch kann man Dir beliebige Daten in den cc-Header und den bcc-Header schreiben und im Prinzip beliebigen Text von einem beliebigen Absender (sofern dies der Betreiber Deines Mailservers überhaupt zulässt) an beliebige (und beliebig viele) Empfänger senden. Das willst Du ganz bestimmt nicht. Ganz besonders deswegen nicht, weil man noch beliebige Dateien, gern auch mit Malware verseucht, mitverschicken darf ...
Achso: obwohl einige Anregungen von fastix eingebaut wurden, ist auch der SELFHTML-Formmailer angejahrt. Er stammt - und das sieht man ihm mit etwas Erfahrung an - aus dem Anfang dieses Jahrtausends. Statt
<?php echo $_SERVER['PHP_SELF']; ?>
ist keine gute Idee, siehe Archiv, weil Du damit eine XSS-Lücke einbaust.
Freundliche Grüße
Vinzenz
Hallo Marc,
es ist eine sehr lobenswerte Einstellung, etwas selbst machen zu wollen....
Freundliche Grüße
Vinzenz
Super, danke für die fachliche Hilfe, ich werde mir Anfang dieser Woche mal Zeit nehmen und alle einzelnen "Punkte" mal in Ruhe durchgehen.
Die Mailadresse habe ich geändert, da ich eigenlich keine echte veröffentlichen wollte, wie gesagt, mit meiner bekomme ich die Mails, dass aber der Textinhalt der Funktion mail() übergeben wird, habe ich wohl in voller Euphrie übersehen... :(
Ich melde mich, sobald ich das Formular überarbeitet habe, danke soweit!
MfG
Marc
Ich habe mal einen sauberen Schnitt gemacht und alle Deine Ratschläge nach gelesen. Habe ca. zwei Stunden damit verbracht meine "Fehler" auszubessern, bis ich mir das komplette Scrift kaputt gemacht habe.
Nun, habe ich leider gottes und irgendwie tut es mir auch sehr leid, ein Script geschnappt und es entsprechend angepasst. Ich habe aber Deine Ratschläge gelesen und zum grösten Teil verstanden.
Nun bin ich bei dem Thema Captcha / Spam und bekomme meinen vorhandenenes Script von "stoppt-den-spam.info" nicht zum laufen. Die Captcha.php und das entsprechende Bild wurde angelegt und wird korrekt in meiner "Kontakt.php" dargestellt (auch erscheinen random Zahlen).
Nun steht da, man soll den folgenden code verwenden:
<?php
session_start();
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);
//Hier kommt das ursprüngliche Script hin.
}
//optional noch eine Fehlerausgabe:
else{
die ("Der Sicherheitscode ist falsch!");
}
?>
Ich bekomme ewig die Meldung:
'Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampplite\htdocs\de\Kontakt2.php:1) in C:\xampplite\htdocs\de\Kontakt2.php on line 1'
Und das ist mein Problem....
Habe Testweise sogar ein Kontakt2.php angelegt wo nur folgendes drin steht.
<?php session_start();
@include("Kontakt.php")
?>
Hilft aber auch nicht, wenn ich die Kontakt2.php aufrufe, bekomm ich die selbe Fehlermeldung.
Ich weiß, dass die Fehlermeldung bedeutet, dass etwas bereits angezeigt wird bevor session_start(); ausgeführt wird.
Aber wie zum Teufel soll ich das einbinden, hab nach weiteren zwei Stunden keine Lust mehr und vielleicht hat ja noch einmal ein Experte nen Heißen Tipp für mich. Anbei der Code von dem Kontaktformular:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Kontakt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../files/1458/style/css/content.css" media="screen,print" />
<link rel="stylesheet" type="text/css" href="../files/1458/style/css/layout.css" media="screen" />
<script type="text/javascript" src="../js/lib/prototype.js"></script>
<script type="text/javascript" src="../js/src/scriptaculous.js"></script>
<script type="text/javascript" src="../js/frontend.js"></script>
<script type="text/javascript" src="../files/1458/style/js/layout.js"></script>
<meta name="language" content="de"/>
<meta name="robots" content="index,follow"/>
<meta name="keywords" content="Kontakt"/>
<meta name="description" content="Kontakt"/>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../files/1458/style/img/favicon.ico" type="image/x-icon" rel="icon"/><link href="../files/1458/style/img/favicon.ico" type="image/x-icon" rel="shortcut icon"/>
</head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<body class="page_24308">
<div class="site_body page_24308 lang_de">
<div class="site">
<div class="site_inner">
<div class="content" id="content">
<div class="content_inner" id="content_inner">
<h1>Kontakt</h1>
<br>
<br>
<?php
$name="";
$firma="";
$adresse="";
$PLZ="";
$telefon="";
$fax="";
$Email="";
$art="";
$betreff="";
$text="";
if(isset($_POST['abschicken'])){
while(list($feld,$wert)=each($_POST)){
// übermittelte Inhalte "entschärfen"
$wert=preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im", "",$wert);
$$feld=$wert;
if($feld!="abschicken"){
$mailnachricht.=ucfirst($feld).": $wert\n";
}
}
$mailnachricht .="\nDatum/Zeit: ". date("d.m.Y H:i:s");
// Überprüfen ob alle Pflichtfelder gefüllt sind
empty($name) ? $err[] = "<p>- Bitte den Nachnamen angeben.</p>" : false;
empty($Email) ? $err[] = "<p>- Bitte die Email-Adresse angeben.</p>" : false;
empty($betreff) ? $err[] = "<p>- Bitte Betreff angeben.</p>" : false;
empty($text) ? $err[] = "<p>- Welchen Wunsch haben Sie? Bitte den Text eingeben.</p>" : false;
// wenn nicht, werden die Fehlermeldungen ausgegeben und das "halbgefüllte" Formular angezeigt
if(!empty($err)) {
echo "<p>Bitte korrigieren Sie folgende Fehler:</p>";
foreach($err as $fehler){
echo $fehler;
} ?>
<form action="#" method="post" accept-charset="utf-8">
<table width="100%" border="0" cellpadding="3" cellspacing="1">
<tr><td><strong>Name*: </strong></td><td><input name="name" size="25" type="text"></td></tr>
<tr><td>Firma: </td><td><input name="firma" size="25" type="text"></td></tr>
<tr><td>Adresse: </td><td><input name="adresse" size="25" type="text"></td></tr>
<tr><td>PLZ & Ort: </td><td><input name="PLZ" size="25" type="text"></td></tr>
<tr><td>Telefon: </td><td><input name="telefon" size="25" type="text"></td></tr>
<tr><td>Fax: </td><td><input name="fax" size="25" type="text"></td></tr>
<tr><td><strong>E-Mail*: </strong></td><td><input name="Email" size="25" type="text"></td></tr>
<tr><td>Kontaktart:   </td><td><select name="art" size="1"><option>Telefon</option><option>E-Mail</option><option>Post</option></select></td></tr>
<tr><td><br></td><td><br></td></tr>
<tr><td><strong>Betreff*: <strong></td><td><input name="betreff" size="25" type="text"></td></tr>
<tr><td><strong>Nachricht*: </strong></td><td><textarea cols="50" name="text" rows="8"></textarea></td></tr>
<tr><td><strong>Sicherheitscode<br>wiederholen*:   </strong></td><td><img src="captcha.php" border="0" title="Sicherheitscode"></td></tr>
<tr><td></td><td><input type="text" name="sicherheitscode" size="15"><br><br></td></tr>
<tr><td align="center" colspan="2"><input name="abschicken" type="submit" value="Formular abschicken"> <input name="Reset" type="reset" value="Löschen"></td></tr>
</table>
</form>
<p>*Pflichtfelder</p>
<?php // sind keine Fehler vorhanden, wird die Email versendet
} else {
$mailbetreff="Kontaktformular ".$_SERVER['HTTP_HOST'];
$headers = "From: $Email\r\nContent-Type: text/html; charset=UTF-8";
// HIER DIE EMPFÄNGER EMAIL-ADRESSE ANPASSEN!!!
if(mail("adresse@domain.tld", $mailbetreff, $mailnachricht, "From: $Email"."\r\n".'Content-Type: text/plain; charset=UTF-8')){
echo "<p>Ihre eMail ist bei uns eingegangen, vielen Dank!</p>";
} else {
echo "<p>Ein Fehler ist aufgetreten!</p>";
}
}
// das Formular welches als erstes dem Besucher angezeigt wird
} else { ?>
<form action="#" method="post" accept-charset="utf-8">
<table width="100%" border="0" cellpadding="3" cellspacing="1">
<tr><td><strong>Name*: </strong></td><td><input name="name" size="25" type="text"></td></tr>
<tr><td>Firma: </td><td><input name="firma" size="25" type="text"></td></tr>
<tr><td>Adresse: </td><td><input name="adresse" size="25" type="text"></td></tr>
<tr><td>PLZ & Ort: </td><td><input name="PLZ" size="25" type="text"></td></tr>
<tr><td>Telefon: </td><td><input name="telefon" size="25" type="text"></td></tr>
<tr><td>Fax: </td><td><input name="fax" size="25" type="text"></td></tr>
<tr><td><strong>E-Mail*: </strong></td><td><input name="Email" size="25" type="text"></td></tr>
<tr><td>Kontaktart:   </td><td><select name="art" size="1"><option>Telefon</option><option>E-Mail</option><option>Post</option></select></td></tr>
<tr><td><br></td><td><br></td></tr>
<tr><td><strong>Betreff*: <strong></td><td><input name="betreff" size="25" type="text"></td></tr>
<tr><td><strong>Nachricht*: </strong></td><td><textarea cols="50" name="text" rows="8"></textarea></td></tr>
<tr><td><strong>Sicherheitscode<br>wiederholen*:   </strong></td><td><img src="captcha.php" border="0" title="Sicherheitscode"></td></tr>
<tr><td></td><td><input type="text" name="sicherheitscode" size="15"><br><br></td></tr>
<tr><td align="center" colspan="2"><input name="abschicken" type="submit" value="Formular abschicken"> <input name="Reset" type="reset" value="Löschen"></td></tr>
</table>
</form>
<p>*Pflichtfelder</p>
<?php
}
?>
Hallo Marc,
ein Tipp zu Beginn: versuche Deine Probleme in kleinen Schritten zu lösen.
Ich habe mal einen sauberen Schnitt gemacht und alle Deine Ratschläge nach gelesen. Habe ca. zwei Stunden damit verbracht meine "Fehler" auszubessern, bis ich mir das komplette Scrift kaputt gemacht habe.
Nun, habe ich leider gottes und irgendwie tut es mir auch sehr leid, ein Script geschnappt und es entsprechend angepasst.
das fertige Skript ist fragwürdiger als das, was Du bisher hattest.
Ich habe aber Deine Ratschläge gelesen und zum grösten Teil verstanden.
dann solltest Du erkennen, dass ich Dir einen Fehler zu Unrecht angekreidet habe, den dieses fertige Skript begeht.
Nun bin ich bei dem Thema Captcha / Spam und bekomme meinen vorhandenenes Script von "stoppt-den-spam.info" nicht zum laufen.
ok. Du bekommst wie Millionen vor Dir die berühmt-berüchtigt "headers already sent"-Meldung. Kein Problem. Darf ich Dir einen Vorschlag machen: Implementiere zuerst ein Miniformular, das ausschließlich aus dem Captcha (zu deren Fragwürdigkeit ich mich hier nicht auslassen möchte) besteht.
Die Captcha.php und das entsprechende Bild wurde angelegt und wird korrekt in meiner "Kontakt.php" dargestellt (auch erscheinen random Zahlen).
Nun steht da, man soll den folgenden code verwenden:
<?php
session_start();
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);//Hier kommt das ursprüngliche Script hin.
}
//optional noch eine Fehlerausgabe:
else{
die ("Der Sicherheitscode ist falsch!");
}
?>
letzteres ist keine Fehlerausgabe, sondern die Aktion, mit der Du Deine wirklich interessierten Benutzer frustrierst. Ich habe schon manches Captcha erst im dritten Anlauf richtig lösen können. Fand' ich sehr nervend, ganz besonders, weil ich einen Bugreport vornehmen wollte - und davon fast Abstand genommen hätte.
Blende daher im Fehlerfall das Formular erneut ein mit einem neuen Captcha und der Meldung, dass der Sicherheitscode falsch war. Lass das Skript nicht sterben, sondern liefere eine hübsches komplettes HTML-Dokument aus.
> `'Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampplite\htdocs\de\Kontakt2.php:1) in C:\xampplite\htdocs\de\Kontakt2.php on line 1'`{:.language-php}
> Und das ist mein Problem....
>
> Habe Testweise sogar ein Kontakt2.php angelegt wo nur folgendes drin steht.
> ~~~php
> <?php session_start();
> @include("Kontakt.php")
> ?>
Hilft aber auch nicht, wenn ich die Kontakt2.php aufrufe, bekomm ich die selbe Fehlermeldung.
Es darf noch nicht einmal ein Leerzeichen vor <?php stehen, auch kein Zeilenumbruch und Dein Skript - im Falle von UTF-8 darf keine BOM haben. Welchen Editor benutzt Du?
<?php
$name="";
$firma="";
$adresse="";
$PLZ="";
$telefon="";
$fax="";
$Email="";
$art="";
$betreff="";
$text="";if(isset($_POST['abschicken'])){
while(list($feld,$wert)=each($_POST)){
// übermittelte Inhalte "entschärfen"
$wert=preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im", "",$wert);
$$feld=$wert;
if($feld!="abschicken"){
$mailnachricht.=ucfirst($feld).": $wert\n";
}
}
das ist das überflüssige Umkopieren, dazu noch in variable Variablen. Nein, das ist gar nicht schön. Wie Tom Dir bereits nahegelegt hat, solltest Du überhaupt keine Schleife über alle übergebenen Parameter laufen lassen - und diese an dieser unpassenden Stelle "entschärfen".
Wann musst Du Variableninhalte (und nicht nur solche aus Benutzereingaben) speziell behandeln? Dann, wenn Du diese in einen anderen Kontext bringst? Müssen Variablen alle immer und überall auf die gleiche Art behandelt werden. Nein, natürlich nicht. Sie müssen so behandelt werden, wie es der neue Kontext erfordert. dedlfix hat diese Problematik sehr gut aufbereitet (Mail-Versand ist dort nicht das Hauptthema): Artikel Kontextwechsel.
<?php // sind keine Fehler vorhanden, wird die Email versendet
} else {
$mailbetreff="Kontaktformular ".$_SERVER['HTTP_HOST'];
$headers = "From: $Email\r\nContent-Type: text/html; charset=UTF-8";
if(mail("adresse@domain.tld", $mailbetreff, $mailnachricht, "From: $Email"."\r\n".'Content-Type: text/plain; charset=UTF-8')){
[/code]
Warum willst Du die E-Mail-Adresse des Formularbenutzers unbedingt in den FROM-Header bekommen?
a) erlauben das manche Provider überhaupt nicht.
b) gibt es eh' keine vernünftige Prüfung auf eine gültige E-Mail-Adresse
c) hast Du weit weniger Probleme, wenn Du diese Adresse im Mailtext sendest.
d) musst Du die Adresse entweder quoted-printable oder base64-codiert in den
Header-Body schreiben und das verwendete Transfer-Encoding angeben. UTF-8
ist nicht gestattet, auch nicht nach der aktuellen RFC 5322.
Freundliche Grüße
Vinzenz
Hi Vinzens, Hallo liebe "Gehilfen" :)
Vielen Dank noch einmal an Dich Vinzens, für Deine überaus großzügige Hilfe und für die Zeit die Du und die "Anderen" sich für mich bisher genommen haben. Ich habe heute fast den ganzen Tag damit verbracht das Script nahe zu fertig zu stellen. Dein Tipp, mit der Frage welchen Editor ich benutze war sowas von Gold wert :) Ich habe den einfachen Texteditor von Win-Doof benutzt, da ich immer gerne alle manuell eingebe, genau das war mein Grab.... Nach Googlen und nachlesen Deiner Ratschläge, lag es an dem bereits angelegten Header bzw BOM. Mit Dreamwaver, neu angelegter PHP und einfügen des Scriptes hat es dann mit der start_session() geklappt...
Nun, habe ich leider gottes und irgendwie tut es mir auch sehr leid, ein Script geschnappt und es entsprechend angepasst.
das fertige Skript ist fragwürdiger als das, was Du bisher hattest.
Ich denke nun ist es ziehmlich gut überarbeitet.
Ich habe aber Deine Ratschläge gelesen und zum grösten Teil verstanden.
dann solltest Du erkennen, dass ich Dir einen Fehler zu Unrecht angekreidet habe, den dieses fertige Skript begeht.
Konnte ich nicht finden, hilf mir auf die Sprünge :)
if(isset($_POST['abschicken'])){ while(list($feld,$wert)=each($_POST)){ // übermittelte Inhalte "entschärfen" $wert=preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im", "",$wert);
Das ist keine sinnvolle Entschärfung. Sieht eher nach Gießkanne aus.
Die Entschärfung habe ich entfernt, while(list... ist nun foreach ! :)
$$feld=$wert;
Variable Variablen tun immer weh und sind in nahezu allen Fällen ein
ernster Programmierfehler.
if($feld!="abschicken"){ $mailnachricht.=ucfirst($feld).": $wert\n"; } }
das ist das überflüssige Umkopieren, dazu noch in variable Variablen. Nein, das ist gar nicht schön. , solltest Du überhaupt keine Schleife über alle übergebenen Parameter laufen lassen - und diese an dieser unpassenden Stelle "entschärfen".
Dort komme ich im Moment nicht weiter. Wie löse ich dieses Problem, hab da nichts gescheites umsetzten können.... Außerdem möchte ich ein Feld des Arrays nicht ausgeben (Captchacode, "sicherheitscode" bzw $code), das wird in der Mail natürlich mitgesendet.
if(mail("adresse@domain.tld", $mailbetreff, $mailnachricht, "From: $Email"."\r\n".'Content-Type: text/plain; charset=UTF-8')){
[...]
[/code]
Warum willst Du die E-Mail-Adresse des Formularbenutzers unbedingt in den FROM-Header bekommen?
Ist nun geändert in "From: Kontaktformular"."\r\n".'Content.....
Vielleicht hast Du jetzt noch einmal Zeit das Script "durchzusehen" ich denke soweit ist es mir recht gelungen. Bis auf die Schleife oben bei der $$feld=$wert etc...
LG und vielen vielen Dank bis hier her! Marc
<?php
$name="";
$firma="";
$adresse="";
$PLZ="";
$telefon="";
$fax="";
$Email="";
$art="";
$betreff="";
$text="";
$code="";
if(isset($_POST['abschicken'])){
foreach ($_POST as $feld => $wert){
//$wert=preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im", "",$wert);
$$feld=$wert; // Wie kann ich das vermeiden?
if($feld!="abschicken"){
$mailnachricht.=ucfirst($feld).": $wert\n"; // Hier wird auch $code übergeben ("sicherheitscode, Captcha) wie kann ich das unterdrücken?
}
}
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);
}
else{
empty($code) ? $err[] = "": false;
}
empty($name) ? $err[] = "" : false;
empty($Email) ? $err[] = "" : false;
empty($betreff) ? $err[] = "" : false;
empty($text) ? $err[] = "" : false;
$mailnachricht .="\nDatum/Zeit: ". date("d.m.Y H:i:s");
if(!empty($err)) {
echo "<p><font color=red><p align=><strong> </p>";
foreach($err as $fehler){
echo $fehler;
}
?>
<form action="#" method="post" accept-charset="utf-8">
<table width="100%" border="0" cellpadding="3" cellspacing="1">
<?php if(empty($name)){?>
<tr><td><strong><font color=red>Name*: </font></strong></td><td><input name="name" size="25" type="text"></td></tr><?php }
else{?>
<tr><td>Name*: </td><td><input name="name" size="25" type="text" value="<?php echo $name;?>"></td></tr><?php }?>
<tr><td>Firma: </td><td><input name="firma" size="25" type="text" value="<?php echo $firma;?>"></td></tr>
<tr><td>Adresse: </td><td><input name="adresse" size="25" type="text" value="<?php echo $adresse;?>"></td></tr>
<tr><td>PLZ & Ort: </td><td><input name="PLZ" size="25" type="text" value="<?php echo $PLZ;?>"></td></tr>
<tr><td>Telefon: </td><td><input name="telefon" size="25" type="text" value="<?php echo $telefon;?>"></td></tr>
<tr><td>Fax: </td><td><input name="fax" size="25" type="text" value="<?php echo $fax;?>"></td></tr>
<?php if(empty($Email)){?>
<tr><td><strong><font color=red>E-Mail*: </font></strong></td><td><input name="Email" size="25" type="text"></td></tr>
<?php }
else{?>
<tr><td>E-Mail*: </td><td><input name="Email" size="25" type="text" value="<?php echo $Email;?>"></td></tr><?php }?>
<tr><td>Gewünschte<br />Kontaktart:   </td><td><select name="art" size="1"><option>Telefon</option><option>E-Mail</option><option>Post</option></select></td></tr>
<tr><td><br></td><td><br></td></tr>
<?php if(empty($betreff)){?>
<tr><td><strong><font color=red>Betreff*: </font></strong></td><td><input name="betreff" size="25" type="text"></td></tr><?php }
else{?>
<tr><td>Betreff*: </td><td><input name="betreff" size="25" type="text" value="<?php echo $betreff;?>"></td></tr><?php }?>
<?php if(empty($text)){?>
<tr><td><strong><font color=red>Nachricht*: </font></strong></td><td><textarea cols="50" name="text" rows="8" value="<?php echo $text;?>"></textarea></td></tr><?php }
else{?>
<tr><td>Nachricht*: </td><td><textarea cols="50" name="text" rows="8" value="<?php echo $text;?>"></textarea></td></tr><?php }?>
<?php if(empty($code)){?>
<tr><td><strong><font color=red>Sicherheitscode wiederholen*:   </font></strong></td><td><img src="captcha.php" border="0" title="Sicherheitscode"></td></tr><?php }
else{?>
<tr><td>Sicherheitscode wiederholen*:   </td><td><img src="captcha.php" border="0" title="Sicherheitscode"></td></tr><?php }?>
<tr><td></td><td><input type="text" name="sicherheitscode" size="15"><br><br></td></tr>
<tr><td align="center" colspan="2"><input name="abschicken" type="submit" value="Formular abschicken"> <input name="Reset" type="reset" value="Löschen"></td></tr>
</table>
</form>
<p>*Pflichtfelder</p>
<?php
// sind keine Fehler vorhanden, wird die Email versendet
} else {
$mailbetreff="Kontaktformular ".$_SERVER['HTTP_HOST'];
if(mail("adresse@domain.tld", $mailbetreff, $mailnachricht, "From: Kontaktformular"."\r\n".'Content-Type: text/plain; charset=UTF-8')){
echo "<p>Ihre eMail ist bei uns eingegangen, vielen Dank!</p>";
}
else {
echo "<p>Ein Fehler ist aufgetreten! Bitte kontaktieren Sie uns manuel. Mailadresse: adresse[at]domain.tld</p>";
}
}
// das Formular welches als erstes dem Besucher angezeigt wird
} else { ?>
<form action="#" method="post" accept-charset="utf-8">
<table width="100%" border="0" cellpadding="3" cellspacing="1">
<tr><td><strong>Name*: </strong></td><td><input name="name" size="25" type="text"></td></tr>
<tr><td>Firma: </td><td><input name="firma" size="25" type="text"></td></tr>
<tr><td>Adresse: </td><td><input name="adresse" size="25" type="text"></td></tr>
<tr><td>PLZ & Ort: </td><td><input name="PLZ" size="25" type="text"></td></tr>
<tr><td>Telefon: </td><td><input name="telefon" size="25" type="text"></td></tr>
<tr><td>Fax: </td><td><input name="fax" size="25" type="text"></td></tr>
<tr><td><strong>E-Mail*: </strong></td><td><input name="Email" size="25" type="text"></td></tr>
<tr><td>Gewünschte<br />Kontaktart:   </td><td><select name="art" size="1"><option>Telefon</option><option>E-Mail</option><option>Post</option></select></td></tr>
<tr><td><br></td><td><br></td></tr>
<tr><td><strong>Betreff*: <strong></td><td><input name="betreff" size="25" type="text"></td></tr>
<tr><td><strong>Nachricht*: </strong></td><td><textarea cols="50" name="text" rows="8"></textarea></td></tr>
<tr><td><strong>Sicherheitscode<br>wiederholen*:   </strong></td><td><img src="captcha.php" border="0" title="Sicherheitscode"></td></tr>
<tr><td></td><td><input type="text" name="sicherheitscode" size="15"><br><br></td></tr>
<tr><td align="center" colspan="2"><input name="abschicken" type="submit" value="Formular abschicken"> <input name="Reset" type="reset" value="Löschen"></td></tr>
</table>
</form>
<p>*Pflichtfelder</p>
<?php
}
?>