E-Mail Anhang hat keine Endung

tellerwaescher

Grünschnabel
Hallo!
Vorab sei gesagt, dass ich in PHP (noch) Anfänger bin. Mein Problem ist folgendes:
Ich benutze im Wesentlichen dieses Skript, um in einem Formular einen Anhang per E-Mail an eine vordefinierte Adresse zu schicken.

Das klappt auch soweit ganz gut. Nur leider kommen die Dateien ohne Endung an und bei mehreren Wörtern in einem Dateinamen steht nur der erste im Attachment. Also z.B. heißt die Datei "Photoshop Tutorial.zip" und ankommen tut dann "Photoshop".

Vielleicht kann mir jemand auf der Grundlage des genannten Skripts sagen, was ich einbauen muss, damit der Anhang korrekt angezeigt wird. Hat vielleicht etwas mit dem Mime-Format zu tun.

Hier ist das Skript:

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

Quelle
 
Anscheinend mag er keine Leerzeichen.

Möglichkeit A) [phpf]urlencode[/phpf]
Möglichkeit B) [phpf]str_replace[/phpf] und Leerzeichen durch Unterstriche ersetzen
 
Aber warum ist dann auch bei einer Datei wie "Tutorial.pdf" keine Endung in der Mail? Offenbar werden auch die Endungen gekürzt, nicht nur wegen Leerzeichen.
 
Kann ich so nicht bestätigen.
1874.gif
test.txt
alt.txt
neu.docx

Alle Dateien wurden mit Endung angezeigt, mit deinem Skript von oben.
 
Auf dem Server ist PHP 4.4.7 installiert, wie ich gerade sehe. Könnte es damit zusammenhängen?
Thunderbird ist bei mir auf version 2.0.0.6.
 
Zuletzt bearbeitet:
Sorry, ich muss korrigieren: es funktioniert doch mit der Endung bei Dateien ohne Leerzeichen. Hatte es ganz am Anfang mal mit einer PDF probiert und bei der wurde die Endung nicht angezeigt. Das Problem kann ich leider nicht rekonstruieren, weil ich seitdem Veränderungen vorgenommen habe. Insofern besteht also nur noch das Problem mit den Leerzeichen.

Es sind wohl im Skript speziell diese Zeilen, die verändert werden müssen:

PHP:
    $Header .= "; name=";
    $Header .= $_FILES['upload_attachment']['name'];
    $Header .= "\n";

und

PHP:
    $Header .= "Content-Disposition: attachment; filename=";
    $Header .= $_FILES['upload_attachment']['name'];
    $Header .= "\n\n";

Wie kann ich das denn mit den von dir genannten Funktionen tun?
 
Hab eine Lösung gefunden, war eigentlich ganz simpel (trotzdem muss man erst mal drauf kommen): einfach Anführungszeichen mit Backslash vor den Dateinamen setzen.
 
Zurück