Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#1 2010-08-01 19:12:16

fantasmo
Member
Registered: 2010-05-05
Posts: 40

[de-de] php kontaktformular sendet nicht

Hallo,

ich habe in meiner Seite ein eigens Kontaktformular eingebaut, was ich auf anderen Webseiten schon problemlos verwende…es ist also kein txp plugin…

Nun funktioniert es aber auf meiner TXP-Seite nicht, evtl. hab ich vielleicht was mit den PHP-Befehlen falsch gemacht. Ich verwende schon diese <txp:php>-Tags aber irgendwie gehts nicht.

Der Code sieht so aus (ja, das (at)-Zeichen hats hier nicht dargestellt, ist aber im Original drin):
<txp:php>
session_start();
if(isset($_POST['submit'])) {
if(!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message']) && !empty($_POST['code'])) {
if($_POST['code'] == $_SESSION['rand_code']) {
$name = $_POST['name']; $email = $_POST['email']; $nachricht = $_POST['message']; $message = $name." MIT FOLGENDER EMAIL-ADRESSE ".$email." HAT &Uuml;BER MEINE WEBSEITE FOLGENDES
GESCHRIEBEN: \n \n".$nachricht; mail('mailmeineseite.de’, ‘KONTAKT meineseite.de’, $message);@ $accept = "Vielen Dank f&uuml;r die Nachricht. Ich melde mich in K&uuml;rze."; } else { $error = "Bitte nocheinmal den Spamschutz-Code pr&uuml;fen."; }
} else {
$error = "Bitte das ganze Formular ausf&uuml;llen.";
}
}
// correct the php.ini of my provider to fix session url rewriting in forms
ini_set( 'arg_separator.output' , '&amp;' );
ini_set( 'url_rewriter.tags' , 'a=href,area=href,frame=src,input=src,fieldset=' );
</txp:php>

<txp:php> if(!empty($error)) echo '<div class="error">'.$error.'</div>'; </txp:php>
<txp:php> if(!empty($accept)) echo '<div class="accept">'.$accept.'</div>'; </txp:php>

<form action="<txp:php>echo $_SERVER['PHP_SELF'];</txp:php>" method="post" enctype="multipart/form-data">
<fieldset class="kontakt">
<div class="fields">
<p class="label">Name*:</p>
<p <input type="text" name="name" /></p>
<p class="label">Email*:</p>
<p><input type="text" name="email" /></p>
<p class="label">Deine Nachricht*:</p>
<p><textarea name="message" rows="10" cols="10"></textarea></p>
</div>
<div class="captcha">
<img class="noborder" src="<txp:site_url />files/js/captcha.php" alt="captcha-Bild" />
<p class="small">Bitte gib die Buchstabenfolge von oben ein:</p>
<p><input class="captcha" type="text" name="code" /></p>
<p class="clear"><input type="submit" name="submit" value="absenden" class="button" /></p>

Also bei “action” müsste es zumindest eigentlich die selbe Seite nochmal aufrufen und auch die Eingaben prüfen und ggf. Warnhinweise anzeigen. Machts aber nicht, es springt einfach auf die index.php und versendet wird auch nichts.

Weiß jemand was falsch ist?
Oder kann man aus Textpattern heraus das gar nicht so machen, wie ich mir das gedacht hatte? Dieses Mailformular hab ich bis jetzt problemlos auf statischen Seiten eingebunden.

Offline

#2 2010-08-01 21:07:31

ruud
Developer Emeritus
From: a galaxy far far away
Registered: 2006-06-04
Posts: 5,068
Website

Re: [de-de] php kontaktformular sendet nicht

Read the part about variable scope here
And consider using zem_contact_reborn instead.

Offline

#3 2010-08-01 22:36:44

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] php kontaktformular sendet nicht

