PHP einfaches Kontaktformular macht Zicken

McSnoop

Lt. Junior Grade
Registriert
Dez. 2005
Beiträge
485
Hi@All,

Code:
<?php
// An welche Adresse sollen die Mails gesendet werden?
$zieladresse = '<hier steht sonst eine gültige EmailAdresse>';

// Welche Adresse soll als Absender angegeben werden?
// (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)
$absenderadresse = '';

// Welcher Absendername soll verwendet werden?
$absendername = 'Formnutzer';

// Welchen Betreff sollen die Mails erhalten?
$betreff = 'Anfrage';

// Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?
// Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!
[B]$urlDankeSeite = 'www.<domain>.net/versendet.htm';
[/B]
// Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?
$trenner = ":\t"; // Doppelpunkt + Tabulator

/**
 * Ende Konfiguration
 */

if ($_SERVER['REQUEST_METHOD'] === "POST") {

	$header = array();
	$header[] = "From: ".mb_encode_mimeheader($absendername, "utf-8", "Q")." <".$absenderadresse.">";
	$header[] = "MIME-Version: 1.0";
	$header[] = "Content-type: text/plain; charset=utf-8";
	$header[] = "Content-transfer-encoding: 8bit";
	
    $mailtext = "";

    foreach ($_POST as $name => $wert) {
        if (is_array($wert)) {
		    foreach ($wert as $einzelwert) {
			    $mailtext .= $name.$trenner.$einzelwert."\n";
            }
        } else {
            $mailtext .= $name.$trenner.$wert."\n";
        }
    }

    mail(
    	$zieladresse, 
    	mb_encode_mimeheader($betreff, "utf-8", "Q"), 
    	$mailtext,
    	implode("\n", $header)
    ) or die("Die Mail konnte nicht versendet werden.");
    header("Location: $urlDankeSeite");
    exit;
}

header("Content-type: text/html; charset=utf-8");

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
    <head>
        <title>Einfacher PHP-Formmailer</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
        <form action="" method="post">
            <!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->
            <dl>
                <dt> </dt>

                <dt>Ihr Name:</dt>
                <dd><input type="text" name="Versender" /></dd>

                <dt>Ihre E-Mail:</dt>
                <dd><input type="text" name="E-Mail" /></dd>

                <dt>Anfrage:</dt>
                <dd><textarea name="Anfrage" rows="10" cols="80"></textarea></dd>
            </dl>
            <!-- Ende der Beispielangaben -->
            <p>
            <input type="submit" value="Senden" />
            <input type="reset" value="Zuruecksetzen" />
            </p>
        </form>
    </body>
</html>

Die Betreffende Zeile habe ich fett gemacht.

Ich habe dieses einfache Formular 2mal im Einsatz. Bei der einen seite ist KEINE echte Domain
sondern direkt der Webspace eingetragen. Bei der 2ten Seite ist eine Echte .NET Domain aufgeschaltet.

Bei der wo ich direkt den Webspace anspreche bekomme ich wenn ich auf "Senden" klicke auch die $urlDankeSeite zu sehen, bei der anderen nicht, da bringt er mir die Seite auf der das Formular selber ist allerdings leer??

Verstehe nicht wieso. =(

Habe spaßeshalber als $urlDankeSeite dann den Webspace direkt eingetragen, aber selbes Ergebnis.

VG
 
Hallo clovin01,

gleiches Ergebnis, das hatte ich vorher. Hab zum Test das http:// mal weggelassen und dann hatte ich den Post oben geschrieben. =)

vg
 
thecain schrieb:
Bei Action die Seite noch eintragen wäre mal ein Versuch wert.

Danke das hats gebracht. Allerdings verstehe ich nun erst recht nicht, wieso das bei der anderen seite funktioniert? Die Scripte sind bis auf die Mailadresse und DankeSeite identisch.


Sobber schrieb:
Ist da nicht ein = zuviel?
Würde zum Fehlerbild passen, dass er gar nicht in die If Bedingung erfüllt sieht.

Also die Mails gehen raus. Fand das mit dem === auch schon komisch.
 
Was passt euch daran nicht?
Das ist ein ganz normaler Vergleich - der Unterschied: es wird auch gleich der Datentyp verglichen.

Beispiel:
1==true => true
1===true => false, da 1 kein bool-wert ist ...
1 == "1" => true
1 === "1" => false, da der String (rechts) kein int (links) ist.
1=== 1 => true, da beides int und 1
 
thecain schrieb:
Bei Action die Seite noch eintragen wäre mal ein Versuch wert.

Auch wenns offensichtlich geholfen hat, logisch ist es trotzdem nicht. Formulare mit leere Action senden laut W3C-Spezifikation an sich selbst.
 
voodoo44 schrieb:
Was passt euch daran nicht?
Das ist ein ganz normaler Vergleich - der Unterschied: es wird auch gleich der Datentyp verglichen.

Beispiel:
1==true => true
1===true => false, da 1 kein bool-wert ist ...
1 == "1" => true
1 === "1" => false, da der String (rechts) kein int (links) ist.
1=== 1 => true, da beides int und 1


Danke, wieder was gelernt.


Daaron schrieb:
Auch wenns offensichtlich geholfen hat, logisch ist es trotzdem nicht. Formulare mit leere Action senden laut W3C-Spezifikation an sich selbst.


Also würde er auch generell keine Mail versenden wenn die Action leer ist?



Edit:

Hmm zu früh gefreut. Wenn ich zwar in Action die URL der versendet.htm seite eingebe geht er zwar zu der allerdings verschickt er dann keine Mail.

Lass ich das Feld leer verschickt er eine Mail geht allerdings nicht zur versendet Seite. =(
 
Zuletzt bearbeitet:
notfalls machst du es eben ganz "dirty": nach dem Versenden der Mail ein
include 'dankeSeite.html';
die();
 
McSnoop schrieb:
Also würde er auch generell keine Mail versenden wenn die Action leer ist?

Ne, so mein ich das nicht. Formulare senden ihre Eingabedaten an die Adresse, die in action angegeben ist. Wenn action leer ist, dann sendet das Formular an die eigene Adresse.
Was mit den Formulardaten geschieht (also ob ne Mail rausgeht oder sonstwas) entscheidet die Programmlogik der Seite, die wahlweise über action definiert wurde oder eben der Seite, die das Formular darstellt (wenn action leer ist)
 
"<?php echo $_SERVER['PHP_SELF']; ?>"
Wäre meiner Meinung nach "üblich", um die eigene Seite aufzurufen, wenn man sie nicht direkt schreiben will...

das es nicht funktioniert, wenn du versendet.html in der Action angibst, ist aber logisch. Denn die Action ist so gesehen die Seite, die Aufgerufen wird, um dann da die Programmlogik abzuarbeiten.

Hast du schon mal versucht die Header weiterleitung direkt anzugeben? Also nicht als Variable?
 
Auch wenns offensichtlich geholfen hat, logisch ist es trotzdem nicht. Formulare mit leere Action senden laut W3C-Spezifikation an sich selbst.
Bei HTML5 darf das action Attribut nicht mehr leer sein.
Also besser immer korrekt füllen. Da gibts auch keinen Spielraum mehr für seltsames Verhalten.

PHP:
$_SERVER['PHP_SELF'];
PHP_SELF ist böse, denn es kann XSS Attacken ermöglichen
 
Zurück
Oben