Kontaktformular inkl. Dateianhang mit PHP
McStone
- php
Moin,
ich habe folgendes Script im Internet gefunden:
___________________________________________________________________________________________
<html>
<head>
<title>Kontaktformular inkl. Dateianhang mit PHP</title>
</head>
<body>
<?php
$Empfaenger = "meine@mailadresse.de";
if($_REQUEST['Send'])
{
if(empty($_REQUEST['Name']) || empty($_REQUEST['Email']) || empty($_REQUEST['Nachricht']))
{
echo"Bitte gehen Sie <a href="javascript:history.back();">zurück</a> und füllen Sie alle Felder aus!";
}
else
{
$Mailbetreff = "Kontakt: ";
$Mailbetreff .= $_REQUEST['Betreff'];
$Trenner = md5(uniqid(time()));
$Header = "From: ".$_REQUEST['Email'];
$Header .= "\n";
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
$Header .= "\n\n";
$Header .= "This is a multi-part message in MIME format";
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: text/plain";
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: 8bit";
$Header .= "\n\n";
$Header .= "Sie haben folgende Nachricht erhalten: \n\n";
while(list($Formularfeld, $Wert)=each($_REQUEST))
{
if($Formularfeld!="Send" && $Formularfeld!="Anhang")
{
$Header .= $Formularfeld.": ".$Wert."\n";
}
}
$Header .= "\nDatum/Zeit: ";
$Header .= date("d.m.Y H:i:s");
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: ";
$Header .= $_FILES['Anhang']['type'];
$Header .= "; name=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: base64";
$Header .= "\n";
$Header .= "Content-Disposition: attachment; filename=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n\n";
$Dateiinhalt = fread(fopen($_FILES['Anhang']['tmp_name'], "r"), $_FILES['Anhang']['size']);
$Header .= chunk_split(base64_encode($Dateiinhalt));
$Header .= "\n";
$Header .= "--$Trenner--";
mail($Empfaenger, $Mailbetreff, "", $Header);
echo"Vielen Dank für Ihre eMail!";
}
}
else
{
?>
<table border="0" cellpadding="1" cellspacing="2">
<form action="<?php echo$_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<tr>
<td>Name:</td>
<td><input name="Name" size="20" type="text"></td>
</tr>
<tr>
<td>eMail:</td>
<td><input name="Email" size="20" type="text"></td>
</tr>
<tr>
<td>Betreff:</td>
<td><select name="Betreff" size="1"><option>Hilfe</option><option>Kritik</option><option>Werbung</option></select></td>
</tr>
<tr>
<td>Nachricht:</td>
<td><textarea cols="25" name="Nachricht" rows="5"></textarea></td>
</tr>
<tr>
<td>Anhang:</td>
<td><input name="Anhang" size="20" type="file"></td>
</tr>
<tr>
<td align="center" colspan="2"><input name="Send" type="submit" value="Abschicken"> <input name="Reset" type="reset" value="Löschen"></td>
</tr>
</form>
</table>
<?php
}
?>
</body>
</html>
___________________________________________________________________________________________
Das ist genau das Skript was ich gesucht habe, allerdings möchte ich den Anhang noch ausbauen (d.h. statt einer Anhangsdatei 3-5 Dateien).
Da ich selber leider nicht wirklich die Erfahrung mit solchen Skripts habe, konnte ich das Skript bisher nicht so umschreiben, sodass mehrere Anhänge gesendet werden können.
Ich hoffe jemand weiß was ich ergänzen muss, damit mehrere Anhänge gesendet werden können.
P.S.: Gibt es in diesem Skript auch eine Volumenbegrenzung?
Mit freundlichen Grüßen & schon einmal Danke im vorraus
McStone
Ahoj!
$Mailbetreff .= $_REQUEST['Betreff'];
$Header = "From: ".$_REQUEST['Email'];
Diese beiden Zeilen sind gefährlich. Hier werden Benutzereingaben ungeprüft in den eMail-Header geschrieben. Damit kann der Benutzer z.B. beliebig viele eMail-Adressen als CC eintragen und auf diese Weise Spam versenden.
Du musst unbedingt unerlaubte Zeichen herausfiltern, mindestens den Zeilenumbruch!
Das ist genau das Skript was ich gesucht habe, allerdings möchte ich den Anhang noch ausbauen (d.h. statt einer Anhangsdatei 3-5 Dateien).
Heißt "3-5 Dateien", daß Du die genaue Zahl noch festlegst, sie dann aber konstant bleibt, oder daß sie variabel sein soll? Wenn letzteres: Wovon hängt sie ab?
Ich hoffe jemand weiß was ich ergänzen muss, damit mehrere Anhänge gesendet werden können.
So ganz genau weiß ich es jetzt aus dem Stegreif offen gestanden auch nicht. Im Prinzip mußt Du aber diesen Teil:
$Header .= "\n";
$Header .= "Content-Type: ";
$Header .= $_FILES['Anhang']['type'];
$Header .= "; name=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: base64";
$Header .= "\n";
$Header .= "Content-Disposition: attachment; filename=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n\n";
$Dateiinhalt = fread(fopen($_FILES['Anhang']['tmp_name'], "r"), $_FILES['Anhang']['size']);
$Header .= chunk_split(base64_encode($Dateiinhalt));
$Header .= "\n";
$Header .= "--$Trenner--";
mehrfach wiederholen, mit verschiedenen Array-Keys (also z.B. "Anhang1", "Anhang2" usw. statt "Anhang"). Das geht recht einfach in einer Schleife, und eine variable Anzahl ist dann auch kein Problem.
Entsprechend brauchst Du im HTML mehrere solche Inputs:
<input name="Anhang1" size="20" type="file">
<input name="Anhang2" size="20" type="file">
...
P.S.: Gibt es in diesem Skript auch eine Volumenbegrenzung?
Ich sehe keine. Das ist gegebenenfalls auch noch eine Sicherheitslücke, falls Dein Server sich nach Belieben vollstopfen läßt.
Viele Grüße vom Længlich
echo $begrüßung;
$Mailbetreff .= $_REQUEST['Betreff'];
$Header = "From: ".$_REQUEST['Email'];Diese beiden Zeilen sind gefährlich. Hier werden Benutzereingaben ungeprüft in den eMail-Header geschrieben. Damit kann der Benutzer z.B. beliebig viele eMail-Adressen als CC eintragen und auf diese Weise Spam versenden.
Du musst unbedingt unerlaubte Zeichen herausfiltern, mindestens den Zeilenumbruch!
Hier kann man im Prinzip etwas radikal vorgehen. Wenn ein Zeilenumbruch in einem dieser Werte vorkommt, kann man mit hoher Wahrscheinlichkeit daraus schließen, dass das keine menschliche Eingabe sondern die eines Bots war. Da man diese nicht behandeln will, kann man an der Stelle komplett die weitere Verarbeitung abbrechen. Normalerweise bin ich zwar gegen die Verwendung von die(), doch in diesem Fall trifft es keinen unschuldigen Anwender und ein Spambot braucht keine gestylte Fehlermeldung "zu Gesicht" bekommen.
echo "$verabschiedung $name";
Shalom!
Diese beiden Zeilen sind gefährlich. Hier werden Benutzereingaben ungeprüft in den eMail-Header geschrieben. Damit kann der Benutzer z.B. beliebig viele eMail-Adressen als CC eintragen und auf diese Weise Spam versenden.
Du musst unbedingt unerlaubte Zeichen herausfiltern, mindestens den Zeilenumbruch!Hier kann man im Prinzip etwas radikal vorgehen. Wenn ein Zeilenumbruch in einem dieser Werte vorkommt, kann man mit hoher Wahrscheinlichkeit daraus schließen, dass das keine menschliche Eingabe sondern die eines Bots war. Da man diese nicht behandeln will, kann man an der Stelle komplett die weitere Verarbeitung abbrechen. Normalerweise bin ich zwar gegen die Verwendung von die(), doch in diesem Fall trifft es keinen unschuldigen Anwender und ein Spambot braucht keine gestylte Fehlermeldung "zu Gesicht" bekommen.
Da hast Du völlig recht. Ich verwende normalerweise auch kein die(), aber in diesem Fall ist es absolut gerechtfertigt. Bots lesen die Antwort eh nicht, und wenn es ein Mensch war, war es so gut wie sicher ein Hacker oder Spammer - die Fehlermeldung muß also auch inhaltlich nicht unbedingt so höflich ausfallen wie sonst.
Man könnte auch Patricks Stinkfinger-Bild verwenden... ;-) Dafür müßte man aber den HTTP-Header ändern, also doch wieder kein die().
Viele Grüße vom Længlich
echo $begrüßung;
$Dateiinhalt = fread(fopen($_FILES['Anhang']['tmp_name'], "r"), $_FILES['Anhang']['size']);
Sowas macht man nicht. Zum einen die direkte Verschachtelung von Funktionsaufrufen, wenn diese Funktionen im Normal- und im Fehlerfall einen unterschiedlichen Wert zurückgeben. Der Fehlerfallwert ist im Allgemeinen kein gültiges Argument für die nachfolgende Funktion. Und nach einem Unfall einfach weiterzufahren nennt man Fahrerflucht :-) Zum anderen sollte man nicht direkt auf die Benutzereingaben reagieren und jede x-beliebige Datei ausliefern, deren Namen einem der Anwender nennt. Man sollte zumindest prüfen, ob es sich um eine wirklich hochgeladene Datei handelt. Dazu gbt es die Funktion is_uploaded_file().
echo "$verabschiedung $name";