Für die Website von miramicus, wo für jeden Kurs eigene Anmeldeformulare ausgegeben werden, habe ich das so gelöst: Nach <txp:php>if(isset($_POST['senden'])) { und einigen andern Anweisungen gibt’s ein include_once(txpath.'/verzeichnis/anmeldungs-script.inc.php');. Die Datei “anmeldungs-script.inc.php” befindet sich in einem eigenen Verzeichnis und ruft wiederum das benötigte Formular auf.

Nach einigem Kopfzerbrechen und guter Hilfe aus diesem Forum funktioniert das nun genau so wie gewollt.

Offline

#4 2010-08-02 10:57:04

fantasmo
Member
Registered: 2010-05-05
Posts: 40

Re: [de-de] php kontaktformular sendet nicht

Danke für die Antworten, naja aber ich kenne mich leider nicht so gut in php aus, als dass ich wüsste, wo ich jetzt genau was ändern muss und wie das mit “variable scope” gemeint ist:-(…

“Zem Contact Reborn” hatte ich ausprobiert, es war mir aber zu unflexibel und ich glaube, auch nicht w3c-valide… ich kann das ja doch nochmal probieren. Komplexe PHP-Programmierungen kann ich aber leider selbst nicht umsetzen.

Offline

#5 2010-08-02 11:36:57

ruud
Developer Emeritus
From: a galaxy far far away
Registered: 2006-06-04
Posts: 5,068
Website

Re: [de-de] php kontaktformular sendet nicht

You have three separate <txp:php> code blocks. If you combine them into one big <txp:php> code block, you won’t have problems with variable scope. Right now, you’re defining $error in the first block of code and you’re trying to use it in the 2nd and 3rd block of PHP code, but the $error variable isn’t known there, because it’s neither a global variable nor was it defined there.

Zem_contact_reborn should be W3C valid.

Offline

#6 2010-08-02 11:57:50

fantasmo
Member
Registered: 2010-05-05
Posts: 40

Re: [de-de] php kontaktformular sendet nicht

Ok, alles klar…ja das macht Sinn… vielen Dank.
Ich habe den großen Codeblock oben jetzt zusammen zwischen die <txp:php>-Tags geschrieben.

Es funktioniert aber trotzdem noch nicht, bestimmt wegen dieser Stelle…
<form action="<txp:php>echo $_SERVER['PHP_SELF'];</txp:php>" method="post" enctype="multipart/form-data">

Muss ich anstatt PHP_SELF etwas anderes schreiben?

Im Quellcode steht an dieser Stelle nämlich auch “/index.php”, so wie ich das Kontaktformular aber von anderen Seiten kenne, müsste da die Kontaktseite, also “kontakt.php” stehen (und AUF der Kontaktseite stehen dann auch die eventuellen Fehlermeldungen oder die Erfolgsmeldung, wenn die Nachricht verschickt wurde.

Kann ich dem Codeblock oben evtl. einen Namen geben und diesen Namen dann irgendwie unten bei “action” reinschreiben, damit “action” weiß, was es aufrufen soll?

EDIT:
Oder geht das nicht?
Dann doch lieber alles, was oben zwischen den <txp:php>-Tags steht in eine eigene php-Datei und bei “action” diese z.B. so(?…) aufrufen:
echo <txp>get_include_path(meineseite.de/files/meincode.php));</txp:php>

Last edited by fantasmo (2010-08-02 12:08:02)

Offline

#7 2010-08-02 13:10:40

ruud
Developer Emeritus
From: a galaxy far far away
Registered: 2006-06-04
Posts: 5,068
Website

Re: [de-de] php kontaktformular sendet nicht

If you only use this form in one single place and the URL for the form is always the same, you can replace the <txp:php>echo $_SERVER['PHP_SELF'];</txp:php> part with the URL for the form.

Offline

#8 2010-08-02 13:40:48

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] php kontaktformular sendet nicht

Im oben erwähnten Formular verwende ich:

<form action="<?php function urlSetzen() {if (serverSet('REQUEST_URI') and serverSet('HTTP_HOST')) {return PROTOCOL.serverSet('HTTP_HOST').serverSet('REQUEST_URI');} return '';} echo urlSetzen(); ?>" method="post">

Die Lösung stammt aus diesem Forumseintrag von trenc.

Offline

#9 2010-08-02 13:56:20

fantasmo
Member
Registered: 2010-05-05
Posts: 40

Re: [de-de] php kontaktformular sendet nicht

Wenn ich in “action” den Code so aufrufe “<txp:site_url />files/meincode.php”, dann wird er ausgeführt… das ist schonmal gut…:-)
Aber nicht IM Kontext meiner Kontaktseite. Also es erscheint einfach eine weiße Seite, mit z.B. dem Text “Bitte fülle alle Felder” aus.
Es soll aber IM Kontaktformular auf der Kontaktseite stehen.

