WinFuture-Forum.de: Formmailer Cgi/php - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Formmailer Cgi/php header information


#1 Mitglied ist offline   felisse.courage 

  • Gruppe: aktive Mitglieder
  • Beiträge: 211
  • Beigetreten: 03. April 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Dresden
  • Interessen:grafik-/webdesign

  geschrieben 06. November 2006 - 16:10

hallo freunde!

folgende seite: -url gelöscht-

unter auftragsanfrage habe ich ein formular zu stehen (s.code). dieses formular (main.php) wird included und beim klicken auf absenden soll zur danke.html gewechselt werden. leider funktioniert das nur bedingt.

wenn ich das formular nicht include, dann funktioniert der wechsel zur danke.php. geh ich über include, dann funktioniert das nicht. es kommt folgende fehlermeldung:

Zitat

Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/v164414/meisterhaft/iFOUR.php:4) in /www/htdocs/v164414/meisterhaft/formmailer/main.php on line 52
line 52 habe ich markiert ("header("Location: $strReturnhtml");")

zur veranschaulichung habe ich auf der seite unter dem "submit" button einen link zum formular als extra seite gesetzt. da könnt ihr vergleichen und sehen, dass es über include nicht funktioniert. die mailfunktion selber wird nicht gestört, alles funktioniert bis auf die dankesrede.

formular (main.php)
<?php

### Konfiguration ###

# Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!

# An welche Adresse sollen die Mails gesendet werden?
$strEmpfaenger = '[email protected]';

# Welche Adresse soll als Absender angegeben werden?
# (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)
$strFrom	   = '"meisterhaft-gestalten.de" <[email protected]>';

# Welchen Betreff sollen die Mails erhalten?
$strSubject	= 'Auftragsanfrage';

# Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?
# Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!
$strReturnhtml = 'danke.php';

# Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?
$strDelimiter  = ":\t";

### Ende Konfiguration ###

if($_POST)
{
 $strMailtext = "";

 while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
   foreach($value as $value_array)
   {
	$strMailtext .= $strName.$strDelimiter.$value_array."\n";
   }
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

 if(get_magic_quotes_gpc())
 {
  $strMailtext = stripslashes($strMailtext);
 }

 mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
  or die("Die Mail konnte nicht versendet werden.");
 header("Location: $strReturnhtml"); /* XXXXX LINE 52 XXXXX */
 exit;
}

?>
<!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>Auftragsanfrage</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	</head>
	<body>
   
		<form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">
			<!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->
			

 <form name="anfrage">
<table width="400" border="0">
 <b>Anliegen<hr /></b>
  <tr>
	<td width="100">Kategorie:</td>
	<td>
	 <select name="Kategorie[]">
	  <option>Fassade - Au&szlig;en</option>
	  <option>komplette Wohnung</option>
	  <option>Zimmer</option>
	  <option>Treppenhaus</option>
	  <option>Lackierung</option>
	 </select>
	</td>
  </tr>
  <tr>
	<td>Grundfl&auml;che/<br />Wandfl&auml;che:</td>
	<td><input type="text" style="margin-right:5px" name="flaeche" />m&sup2;</td>
  </tr>
  <tr>
	<td>gew&uuml;schter<br />Zeitraum:</td>
	<td><input type="text" name="Zeitraum" /></td>
  </tr>
  <tr>
	<td style="vertical-align:top">Bemerkungen:</td>
	<td><textarea name="Bemerkungen" rows="5" cols="30"></textarea></td>
  </tr>
</table><br /><br />
<table width="400" border="0">  
 <b>Kontakt<hr /></b>
  <tr>
	<td width="100"></td>
	<td>
	 <p>
	  <label><input type="radio" name="Anrede" value="herr" />Herr</label>
	  <label><input type="radio" name="Anrede" value="frau" />Frau</label>
	 </p>
	</td>
  </tr>
  <tr>
	<td>Name:</td>
	<td><input type="text" name="Name" /></td>
  </tr>
  <tr>
	<td>Vorname:</td>
	<td><input type="text" name="Vorname" /></td>
  </tr>
  <tr>
	<td>Straße/Nr.:</td>
	<td><input type="text" name="Strasse" style="margin-right:10px" size="29" /><input type="text" name="Nr" size="3" /></td>
  </tr>
  <tr>
	<td>PLZ/Ort:</td>
	<td><input type="text" name="PLZ" maxlength="5" style="margin-right:10px" size="3" /><input type="text" name="Ort" /></td>
  </tr>
  <tr><td>&nbsp;</td></tr>
  <tr>
	<td>E-Mail:</td>
	<td><input size="30" type="text" name="e-mail" /></td>
  </tr>
  <tr>
   <td>Telefon:</td>
	<td><input name="telefon" type="text" />
   </td>
  </tr>  
