6.6k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von coros Experte (4k Punkte)
Hallo an Alle!

Ich habe im Netz einen Code gefunden, mit dem ein User mir von meiner Homepage aus eine Nachricht zukommen lassen kann. Dieser funktioniert auch super. Nun möchte ich aber noch, dass der User an die Mailadresse, die er in einem Pflichtfeld „Mail“ eingetragen hat, eine Bestätigungsmail mit der Anrede des Namens, den er im Feld „Name“ eingetragen hat und dann mit einem vordefinierten Text zugesandt bekommt. Allerdings fehlen mir hierzu die entsprechenden PHP- Kenntnisse und daher baue ich auf Euch. Kann mir jemand sagen kann, was ich wo noch ergänzen muss, damit obig beschriebenes beim Betätigen des Buttons ausgeführt wird?

Nachfolgend mal der PHP-Code:
<?php
define ('MAILTO', "mail@example.org"); // Empfänger hier eintragen
define ('MAILFROM', "Kontaktformular"); // ggfls. Absender hier eintragen
define ('CHARSET', "ISO-8859-15"); // Zeichenkodierung ggfls. anpassen
$Pflichtfelder = array('Nachricht', 'Mail'); // ggfls. weitere Pflichtfelder angeben

$AddHeader = 'Content-Type: text/plain; charset='.CHARSET;
if(MAILFROM) $AddHeader .= chr(13).chr(10).'From: '.MAILFROM;

if($Formular_abgeschickt = !empty($_POST)) {
$Formular_leer = true; set_magic_quotes_runtime(0);
$_POST = array_map('Formular_Daten', $_POST);
}
function Formular_Daten($val) {
global $Formular_leer;
if(is_array($val)) return array_map('Formular_Daten', $val);
if(get_magic_quotes_gpc()) $val = stripslashes($val);
if($val = trim($val)) $Formular_leer = false;
return $val;
}

function Formular_Pflichtfelder() {
global $Pflichtfelder;
$Fehler = '';
foreach ($Pflichtfelder as $Feld) {
$key = str_replace(' ','_',$Feld);
if(!(isset($_POST[$key]) && trim($_POST[$key]))) {
if($Fehler) $Fehler .= '<br />';
$Fehler .= 'Pflichtfeld "' . $Feld . '" nicht ausgefüllt.';
}
}
return $Fehler;
}

function Formular_neu($log='.htPOSTdata.txt') {
if(file_exists($log) && is_readable($log)
&& file_get_contents($log) == print_r($_POST,true))
return false;
if($handle=@fopen($log, 'w')) {
fwrite($handle, print_r($_POST,true)); fclose($handle);
}
return true;
}

function Formular_Check() {
global $Formular_leer;
if($Formular_leer) $Fehler = 'Keine Daten eingetragen.';
elseif(!$Fehler = Formular_Pflichtfelder()) {
if(!Formular_neu()) $Fehler = 'Nachricht war bereits verschickt.';
}
return $Fehler;
}

function Formular_Eingabe($Feldname, $def='') {
if(!empty($_POST[$Feldname])) echo htmlspecialchars($_POST[$Feldname]);
else echo $def;
}
?>
<!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" lang="de">
<head>
<title>Kontaktformular</title>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>" />
</head>
<body>
<h1>Kontakt</h1>

<?php
if($Formular_abgeschickt) {
if($Formular_Fehler = Formular_Check())
echo '<p class="Meldung" id="Fehler">',$Formular_Fehler,'</p>';
elseif(@mail(MAILTO, "Nachricht", print_r($_POST,true), $AddHeader))
echo '<p class="Meldung" id="OK">Nachricht verschickt.</p>';
else echo '<p class="Meldung" id="Fehler">Server-Fehler !</p>';
}
?>

<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post"
enctype="multipart/form-data" accept-charset="<?php echo CHARSET; ?>">
<fieldset><legend>Kontaktformular</legend>
<p>
<label for="Name">Name:</label>
<input name="Name" id="Name" size="66"
value="<?php Formular_Eingabe('Name'); ?>" />
</p>
<p>
<label for="Mail">Mail:</label>
<input name="Mail" id="Mail" size="66"
value="<?php Formular_Eingabe('Mail'); ?>" />
</p>
<p>
&nbsp;</p>
<p>
<label for="Nachricht">Nachricht:</label>
<textarea name="Nachricht" id="Nachricht" rows="5" cols="50"><?php
Formular_Eingabe('Nachricht'); ?></textarea>
</p>
<p><input type="submit" value="abschicken" /></p>
</fieldset>
</form>

</body>
</html>
Ich hoffe auf viel Unterstützung und danke euch schon mal vorab für die Hilfe.

MfG,
Oliver
[sup]Jeder macht was er will, keiner macht was er soll, aber alle machen mit.[/sup]

21 Antworten

0 Punkte
Beantwortet von Experte (6.4k Punkte)
verdammt... das Semikolon hinter Zeile 9 von unten nicht vergessen!
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo supporter2010,

danke Dir für Deine Antwort. Wenn ich den Code aus der letzten Antwort einfüge erhalte ich die Fehlermeldung

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING .......