Im Forum habe ich etwas gefunden, und ich wollte eine Variable oben im Code anlegen, die dann unten bei “action” gelesen wird… das ging aber nicht.. Ich habe folgendes probiert:

Oben im Code:
$link_name = $_SERVER['PHP_SELF'];

Unten bei “action”:
action="{$link_name}"

Das ging aber nicht, vielleicht ist nur ein ganz kleiner Tippfehler drin?!

Offline

#10 2010-08-02 15:01:56

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] php kontaktformular sendet nicht

Ich kann mir deinen gesamten Kode nicht vorstellen.

Deswegen hier etwas ausführlicher, wie ich das gemacht habe.

In einem dafür vorgesehenen Verzeichnis gibt es zwei Dateien, schema-script.inc.php und schema-formular.inc.

In einem TxP-Baustein binde ich schema-script.inc.php ein:

<txp:php>if(isset($_POST['senden'])) {
// beliebiger Kode
include_once(txpath.'/verzeichnis/schema-script.inc.php');
} else {
// beliebiger Kode
include_once(txpath.'/verzeichnis/schema-script.inc.php');
}</txp:php>

Der Inhalt von schema-script.inc.php ist:

<?php
$emailZiel		 = "info@domain.xy";
$betreff 		 = "Betreff";	// keine Umlaute!

//		   folgende drei Felder stehen zur Verfügung um in vorgegebenen $emailText eingesetzt zu werden

$txt_title		 = strtr(title(array()), array('_' => ''));
$custom_1		 = custom_field(array('name' => 'custom_1'));
$custom_2		 = custom_field(array('name' => 'custom_2'));

//		   usw.

$text_vor_form	 = "<h3>Text</h3>\r\n";
$text_vor_form	.= "<p>Absatz.</p>\r\n";

$notwendig		 = "<h3>Text</h3>\r\n";
$notwendig		.= "<div id=\"notwendig\">\r\n";
$notwendig		.= "<p>Was notwendig ist.</p>\r\n";
$notwendig		.= "</div>\r\n";

$fehlerAnfang	 = "<div id=\"fehler\">\r\n<p><strong>(…) konnte nicht gesendet werden!</strong></p>\r\n<p>";
$fehlerEnde		 = "</p>\r\n</div>\r\n";

$vorname		 = $_POST['vorname'];
$name			 = $_POST['name'];

//		   usw. mit Formularfeldern

$emailText		 = "Text \"".$custom_1."\" Text.\r\n\r\nText: ".$custom_2."\r\n";
$emailText		.= "Text.\r\n\r\n";
$emailText		.= $mitteilung;
$emailText		.= $vorname." ".$name."\r\n";

//		   usw.

$bestaetigung	 = "<h2>(…) versendet</h2>\r\n<div id=\"versendet\">\r\n<p>Ihre (…) wurde gesendet, mit Kopie an Ihre E-Mail-Adresse.</p>\r\n<p>Sie werden sobald als möglich eine Antwort erhalten.</p>\r\n</div>\r\n";

$testvorgabe	 = '/^[^\d@;:?¿¡!%=<>©|\r\n]{2,40}$/iu'; // ist nur ein Beispiel

//		   usw.