</table><br /><br />
<input type="submit" value="Anfrage senden" />

</form>
	</body>
</html>


danke.php
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Unbenanntes Dokument</title>
</head>

<body>
Danke, Ihre Anfrage wurde versendet.
</body>
</html>


seite, in der included wird (inFOUR.php - included in iFOUR.php (s.fehlermeldung): die hauptseite heißt iFOUR.php und inFOUR.php ist in ihr enthalten und in ihr dann das formular, jawoll)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="css/base.css" />
<title></title>

</head>
<body>
 <div class="plus">
  
 </div>
	
	<div class="content">
	
	 <p id="navigator"><b>Sie befinden sich hier: <a href="iFOUR.php" class="navigator">Auftragsanfrage</a></b></p>
	 
	 <p id="heading">Ihr maßgeschneidertes Angebot</p>
	 
	 <div id="content">		

Füllen Sie die nachstehenden Felder bitte möglichst genau aus damit wir Ihnen ein passendes Angebot erstellen können.
<br />Achten Sie bitte darauf mindestens eine Kontaktadresse anzugeben.<br /><br />

<?php include('formmailer/main.php') ?>
<a href="formmailer/main.php" target="_blank">formmailer_blank</a>
	</div>
	<p>

	
	
 </div>
   

</body>
</html>



ich hoffe der quelltext haut keinen um...danke euch!

Dieser Beitrag wurde von felisse.courage bearbeitet: 18. März 2008 - 16:08

0

Anzeige



#2 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

  geschrieben 06. November 2006 - 19:03

Moin,

Problem ist, dass du die main.php includest. Wenn jemand dein Formular ausfüllt und auf abschicken klickt, dann leitet das Formular ihn weiter auf $_SERVER['PHP_SELF']. Das ist in deinem Fall aber eben nicht mehr main.php sonder die Datei, in der du main.php per include eingebunden hast. Dann funktioniert aber die Weiterleitung per Header nicht mehr, weil schon html ausgegeben worden ist (Headers already sent).
Lösung: Entweder die Weiterleitung der Form ändern, statt $_SERVER['PHP_SELF'] wäre das main.php

Zitat

<form action="<?php print("main.php"); ?>" method="post">
<!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->

oder die Weiterleitung auf danke.php per JavaScript vollziehen (Nicht alle haben JavaScript aktiviert!), also statt header("Location: $strReturnhtml"); sowas wie
printf("<script language =\"JavaScript\">document.location.href =\"".$strReturnhtml."\";</script>");

0

#3 Mitglied ist offline   felisse.courage 

  • Gruppe: aktive Mitglieder
  • Beiträge: 211
  • Beigetreten: 03. April 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Dresden
  • Interessen:grafik-/webdesign

geschrieben 06. November 2006 - 20:05

jo super! genau das war's! direkt auf main.php konnte ich natürlich nicht verlinken, da kam ich ja wieder zu einem extrafenster, aber mit paar umwegen klappt es dann nun doch!

vielen dank!
0

#4 Mitglied ist offline   telemail 

  • Gruppe: Mitglieder
  • Beiträge: 13
  • Beigetreten: 04. November 06
  • Reputation: 0

geschrieben 06. November 2006 - 23:52

Anmerkung zu $_SERVER['PHP_SELF']:

das ist der PHP-File, der per URL aufgerufen wurde. Einen inkludierten File bekommst Du mit basename(__FILE__)
Wenn es aber die absolute URL sein soll, weil vielleicht ein File aus einem anderen Directory inkludiert wurde, dann wird es ein bißchen komplizierter:

$thisfile=substr(__FILE__,strlen($_SERVER["DOCUMENT_ROOT"]));
$thisurl="http://".$_SERVER["SERVER_NAME"].($thisfile[0] == '/' ? '' : '/').$thisfile;


Ach so, weß jemand, ob es kürzer geht?

Gruß telemail

Dieser Beitrag wurde von telemail bearbeitet: 07. November 2006 - 00:18