und es betriefft die Zeile

$_POST['Name']

MfG,
Oliver
[sup]Jeder macht was er will, keiner macht was er soll, aber alle machen mit.[/sup]
0 Punkte
Beantwortet von Experte (6.4k Punkte)
Habs fast befürchtet..

dann probiers mal so:



<?php
if($Formular_abgeschickt)
{
if($Formular_Fehler = Formular_Check())
{
echo '<p class="Meldung" id="Fehler">',$Formular_Fehler,'</p>';
}
elseif(@mail(MAILTO, "Nachricht", print_r($_POST,true), $AddHeader))
{

$usernachricht =
"Vielen Dank für Ihr Interesse!\n
Es wurden mir folgende Daten übermittelt:\n
\n
$_POST['Name']\n
$_POST['Mail']\n
$_POST['Nachricht']\n
\n
\n
Mit freundliche Grüßen\n
Oliver ";

mail($_POST['MAIL'], "Nachricht", $usernachricht, $AddHeader);
echo '<p class="Meldung" id="OK">Nachricht verschickt.</p>';
}
else
{
echo '<p class="Meldung" id="Fehler">Server-Fehler !</p>';
}
}
?>


Auf die Art und Weise wie in A10 soll die Formatierung beibehalten werden, das funktioniert auch manchmal, ichweiss allerdings nicht warum nur manchmal.
Bei der Variante hier soll \n für eine neue Zeile sorgen, Bin noch nicht sicher obs funktioniert, da mein mailserver gerade rumzickt... wenn Du \n weglässt geht es zwar, aber der Text wird wild in der email verstreut...

probiers mal aus...
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo ,

auch dann erhalte ich die Fehlermeldung

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING .....

und zwar solange, wie ich

$_POST['Name']\n
$_POST['Mail']\n
$_POST['Nachricht']\n
in dem Code belasse.

MfG,
Oliver
[sup]Jeder macht was er will, keiner macht was er soll, aber alle machen mit.[/sup]
0 Punkte
Beantwortet von Experte (6.4k Punkte)
Okay...

Das funktioniert nicht mit $_POST['Name']

Das schon:

$_POST[Name]
$_POST[Mail]
$_POST[Nachricht]

(ohne infache Anführungszeichen in den eckigen Klammern).

Was auch nicht funktioniert und sich nur auf den Quelltext auswirkt ist "\n"

Deshalb probiere nochmal A10, nur dass Du

$_POST['Name'] in $_POST[Name]
$_POST['Mail'] in $_POST[Mail] und
$_POST['Nachricht'] in $_POST[Nachricht] änderst...
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo supporter2010,

jep, so funktioniert's. Danke Dir für die geduldige Hilfe.

MfG,
Oliver
[sup]Jeder macht was er will, keiner macht was er soll, aber alle machen mit.[/sup]
0 Punkte
Beantwortet von Experte (6.4k Punkte)
Na also... war ja ne schwere Zangengeburt...lerne halt auch noch...;-)
0 Punkte
Beantwortet von Experte (6.4k Punkte)
Nur zur Info, falls es jemanden interessiert, der noch nicht dahinter gekommen sein sollte:

Dieses Konstrukt mit "<<<" wird Heredoc-Syntax genannt.
Beispiel von oben:

$usernachricht =<<<_USERMAIL_
Vielen Dank für Ihr Interesse
es wurden mir folgende Daten übermittelt:

$_POST['Name']
$_POST['Mail']
$_POST['Nachricht']


Mit freundliche Grüßen
Oliver
_USERMAIL_;


Dabei wird der eigentliche String zwischen zwei gleichlautenden Bezeichnern platziert.
Hier im Beispiel ist der Bezeichner "_USERMAIL_".
Wenn man dann der Variablen den String zuweist und dann wie hier in den Email-Body schreibt, dann werden auch die Leerzeilen und Zeilenumbrüche in die Email übernommen.
Dazu sollte aber der Text-String nicht eingerückt werden, sonst siehts schlimm aus.

Wichtig: Der abschliessende Bezeichner (hier das zweite "_USERMAIL_") muss alleine und ganz vorne (also nicht eingerückt) in einer Zeile stehen, sonst funktioniert es nicht.
Bei mir war das Problem, dass ich zwischen dem abschliessenden Bezeichner und dem folgenden Semikolon ein Leerzeichen hatte und es somit nicht funktionierte. Der Bezeichner muss übrigens nicht mit _Unterstrichen_ geschrieben werden.

Info Ende.
0 Punkte
Beantwortet von Experte (6.4k Punkte)
Oh Mann...
Info Edit:

Die einfachen Anführungszeichen in den $_POST-Feldern sind herauszulöschen.

KAFFEEPAUSE!!!
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo supporter2010,

danke Dir nochmal für die abschließende Info. Ich habe das nun mal getestet und es funktioniert nun auch mit dem Code aus AW18. Es lag mit Sicherheit an den Hochkommas in dem $_POST-Anweisungen.

Schönen Abend noch.

MfG,
Oliver
[sup]Jeder macht was er will, keiner macht was er soll, aber alle machen mit.[/sup]
...