alex: Kontaktformular mit Anhang

Hallo,

benötige fachkundige Hilfe!

Ich habe hier ein Kontaktformular, mit dem es möglich ist neben der Nachricht einen Anhang zu versenden. Die Email wird mir auch ordnungsgemäß zugesendet.

Das Problem ist, dass statt der ausgewählten Datei in der Email im Anhang bloß "anlage" (ohne Daeiendung) steht.

Wo liegt der Fehler in diesem Skript?

<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>

MfG
Alex

  1. Ahoi,

    $_FILES['Anhang']['name'] - was steht da denn drin?

    Vielleicht mal an der Stelle

    var_dump($_FILES);
    die("schlusserstmal");

    einbauen und schauen, welchen wert der Dateiname hat.

    Hab ich das Fileuploadskript übersehen?

    Dank und Gruß,

    frankx

  2. Hello,

    Ich habe hier ein Kontaktformular, mit dem es möglich ist neben der Nachricht einen Anhang zu versenden. Die Email wird mir auch ordnungsgemäß zugesendet.

    Das Problem ist, dass statt der ausgewählten Datei in der Email im Anhang bloß "anlage" (ohne Daeiendung) steht.

    Wo liegt der Fehler in diesem Skript?

    ohne Rücksicht auf weitere Fehler oder Sicherheigtslücken!

    Ich vermut mal, dass

    $Header .= "Content-Transfer-Encoding: base64";
            $Header .= "\n";
            $Header .= "Content-Disposition: attachment; filename=";
            $Header .= $_FILES['Anhang']['name'];
            $Header .= "\n\n";

    dieser Abschnitt Scheiße ist:

    $Dateiinhalt = fread(fopen($_FILES['Anhang']['tmp_name'], "r"), $_FILES['Anhang']['size']);
            $Header .= chunk_split(base64_encode($Dateiinhalt));
            $Header .= "\n";
            $Header .= "--$Trenner--";

    Wenn man schon mit fopen() und fread() arbeitet, muss man auch die Fehlerwerte nutzen, die ggf. zurückgeben werden, aber das nur am Rande!

    Ander das mal tethalber so ab:

    $Dateiinhalt = file_get_contents($_FILES['Anhang']['tmp_name']);
              $Header .= chunk_split(base64_encode($Dateiinhalt),76,"\n");

    Und sag bitte Bescheid, ob es nun geht.

    Liebe Grüße aus dem Cyberspace

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. $Trenner = md5(uniqid(time()));

    Hallo, ein paar allgemeine Dinge von mir (gratis):

    uniqid() nimmt als Basis automatisch die aktuelle Zeit in Mikrosekunden. Das Präfix[1] ist eigentlich dafür da, die IDs zu differenzieren, wenn sie zur selben Zeit auf verschiedenen Systemen generiert werden.

    time() als Präfix anzugeben ist ziemlich sinnlos - dadurch vergrößerst du die Entropie nicht, du machst das System höchstens langsamer[2].

    Im übrigen muss boundary nicht je Mail eindeutig sein, irgend ein hardcodierter Zufallsstring, welcher nicht mit dem E-Mail-Text kollidiert, reicht bei weitem aus[3].

    [1] der Parameter, dem du die aktuelle Zeit in Sekunden verpasst
    [2] äußerst vernachlässigbar
    [3] http://tools.ietf.org/html/rfc1847