if (isset($_POST['senden'])) {

//	if Testabfrage

//	elseif Testabfrage

//	usw.

	else {

		$headers  = "From: ".$vorname." ".$name." <".$emailAbsender.">\r\n";
		$headers .= "CC: ".$emailAbsender."\r\n";
		$headers .= "Mime-Version: 1.0\r\n";
		$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
		$headers .= "Content-Transfer-Encoding: 8bit\r\n";

		mail ($emailZiel, $betreff, $emailText, $headers);

		echo $bestaetigung;
	}
} else {
	include_once("schema-formular.inc");
}
?>

Der Inhalt von schema-formular.inc ist:

<div id="xy">
<h2>Titel</h2>
<?php echo $text_vor_form; ?>
<form action="<?php function urlSetzen() {if (serverSet('REQUEST_URI') and serverSet('HTTP_HOST')) {return PROTOCOL.serverSet('HTTP_HOST').serverSet('REQUEST_URI');} return '';} echo urlSetzen(); ?>" method="post">
<?php echo $notwendig; ?>
<fieldset>
<label for="vorname">Vorname</label>
<input type="text" id="vorname" name="vorname" size="30" maxlength="30" value="<?php echo $vorname; ?>" />
<label for="name">Name</label>
<input type="text" id="name" name="name" size="30" maxlength="30" value="<?php echo $name; ?>" />

<!-- usw. -->

<label for="email">Ihre E-Mail-Adresse</label>
<input type="text" id="email" name="email" size="40" maxlength="40" value="<?php if(empty($emailAbsender)) echo "@"; else echo $emailAbsender; ?>" />
<label for="mitteilung">Ihre Mitteilung</label>
<textarea id="mitteilung" name="mitteilung" rows="8" cols="52"><?php echo $mitteilung; ?></textarea>

<!-- usw. -->

<button type="submit" name="senden">Senden</button>
</fieldset>
</form>
</div>

Das sind, wie die Namen sagen, Schemen, die erweitert werden können.

Hoffentlich haben sich beim Reduzieren keine Fehler eingeschlichen.

Offline

#11 2010-08-02 15:37:33

ruud
Developer Emeritus
From: a galaxy far far away
Registered: 2006-06-04
Posts: 5,068
Website

Re: [de-de] php kontaktformular sendet nicht

GugUser, I see several problems with that code:
  • it’s vulnerable to email header injections, allowing spammers to abuse the contact form to send mail to any email address.
  • it doesn’t do proper mime-encoding for headers.

Offline

#12 2010-08-02 15:48:42

GugUser
Member
From: Quito (Ecuador)
Registered: 2007-12-16
Posts: 1,477

Re: [de-de] php kontaktformular sendet nicht

@ ruud

It’s vulnerable to email header injections, allowing spammers to abuse the contact form to send mail to any email address.

Die Sicherheitsvorkehrungen befinden sich nicht im als “Schema” bezeichneten Script, weil ich diese aus hoffentlich verständlichen Gründen nicht zeigen will. Das Formular kann nur unter gewissen Voraussetzungen abgeschickt werden. Bis jetzt (nach etwa einem Jahr) gibt es keine negativen Erfahrungen. Hoffentlich bleibt das so!

It doesn’t do proper mime-encoding for headers.

Nach langem Ausprobieren war das das Mime-Encoding, welches mit meinem Hoster funktionierte, ausser, dass im Betreff keine Umlaute stehen dürfen. Das ist nicht befriedigend, ich fand bis jetzt aber keine bessere Lösung.

Dazu muss ich anfügen, dass in der .htaccess-Datei AddDefaultCharset utf-8 steht. Mir ist nicht klar, ob das einen Einfluss auf die über das Formular verschickten eMails hat.

Danke für deine kritischen Bemerkungen!

Und falls du Ergänzungen machen willst, nehme ich die dankbar entgegen. Mein Ziel ist es, Schwachstellen zu verbessern, bin aber bezüglich PHP Autodidakt mit den diesbezüglichen Nachteilen.

Sicherheit ist auf jeden Fall ein wichtiges Thema bei Formularen.

Offline

Board footer

Powered by FluxBB