0

#5 Mitglied ist offline   felisse.courage 

  • Gruppe: aktive Mitglieder
  • Beiträge: 211
  • Beigetreten: 03. April 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Dresden
  • Interessen:grafik-/webdesign

geschrieben 13. November 2006 - 17:50

also leute das funktioniert so irgendwie doch nicht.

wenn ich nicht $_SERVER['PHP_SELF'] eingebe und stattdessen beispielsweise print("main.php") oder print("danke.php") einsetze, dann erscheint zwar meine gewünschte dankesrede, aber die mailfunktion tritt außer kraft.
es werden keine mails mehr versendet. nur wenn ich wieder $_SERVER['PHP_SELF']: einsetze, kommen auch mails bei mir an, dann allerdings wieder die bekannte fehlermeldung.

das macht einen ja kirre...

Dieser Beitrag wurde von felisse.courage bearbeitet: 13. November 2006 - 17:50

0

#6 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 13. November 2006 - 21:49

Moin,

also, wenn du die Form auf "main.php" leitest, dann sollte eigentlich alles klappen. Wenn deine Danke-Seite dann tatsächlich angezeigt wird, dann bedeutet dass ja, dass der Code soweit korrekt abläuft, und nur etwas mit dem mail()-Aufruf nicht stimmt.

Habe mit eben den Code auf http://www.meisterhaft-gestalten.de angesehen, momentan scheint bei der Form gar keine action eingetragen zu werden. Schreib mal wieder main.php rein und überprüfe den Mail-Aufruf. Wenn tatsächlich deine Dankesseite kommt, aber keine Mail, dann stimmt was mit dem mail()-Aufruf nicht.
0

#7 Mitglied ist offline   felisse.courage 

  • Gruppe: aktive Mitglieder
  • Beiträge: 211
  • Beigetreten: 03. April 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Dresden
  • Interessen:grafik-/webdesign

geschrieben 14. November 2006 - 12:12

okay es klappt jetzt:

print('main.php')

mit der dankeseite musste ich allerdings ganz schön rumfummeln damit es bei dem ganzen including auch richtig angezeigt wird. also vielen dank!

eine sache hätte ich da aber noch. da ich bei der email-adresse, an die auch das anfrageformular gesendet wird, eine auto-answer aktiviert habe, bekomm ich jetzt pro anfrage auch eine nachricht vom MAILER-DAEMON, dass die nachricht an [email protected] nicht gesendet werden konnte. diese adresse scheint er selbst zu generieren, meine absenderinformationen vom formular sind | $strFrom = '"meisterhaft-gestalten.de"'; |
es wäre doch jetzt noch toll, wenn die emailadresse, die derjenige im formular angibt an eine php-variable übergeben werden könnte, sodass diese ungefähr so | $strFrom = '"meisterhaft-gestalten.de" <$absender>'; | integriert werden könnte und mein auto-answer dann eine adresse hätte zu der er seine nachricht schicken kann.

na? :D
0

#8 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 15. November 2006 - 11:49

Hmm... also, das wwwrun ist sozusagen der Benutzeraccount des Webservers. Der sollte eigentlich als Absender nicht auftauchen, wenn man einen eigenen Absender angibt. Es gibt da ein Problem mit PHP, wenn es auf einem IIS-Server und als ISAPI-Modul läuft. Versuche mal, die Mail so abzuschicken, wie in diesem Beispiel: http://de3.php.net/mail#57009
Also, header getrennt definieren. Insbesondere das hier
$headers = "From: webserver@localhost\r\n";

passt du dann an dein Skript an, also sowas wie
$headers = "From: [email protected]\r\n";

Zum zweiten Punkt: Du möchtest als Absender eine Email-Adresse angeben, die aus der Email-Adresse des Empfängers (des Kunden) konstruiert wird, hab' ich das so richtig verstanden?
0

#9 Mitglied ist offline   felisse.courage 

  • Gruppe: aktive Mitglieder
  • Beiträge: 211
  • Beigetreten: 03. April 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Dresden
  • Interessen:grafik-/webdesign

geschrieben 15. November 2006 - 17:39

