copyright (c)  2003   useGroup
PHP

Jochen Stärk
PHP-Tutorial
Ein Form-Mailer

nach untenWarum ein Form-Mailer
nach untenWas uns nichts nützt
nach untenDie Mail-Funkion
nach untenMailen der Variablen
nach untenMehr Komfort

Warum ein Form-Mailer

nach obenWarum ein Form-Mailer 

Forms mit der Methode "mailto" gelten als unprofessionell weil es sehr viele Browser gibt, deren eMail-Versand nicht funktioniert. Beispielsweise surfen Sie mit Netscape und benutzen Outlook Express zum mailen -- unter Umständen haben Sie in Netscape gar kein Konto zum Versenden eingerichtet. Oder Sie sind im Internet-Cafe, benutzen einen Browser wie Lynx, oder Sie sind bei einem Freund und möchten die Antwort auf Ihr eigenes eMail-Konto. Auch möchte man gerne dem Benutzer nach Klick auf Absenden einen Text zeigen wie "Ihre Mail wird umgehend bearbeitet".


Was uns nichts nützt

nach obenWas uns nichts nützt 

Wie in Formulardaten übernehmen gesehen verarbeitet PHP die übergebenen Variablen sehr komfortabel. Die einzige Ausnahme, wo das nichts bringt, ist die, bei der man nicht weiß wie die Variablen heißen, die übergeben werden sollen. Das ist hier leider hier der Fall, denn um den Form-Mailer so universell wie möglich zu halten, sollen alle übergebenen Variablen gemailt werden.

Wir bedienen uns also den beiden PHP-Internen Arrays die die Formulardaten speichern:

if (!empty($HTTP_POST_VARS)) {
	while(list($name, $value) = each($HTTP_POST_VARS))
		$message.="$name = $value\n";
	
}
Fragt z.b. die HTTP_POST_VARS ab. Diese werden belegt, wenn ein Formular mit der Methode "Post" übergeben wird. Um Kompatibilität zu erreichen und "weils nicht viel kost'" machen wir das auch mit den Get-Variablen (obwohl es eigentlich nicht empfehlenswert ist, irgendwelche Formulare per Get zu übermitteln: Diese werden dann in die URL kodiert und können z.B. in Logdateien zu finden sein oder im Verlaufs-Cache des Browsers).

Zur Funktion: Erst wird überprüft, ob das Array HTTP_POST_VARS leer ist ansonsten wird, solange es ein neues Element gibt (while (...=each)), die zwei Elemente die darin als Liste vorliegen in den Variablen $name und $value gepeichert. Die Nchricht wird sodann um die Zeile Name = Wert ergänzt.


Die Mail-Funkion

nach obenDie Mail-Funkion 

ist in Ausgabefunktionen genau beschrieben.


Mailen der Variablen

nach obenMailen der Variablen 

Diese Zeilen

 	$message=rawurldecode($message);
	$message=str_replace("+", " ", $message);		

    mail("vetterheinz@provinz.de", "$betreff", $message, "From: $email\nReply-To: $email\nX-Mailer: PHP/" . phpversion(). "\nCC: sie@provider.de");
Bereiten die Nachricht auf den Versand vor (sollte Sie aus Get-Variablen bestehen muss sie nämlich noch dekodiert werden, eine dekodierung von POST-Variablen macht zumindest nichts kaputt) schickt sie an vetterheinz@proinz.de. Eine Kopie geht an sie@provider.de; falls sie keine Kopien versenden wollen, löschen Sie einfach den letzten Teil der Mail-Funktion ". "\nCC: sie@provider.de"" (ohne die äußeren Hochkommata).

die Punkte fügen wie gewohnt die Strings zusammen (objektierientierte Programmierer: lasst euch hier nicht verarschen). Die Variablen betreff und email sollten im Formular definiert sein und sich selbst erklären. Betreff kann man hidden deklarieren und mit value zuweisen, email ist die Absenderadresse. Diese wird übrigens als reply-to benutzt; möchten Sie also auf eine solche Mail vom Form-Mailer im Posteingang antworten, genügt ein freundlicher Klick auf "Antworten".


Mehr Komfort

nach obenMehr Komfort 

Diese Fassung des Form-Mailers gibt noch eine Variable namens thankyou als Text aus - diese definiere ich im Formular versteckt und da kommt dass z.B. rein: Vielen Dank für Ihr Feedback. Ausserdem hat der Benutzer die Möglichkeit, per Link auf die Datei backfromform.html zu springen -- diese muss dann im entsprechenden Verzeichnis noch existieren. Ansonsten kann man das Ding tatsächlich gebrauchen. Und ehe ich es vergesse: Ändern Sie die CC-Adresse (sie@provider.de) und die Empfängeradresse (vetterheinz@provinz.de) nach Ihren Bedürfnissen.

PS: Die Absenderadresse zu ändern geht hier ganz leicht - mit entsprechender Eingabe im Formular. Das ist ein (vom mailserver abhängig) cooler Weg, Freunde glauben zu machen, jemand anders, den sie kennen, hätte ihnen die Mail geschickt.

Beispiels-HTML-Datei:

<HTML>  
<HEAD>
<TITLE>Formular</TITLE>
</HEAD>
<BODY>
<form action="formmailer.php" method="post">
  <input type="hidden" name="thankyou" value="Vielen Dank für Ihre Mail.">
  <input type="hidden" name="betreff" value="Mail vom Form-Mailer.">
  Ihre eMail-Adresse:<input name="eMail"><br>
  Straße: <input name="beliebige"><br>
  Ort: <input name="elemente"><br>
  Nachricht: <textarea name="werdenuebermittelt"></textarea><br>
  <input type="submit"><input type="reset"><br>
</form>
</BODY>
</HTML>
Beispiels-PHP-Datei:
<HTML>  
<!-- Mailbearbeitung: Angabe absender in email, betreff in betreff, nachricht dass Feedback/bestellung abgeschickt wurde in thankyou 
WICHTIG: Formular leitet zurück auf Seite backfromform.html, diese muss existieren und sollte die Ebene über dem Mailformular sein.
Alternativ ändern Sie bitte den Eintrag in javascript:history.back(); o.Ä.

Bitte Empfänger (vetterheinz@provinz.de) und CC-Empfänger (sie@provider.de) nach Bedarf ändern. 
-->
<HEAD>
<TITLE>eMail versandt</TITLE>
</HEAD>
<BODY>

  <?
        $message = "";
	if (!empty($HTTP_GET_VARS)) 
	{
		while(list($name, $value) = each($HTTP_GET_VARS))
		$message.="$name = $value\n";
	}
	if (!empty($HTTP_POST_VARS)) 
	{
		while(list($name, $value) = each($HTTP_POST_VARS))
		$message.="$name = $value\n";
	}
		
 	$message=rawurldecode($message);
	$message=str_replace("+", " ", $message);		

    mail("vetterheinz@provinz.de", "$betreff", $message, "From: $email\nReply-To: $email\nX-Mailer: PHP/" . phpversion(). "\nCC: sie@provider.de");
  
  
  ?>
  <font face="Verdana, Arial, Helvetica">
  <center><b><p/>
  <? 
  echo $thankyou;
  ?>
  <p/>
  <a href="backfromform.html">Zurück</a> zur Indexseite
  </font>
  </b>
  </center>
</BODY>
</HTML>


copyright (c)  2003   useGroup