Fehler beim Versenden von E-Mails mit Anhang

vercetti

Mitglied
Hallo,

ich habe ein Skript, dass es mir erlaubt, Dateien als Anhang einer eMail mitzuschicken.

Nun werden die Dateien zwar mitgeschickt, allerdings sind sie meist kleiner als das Original und lassen sich auch nicht öffnen. Bilder lassen sich zum Beispiel nicht anzeigen.

Hier der Code:
PHP:
$contenttypes = array(
        "text/plain"            => array("encoding"=>"8bit"  ,"info"=>"purer Text"),
        "text/html"            => array("encoding"=>"8bit"  ,"info"=>"HTML-Dokument"),
        "image/gif"            => array("encoding"=>"base64","info"=>"Bild: GIF"),
        "image/jpeg"            => array("encoding"=>"base64","info"=>"Bild: JPEG"),
        "image/png"            => array("encoding"=>"base64","info"=>"Bild: PNG"),
        "application/x-zip-compressed"    => array("encoding"=>"base64","info"=>"Komprimiert: ZIP"),
        "application/x-gzip"        => array("encoding"=>"base64","info"=>"Komprimiert: GZ"),
        "application/x-tar"        => array("encoding"=>"base64","info"=>"Komprimiert: TAR")
    );

$message = $_POST['message'];
$subject = $_POST['subject'];

$mail_header = "From: system@XXXX.de";

        /* Wenn eine Datei als Anhang ausgewaelt wurde... */
        if($_FILES['datei']['tmp_name'] != "") {
$dateiname = $_FILES['datei']['name'];
$anhang_content_type = $_FILES['datei']['type'];

            /* Lese die temporaere Datei, die der Benutzer hochgeladen hat aus */
            $datei_content = fread(fopen($_FILES['datei']['tmp_name'],"r"),filesize($_FILES['datei']['tmp_name']));

            /* Codiere Datei ins BASE64-Format, falls noetig */
if($contenttypes[$anhang_content_type][encoding]=="base64") $datei_content = chunk_split(base64_encode($datei_content));
            else $datei_content = $datei_content;

            /* Generiere einen Boundary */
            $boundary = strtoupper(md5(uniqid(time())));

            /* Beginne den Mail-Header mit MIME-Mail-Header */
            /* (siehe http://www.php3-forum.de/mime_mail.htm) */
            $mail_header .= "\nMIME-Version: 1.0";
            $mail_header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
$mail_header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";

            /* Hier faengt der normale Mail-Text an */
            $mail_header .= "\n--$boundary";
            $mail_header .= "\nContent-Type: text/plain";
            $mail_header .= "\nContent-Transfer-Encoding: 8bit";
            $mail_header .= "\n\n$message";

            /* Hier faengt der Datei-Anhang an */
            $mail_header .= "\n--$boundary";
            $mail_header .= "\nContent-Type: $anhang_content_type; name=\"$dateiname\"";
            /* Lese aus dem Array $contenttypes die Codierung fuer den MIME-Typ des Anhangs aus */
            $mail_header .= "\nContent-Disposition: attachment; filename=\"$dateiname\"";
            $mail_header .= "\n\n$datei_content";

            /* Gibt das Ende der eMail aus */
            $mail_header .= "\n--$boundary--";
        } else {
            $mail_header .= "\nContent-Type: text/plain";
            $mail_header .= "\nContent-Transfer-Encoding: 8bit";
            $mail_header .= "\n\n".$message;
        }

mail($emp,$subject,"",$mail_header);
Kann es evtl daran liegen, dass ich die Datei erst hochladen muss, bevor ich sie einer eMail anfüge? In meinem Beispiel wird die Datei nämlich im Selben Schritt mit dem Versand der eMail hochgeladen.

Mfg Vercetti
 
Prinzipiell startet die Verarbeitung des Skriptes erst dann, wenn die Anfrage komplett ist, also wenn die Datei komplett hochgeladen wurde. Also kannst du das Skript so lassen wie es ist.

Gib die hochgeladenen Dateien doch mal zusätzlich aus.
 
Hi,

ich habe das mal mit einer Bilddatei getestet. Tatsächlich konnte sie nicht ausgegeben bzw als Bild dargestellt werden.

Dem hat erst die simple copy()-Funktion Abhilfe geschafft. Und zwar, indem ich die Temporärdatei dauerhaft auf den Server gespeichert habe. Das ist doch aber nicht Sinn der Sache oder?
Muss man eine Anhangsdatei denn auf dem Server speichern?
Die temporären Dateien konnten nie ausgegeben werden und wurden auch als Anhang defekt verschickt.

mfg Vercetti
 
Zurück