also wwwrun generiert er jetzt, da ich keine absenderadresse mehr angegeben habe, sondern nur "meisterhaft-gestalten.de" und kein "<...>" mehr, weil aus welchem grund sollte ich das tun, eine feste absenderadresse anzugeben, wenn ich eh die post selbst bekomme. ich könnte natürlich eine mailadresse anlegen, zu der die automessages gesendet werden, dann bekomme ich wenigstens keine nachricht mehr vom MAILER-DAEMON und horte dann sinnlos meine auto-answers in einem postfach.
also kommen wir gleich zum zweiten punkt:
ja ich möchte, dass die bestätigungsnachricht die automatisch versendet wird, an die email-adresse des formular-ausfüllers gesendet wird, sofern dieser denn eine eingibt.
das hast du richtig verstanden :P
0

#10 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

  geschrieben 15. November 2006 - 22:19

Das ist dann ja kein Problem. Die Email-Adresse des Kunden wird ja übergeben in
$_POST['e-mail']

Damit ändert sich der Aufruf der mail()-Funktion in
mail($_POST['e-mail'], $strSubject, $strMailtext, "From: ".$strFrom)
  or die("Die Mail konnte nicht versendet werden.");

Vorher kannst du noch überprüfen, ob die eingegebene Email-Adresse gültig ist.
Dazu schreibst du vor dem mail()-Aufruf
if(checkEmail($_POST['e-mail']))
	*mail()-Aufruf*
else
	print("Ihre Mail-Adresse ist ungültig");

wobei die Funktion checkEmail() von dir definiert werden muss. Dazu setzt du am einfachsten ans Ende der Datei das hier:
<?php
	function checkEmail($email)
	{
		if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email))
		{
			//Zu lang/kurz oder kein @-Zeichen: Blödsinn!
			return false;
		}

		$email_array = explode("@", $email);
		$local_array = explode(".", $email_array[0]);
		for ($i = 0; $i < sizeof($local_array); $i++)
		{
			if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i]))
			{
				return false;
			}
		}
		
		if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1]))
		{ 	
			//Domain darf keine IP sein:
			$domain_array = explode(".", $email_array[1]);
			if (sizeof($domain_array) < 2) {
				return false; //Email-Domain ist Mist!
			}
		
			for ($i = 0; $i < sizeof($domain_array); $i++)
			{
				if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i]))
				{
					return false;
				}
			}
		}
		return true;
	}
?>

0

#11 Mitglied ist offline   felisse.courage 

  • Gruppe: aktive Mitglieder
  • Beiträge: 211
  • Beigetreten: 03. April 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Dresden
  • Interessen:grafik-/webdesign

geschrieben 16. November 2006 - 15:21

mail($_POST['e-mail'], $strSubject, $strMailtext, "From: ".$strFrom)
  or die("Die Mail konnte nicht versendet werden.");

hast du auf diese weise nicht den empfänger des formulars, also meine adresse ersetzt? $strEmpfaenger ist doch meine mail-adresse und in deinem angegebenen fall aber die des kunden. d-h- das formular wird nicht mehr zu mir, sondern zum kunden geschickt. müsste ich nicht das $strFrom mit mit $POST['e-mail'] ersetzen?
also: der kunde schickt das formular ab und es wird gesendet an $strEmpfaenger (meine adresse), daraufhin schickt meine adresse eine auto-antwort an den absender $strFrom (soll kundenadresse sein).
müsste es dann nicht also so lauten?
mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$_POST['e-mail'], )
  or die("Die Mail konnte nicht versendet werden.");


edit:
ich habe es eben ausprobiert mit der von mir bearbeiteten variante. also als absender taucht jetzt schon mal die von mir eingetragene email-adresse auf, allerdings wird die auto-antwort immer noch an [email protected] gesendet und ich bekomme wieder post vom DAEMON...

Dieser Beitrag wurde von felisse.courage bearbeitet: 16. November 2006 - 15:28

0

#12 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

  geschrieben 16. November 2006 - 18:31

Äh ja, natürlich als Absender, ich Depp :)
Wenn die Auto-Antwort trotzdem an wwwrun@ gesendet wird, dann stimmt was mit den Mail-Headers nicht. Vermutlich wird der Reply-To-Wert nicht automatisch auf die Absenderadresse gesetzt. Definiere die Header mal getrennt vor dem mail()-Aufruf, so wie in dem Link
http://de3.php.net/mail#57009
Füge dann zu den Headers den Reply-To-Wert hinzu, so dass der auch auf die Email-Adresse des Kunden zeigt:
$headers .= 'Reply-To: '.$_POST['e-mail'].'\r\n';

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0