Anfängerfrage: PHP-Formular wird 2 x übermittelt

Steffiberlin

Mitglied
Hallo ins Forum, mein erstes PHP-Formular läuft jetzt, das verdanke ich der tollen Hilfe hier, nochmals ganz herzlichen Dank! Ein kleines Problem hab ich noch. Und zwar erhalte ich beim Testen jedes Mal 2 Benachrichtigungen von Strato. Die eine ist vollständig, mit allen Inhalten, die andere enthält nur die Begriffe aus dem Formular ohne die Inhalte. Ich habe bei Strato angerufen und ein Mitarbeiter hat sich das PHP-Skript angesehen. Er meinte, die 3. Zeile im headers-Bereich

PHP:
$headers = mail($webmaster, $emailBetreff, $body, $headers);

würde ihm "komisch vorkommen", er konnte mir aber nicht sagen, was daran falsch ist bzw. wie es berichtigt werden soll. Da ich noch nicht viel Erfahrung mit PHp habe lautet meine Frage: Kann mir jemand helfen? Danke im Voraus - Steffi

PS Hier der Vollständigkeit halber noch einmal der erste Teil des Skriptes:

PHP:
<?php
 
/* Betreff und Email Variable */
 
 $emailBetreff = 'selbst-bewusst-bewegen.de Kontaktformular';
 $webmaster = 'info@selbst-bewusst-bewegen.de';
 
/* Emailform Daten */
 
 $nachricht = $_POST['nachricht'];
 $name = $_POST['name'];
 $telefon = $_POST['telefon'];
 $email = $_POST['email'];
 
 $body = <<<EOD
<br><hr><br>
Name: $name <br>
Email: $email <br>
Telefon: $telefon <br>
Nachricht: $nachricht <br>
EOD;

 $headers = "From: $email\r\n";
 $headers .= "Content-type: text/html\r\n";
 $headers = mail($webmaster, $emailBetreff, $body, $headers);
 
Die Zeile ist wirklich etwas komisch.

- Du übergibst der Variablen $header zuerst die entsprechenden Angaben.
- Dann verschickst du die Nachricht mit den $header-Angaben.
- Und das Ergebnis übergibst du wiederum an $header und überschreibst den bisherigen Inhalt.

Schreib es mal nur so:

PHP:
mail($webmaster, $emailBetreff, $body, $headers);
 
Grundsätzlich ist das aber kein Problem, nach der Ausführung des Befehls mail() steht in $headers dann ein boolscher Wert also entweder true oder false, je nach dem. Es hat IMHO nichts damit zu tun, das die Mail zwei mal ankommt mit unterschiedlichen Inhalten.

Kommt unterhalb von mail() noch weiterer Code?

Hier noch mal ein Quote aus dem Manual zu mail():

PHP Manual hat gesagt.:
Gibt TRUE zurück, wenn die E-Mail erfolgreich für den Versand akzeptiert wurde, sonst FALSE.

Dass eine E-Mail für den Versand akzeptiert wurde, bedeutet nicht, dass sie auch wirklich den gewünschten Empfänger erreichen wird.
 
Also auf mich macht dieses Formular einen sehr komischen Eindruck. Ich verstehe schon nicht, warum es ein HTML-Mail sein soll. Ich würde es mal als normales Text-Mail versenden. Wie funktioniert denn bspw. sowas hier:


PHP:
<?php
 
/* Betreff und Email Variable */
 
 $emailBetreff = 'selbst-bewusst-bewegen.de Kontaktformular';
 $webmaster = 'info@selbst-bewusst-bewegen.de';
 
/* Emailform Daten */
 
 $nachricht = $_POST['nachricht'];
 $name = $_POST['name'];
 $telefon = $_POST['telefon'];
 $email = $_POST['email'];
 
$body = "Name: $name\r\nEmail: $email\r\nTelefon: $telefon\r\nNachricht: $nachricht";

$headers = "From: $email\r\n";
mail($webmaster, $emailBetreff, $body, $headers);

Sollte das nicht klappen, einfach mal das $headers aus dem mail()-Befehl rausnehmen.

mail($webmaster, $emailBetreff, $body);

Das Ergebnis würde mich intessieren.
 
