Header-Problem bei Mail-Skript
Sebastian Becker
- php
Hallo,
ich habe folgendes Header-Problem mit einem PHP-Kontaktformular, vielleicht kennt jemand die Thematik und weiß eine Lösung:
---------- Anfang Zitat Kundenmail ----------
Sie haben auf ihrer Hompage einen kl. Fehler im Kontaktformular:
Nach dem Submit kommt es zu folgendem PHP error anstatt einer
Bestaetigung:
Warning: Unable to resolve 213.229.42.186 in
/usr/local/httpd/snom/mail/body.inc on line 137
Warning: Cannot add header information - headers already sent by (output started at /usr/local/httpd/snom/mail/body.inc:137) in
/usr/local/httpd/snom/mail.php on line 72
Die Mail wird aber dennoch abgesendet (deshalb bekamen sie gestern meine mail wahrscheinlich dreifach ;) )
---------- Ende Zitat Kundenmail ----------
Die entsprechende Stelle in meinem Skript sieht so aus:
---------- Anfang Skriptausschnitt ----------
// send mail
// check if subject has been passed
$subject=$subject?$subject:$default_subject;
// strip slashes
$msg=stripslashes($msg); $subject=stripslashes(trim($subject));
// send
mail($mailto_name." <".$mailto.">",$subject,$msg,$mailhead);
// send carbon copy mail
// ...
// send confirm mail (auto responder function)
// ...
// redirect to confirm page
header("Location: mail_confirm_".$language.".htm");
// show post variables (only for testing)
// while(list($var, $val) = each($HTTP_POST_VARS)){echo "$var = " . ${$var} . "\n<br>\n";}
---------- Ende Skriptausschnitt ----------
Ich habe absichtlich den auskommentierten Teil mitgeschickt, falls er etwas mit der Fehlermeldung zu tun haben könnte.
Vor dem Header wird also kein HTML ausgegeben sondern nur die mail-Befehle erteilt.
Bei meinen Tests funktionierte das Skript auch einwandfrei. Daher ist mir die Kundenmeldung unerklärlich. Kann es sein, daß ein solcher Fehler nur temporär auftritt?
Danke für alle Tipps,
Sebastian
Hallo Sebastian!
Du hast kein Header-Problem und die von dir bennannten Scriptstellen sind auch nicht die, die den Fehler verursachen.
Mach mal ein kurzes Test-Script:
<?
echo gethostbyaddr("213.229.42.186");
?>
und guck dir die Ausgabe an. Na, kommt dir das bekannt vor?
Das ist das was deine Kunde beschrieben hat!
Dieser Fehler tritt nur dann auf, wenn die IP des Kunden nicht per Nameserver aufgelöst werden kann.
Entweder du nimmst das Namserverlookup ganz raus oder du setzt setzt ein @ vor die Funktion. (also: <? echo @gethostbyaddr("213.229.42.186"); ?>)
Was ist nun das mit dem Header?
Der obige Funktionsaufruf gibt die Fehlermeldung wegen der nicht auflösbaren IP aus. Danach ist ein Aufruf der Headerfunktion illegal bzw. nicht mehr sinnvoll möglich und PHP erzeugt die entsprechende Fehlermeldung.
PHP sendet die Standard-Header sobald die erste Ausgabe erfolgt, für andere Header (also deinen Redirect-Header) ist es dann zu spät.
Gruss,
Carsten
Hallo,
Dein Hinweis war sehr hilfreich, vielen Dank!
Hier der entsprechende Skriptteil, in dem ich den Mailtext, mit dem ich auch ein paar Serverdaten mitübertrage, aufbaue:
$msg.="\nDetails:\n";
if(HTTP_REFERER)$msg.="Referrer: ".$HTTP_REFERER."\n";
$servername=gethostbyaddr($ip);
if($servername)$msg.="Host: http://".$servername.", ";
if($ip)$msg.="IP: http://".$ip."\n";
if($HTTP_USER_AGENT)$msg.="Browser: ".$HTTP_USER_AGENT."\n";
// ...
mail($mailto_name." <".$mailto.">",$subject,$msg,$mailhead);
Meinst Du, daß es auch hier reicht, ein "@" vor "gethostbyaddr" zu setzen, um den Fehler zu vermeiden. Welcher Wert wird in diesem Falle ausgegeben?
Danke nochmals für die wertvolle Hilfe! :-)
Grüße,
Sebastian
Hi,
Meinst Du, daß es auch hier reicht, ein "@" vor "gethostbyaddr" zu setzen, um den Fehler zu vermeiden. Welcher Wert wird in diesem Falle ausgegeben?
Vermeiden läßt sich der Fehler damit nicht. Was sich allerdings imho vermeiden ließe, ist die Ausgabe des Fehlers. D.h. Das Script läuft durch bis zum Ende, ohne das es zu irgendwelchen Auffälligkeiten kommt. Stattfinden tut der Fehler aber trotzdem.
Grüße Ralf
Hi Sebastian!
Ich weiß nicht ob ich das an Hand der Daten richtig interpretiere, aber was bindest Du genau wo ein?
Ich denke das Du wohl in deinem Script kein html sendest, aber dieses Script irgendwo einbindest, wo vorher schon was übertragen wurde. Oder umgekehrt.
Grüsse
Andreas