PS Ich weiß nicht, vielleicht ist das ja noch wichtig zum Verständnis des Aufbaus: Es handelt es sich um ein Skript mit einer integrierten Antwortseite, ich habe es aus einem Tutorial. Wie gesagt, das funktioniert auch bestens, d.h. nach dem Klick auf Absenden erscheint die Vielen Dank Seite (online unter selbst-bewusst-bewegen.de/kontakt.html). Hier das vollständige Skript:

PHP:
<?php
 
/* Betreff und Email Variable */
 
 $emailBetreff = 'selbst-bewusst-bewegen.de Kontaktformular';
 $webmaster = 'info@selbst-bewusst-bewegen.de';
 
/* Emailform Daten */
 
 $nachricht = $_POST['nachricht'];
 $name = $_POST['name'];
 $telefon = $_POST['telefon'];
 $email = $_POST['email'];
 
 $body = <<<EOD
<br><hr><br>
Name: $name <br>
Email: $email <br>
Telefon: $telefon <br>
Nachricht: $nachricht <br>
EOD;

 $headers = "From: $email\r\n";
 $headers .= "Content-type: text/html\r\n";
 $headers = mail($webmaster, $emailBetreff, $body, $headers);
 
/* Antwort */
 
$dieAntwort = <<<EOD
<html>
<head>
<TITLE>Vielen Dank</TITLE>
<link href="bea01.css" rel="stylesheet" type="text/css">
<link rel="SHORTCUT ICON" href="bilder/favicon.ico">
<style type="text/css">
body {
	background-color: #FFFFFF;
	background-image: url();
	background-position: center top;
	margin-top: 40px;
}
body {
	scrollbar-base-color: #FFFFFF;
	scrollbar-arrow-color: #7085A5;
	scrollbar-darkshadow-color: #7085A5;
	scrollbar-face-color: #FFFFFF;
	scrollbar-highlight-color: #7085A5;
	scrollbar-shadow-color: #FFFFFF;
	scrollbar-track-color: #FFFFFF;
	background-color: #FFFFFF;
	margin-top: 40px;
}
</style>
 <script type="text/javascript" src="Linkfocus_fuer_Maus_verstecken.js"></script>
 <script type="text/javascript" src="swfobject.js"></script>
  <script src="SpryAssets/SpryEffects.js" type="text/javascript"></script>
<script type="text/javascript">
function warte(){
window.setTimeout("textLoader()", 700); 
    }	
function textLoader(){
 fadeTexte = new Array("text1" );
 	for (var i = 0; i < fadeTexte.length; ++i)
		MM_effectAppearFade(fadeTexte[i], 2700, 0, 100, false)
		}
function MM_effectAppearFade(targetElement, duration, from, to, toggle)
{
    Spry.Effect.DoFade(targetElement, {duration: duration, from: from, to: to, toggle: toggle});
}
</script>
<style type="text/css">
#text1 {
	visibility: hidden;
}
</style>
</HEAD>
<body onLoad="warte()">
<table width="1000" height="550" border="0" align="center" cellpadding="0" cellspacing="0" class="td28">
<tr>
<td width="245" height="355"></td>
<td width="755" height="355" align="center"><div id="text1"><span class="blaubig">Vielen Dank f&uuml;r Ihr Interesse</span><span class="blau"><br>Ihre Nachricht wurde erfolgreich &uuml;bermittelt.<br>Falls erw&uuml;nscht melde ich mich so bald wie m&ouml;glich<br>bei Ihnen zur&uuml;ck. Bis dahin w&uuml;nsche ich Ihnen<br>eine bewegte Zeit im World Wide Web.<br><br>Ihre Bea Pawliczak<br><br></span><span class="blaubig">Ben&ouml;tigen Sie vorab zus&atilde;tzliche Informationen?</span><span class="blau"><br>Für eine pers&ouml;nliche Beratung können Sie mich<br>gerne auch telefonisch kontaktieren. Sie erreichen <br>mich unter der Rufnummer 030. 323 01 585.</span></div></td>
</tr>
<tr>
<td width="1000" height="30" colspan="2"></td>
</tr>
<tr>
<td width="1000" height="165" colspan="2"><script type="text/javascript" src="swfobject.js"></script> 
<div id="flashcontent"><img src="bilder/dankehinweis.jpg" width="1000" height="165"></div>
<script type="text/javascript">
var so = new SWFObject("flash/danke.swf", "mymovie", "1000", "165", "5", "#FFFFFF");
so.write("flashcontent");
</script></td>
</tr>
</table>
</body>
</html>
EOD;
 
echo "$dieAntwort";

?>

Bin jetzt auch mal gespannt, was passiert, wenn ich die Änderungen vornehme. Grüße!
 
So, ich habe jetzt

PHP:
$headers = mail($webmaster, $emailBetreff, $body, $headers);

ersetzt durch

PHP:
mail($webmaster, $emailBetreff, $body, $headers);

und erhielt wieder 2 Nachrichten von Strato. Also wie gehabt: Die eine mit dem Inhalt, den ich im Formular eingegeben habe. Und die andere lediglich mit den Vorgaben aus dem Formular, also untereinander die Begriffe "Nachricht: / Name: / Telefon: / Email:" und sonst nichts weiter. Die Nachrichten haben einen unterschiedlichen Absender. Die mit Inhalt kommt von der Emailadresse, die ich im Formular eingetragen habe. Die ohne Inhalt kommt von postmaster+1616543@post.webmailer.de. Vielleicht hat es ja doch etwas mit Strato zu tun? Ich habe keine Ahnung.

@Anna: Wenn ich deinen Vorschlag übernehme dann wird das mit der Antwortseite wohl nicht funktionieren, das nehme ich zumindestens an, denn diese Angabe <<<EOD ist (so weit ich das mit meinem Anfängerwissen überhaupt beurteilen kann) doch relativ wichtig für diese Funktion. Grüße, Steffi
 
Hallo Steffi,

Wie saftmeister bereits gesagt hat - $headers = zu löschen sollte keinen Unterschied machen, da $headers erst nach Ausführung der Mail-Funktion einen neuen Wert zugewiesen bekommt.

Das <<<EOD ist ein heredoc, siehe auch PHP: Strings: heredoc

Die heredocs kannst du aber auch durch...
...einfache Anführungszeichen beim zweiten <<<EOD...
...doppelte Anführungszeichen beim ersten <<<EOD...
...ersetzen, das macht ebenso wenig einen Unterschied. Darfst hier aber nicht vergessen das abschließende EOD auch zu ersetzen :)

Ebenso würde ich die Zeile
PHP:
$headers.= "Content-type: text/html\r\n";
komplett entfernen, du brauchst nur für die Daten derer, die dein Formular abgesendet haben, nicht unbedingt eine HTML-Mail. Dort steht eh nicht viel drin.

Was du zudem noch versuchen kannst - bau mal die option -f in deine Mail-Funktion ein. Kann helfen, muss aber nicht. Tausch einfach mal alles ab $body bis mail(..) mit folgendem aus
PHP:
$body = "
Name: $name
Email: $email
Telefon: $telefon
Nachricht: $nachricht
"; 

 $headers = "From: $email"; 
 mail($webmaster, $emailBetreff, $body, $headers, "-f ".$email);

Grüße,
Chris


Edit:
Ich habe gerade geschaut - bei Host Europe wird erwartet, dass die Absender-Email existiert UND bei mir liegt..
Kann ja sein das Strato rumzickt, weil du die E-Mail der Formular-Benutzer als Absendeadresse benutzt.
Du kannst daher einfach mal die Zeile
PHP:
 $headers = "From: $email"; 
// durch
 $headers = "From: $webmaster";
ersetzen.
 
Zuletzt bearbeitet:
Die ohne Inhalt kommt von postmaster+1616543@post.webmailer.de. Vielleicht hat es ja doch etwas mit Strato zu tun? Ich habe keine Ahnung.

Was steht den in den Headern dieser Mail? Im Mail-Client kannst du das normalerweise rausfinden. Bei Thunderbird steht das unter Ansicht->Kopfzeilen oder so ähnlich. Bei Windows Live Mail kannst du es übe die Detail-Informationen bei den Nachrichteneigenschaften rausfinden.

Am besten den kompletten Header mal posten.
 
Zurück