kati: Formmailer Attachment

Hi, ich hab ein Formular, mit einem Datei "Upload". Diese Datei (file1) wird aber nicht irgendwo gespeichert, sondern soll als Attachtment in einem Email versendet werden.
Aber genau dies wird nicht gemacht. Ich bekomme nicht einmal eine leere mail.

Den Code hab ich von irgendwo kopiert und angepasst.

Sieht jemand einen Fehler?

Danke schonmal im Vorraus

<?php

$strEmpfaenger = "exampleEmpf@example.ch";

$strFrom       =  "exampleFROM@examlpe.ch";

$strSubject    = 'Subject EXAMPLE';

$strDelimiter  = " = ";
$strMailtext="INHALT von EMAIL";

$file = $file1;
$file_name = $_FILES["file1"]["name"];
$from = $strFrom;
$boundary = strtoupper(md5(uniqid(time())));
$mail_header  = "From:Test <$from>\n";
$mail_header .= "MIME-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";
$mail_header .= "\n--$boundary";
$mail_header .= "\nContent-Type: text/plain";
$mail_header .= "\nContent-Transfer-Encoding: 8bit";
$mail_header .= "\n\n$message";
$file_content = fread(fopen($file,"r"),filesize($file));
$file_content = chunk_split(base64_encode($file_content));
$mail_header .= "\n--$boundary";
$mail_header .= "\nContent-Type: application/octetstream; name="$file_name"";
$mail_header .= "\nContent-Transfer-Encoding: base64";
$mail_header .= "\nContent-Disposition: attachment; filename="$file_name"";
$mail_header .= "\n\n$file_content";
$mail_header .= "\n--$boundary--";

mail($strEmpfaenger,$strSubject,$strMailtext,$mail_header);
?>

  1. Hello,

    Sieht jemand einen Fehler?

    Ja. Obwohl Du Dein Script nicht so schön sortiert hast.
    EVA lässt grüßen :-)

    $file_content = chunk_split(base64_encode($file_content));

    ist vermutlich dafür verantwortlich, dass es nicht funktioniert.
    http://de.php.net/manual/de/function.chunk-split.php

    end

    Die Zeilenend-Sequenz. Standardwert ist "\r\n".

    und die wird bei Dir hier benutzt.
    Wenn Du die Mail nun über ein "sendmail" auf einem Linux-OS versendest, und nicht direkt über Blockbuffer und Port 25 an den MTA gibst, dann verarscht Dich das sendmail.

    Es machrt aus jedem "\r\n"  ein  "\r\n\r\n", weil es sowohl das \r als auch das \n zu einem vollständigen "\r\n" ergänzt.

    Gib also als Zeilenendsequenz nur "\n" an und Deine mail wird ankommen.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. hi!

      Danke für dia antwort!

      »»Es machrt aus jedem "\r\n"  ein  "\r\n\r\n", weil es sowohl das \r als auch das \n zu einem vollständigen "\r\n" ergänzt.

      Gib also als Zeilenendsequenz nur "\n" an und Deine mail wird ankommen.

      versteh ich nicht so ganz

      "string chunk_split ( string $body [, int $chunklen [, string $end ]] )

      end
      Die Zeilenend-Sequenz. Standardwert ist "\r\n". "

      Muss ich das jetzt so machen:

      $file_content = chunk_split(base64_encode($file_content) "/n");
      (man merkts wohl, ich komm net draus ;))
      Dankschän

      1. Hello,

        versteh ich nicht so ganz

        "string chunk_split ( string $body [, int $chunklen [, string $end ]] )

        end
        Die Zeilenend-Sequenz. Standardwert ist "\r\n". "

        Muss ich das jetzt so machen:

        $file_content = chunk_split(base64_encode($file_content) "/n");

        fast - aber trotzdem vorbei :-)

        $file_content = chunk_split(base64_encode($file_content) "\n");

        und tatsächlich die doppelten Häkchen nehmen!

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. Hello,

          fast - aber trotzdem vorbei :-)

          $file_content = chunk_split(base64_encode($file_content) "\n");

          und tatsächlich die doppelten Häkchen nehmen!

          Sorry, jetzt habe ich selber vorbeigeschossen.
          Der Parameter 'chunklen' darf natürlich nicht ausgelassen werden. Und ein paar Kommata sind auch nicht übel *tztz*

          $file_content = chunk_split(base64_encode($file_content), 76, "\n");

          so wäre nun hoffentlich ricbtig.

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. Hi!

            Danke nochmals...

            Ich verzweifle bald.. funktioniert immernoch nicht. Irgendwo ist hier noch der Wurm drin. Kannst jemand hier nochmals einen blick draufwerfen? Danke viiiiiiel mals!

            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
              <head>
                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
                <title>EM2008 - Flyer und Plakate günstig drucken - Bestätigung
                </title>
                <link href="style.css" rel="stylesheet" type="text/css" />

            </head>
              <body>
            <?php
            $file=$_GET['file1'];  //Das ist doch ok, wenn ich auf der vorhergehenden seite ein  <input type="file" name="file1" > hatte?

            $file_name = $_FILES["file1"]["name"];
            $from = "bla@bla.de";
            $strEmpfaenger="bla2@bla.de";
            $strSubject="subject";
            $strMailtext="Wird oben genauer definiert";
            $boundary = strtoupper(md5(uniqid(time())));
            $mail_header  = "From:Test <$from>\n";
            $mail_header .= "MIME-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";
            $mail_header .= "\n--$boundary";
            $mail_header .= "\nContent-Type: text/plain";
            $mail_header .= "\nContent-Transfer-Encoding: 8bit";
            $mail_header .= "\n\n$message";
            $file_content = fread(fopen($file,"r"),filesize($file));
            $file_content = chunk_split(base64_encode($file_content), 76, "\n");
            $mail_header .= "\n--$boundary";
            $mail_header .= "\nContent-Type: application/octetstream; name="$file_name"";
            $mail_header .= "\nContent-Transfer-Encoding: base64";
            $mail_header .= "\nContent-Disposition: attachment; filename="$file_name"";
            $mail_header .= "\n\n$file_content";
            $mail_header .= "\n--$boundary--";

            mail($strEmpfaenger,$strSubject,$strMailtext,$mail_header);
              or die("Die Mail konnte nicht versendet werden.");

            echo " <table><tr>
                  <td>ALLES OK</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr></table>";

            ?>
              </body>
            </html>

            Und nochmals: DANKE!

            1. Hello,

              ein Fehler ist noch im Content-Type des Attachments

              falsch:  $mail_header .= "\nContent-Type: application/octetstream; name="$file_name"";

              $mail_header .= "\nContent-Type: application/octet-stream; name="$file_name"";

              Es ist eigentlich auch eine Unsitte, die Newlines _vor_ den Headern zu notieren, denn die Header werden damit abgeschlossen und man könnte so leicht mal ein abschließendes Newline vergessen...

              Wenn ich bei der "Komposition" von MIME-Mails nicht genau weiß, wie die aussehen sollten, bau ich mir immer eine Muster mit einem Mailclient...

              So würde es z.B. mit Outlook Express aussehen. Man muss nur noch den ganzen Unsinn rausschmeißen, aber hat dann die Struktur als Beispiel.

              Return-Path: bitworks@online.de
              X-Original-To: tom@bitworks.de
              Delivered-To: web1p1@h93968.serverkompetenz.net
              Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.188])
               by h93968.serverkompetenz.net (Postfix) with ESMTP id 4C53F21C3C0
               for tom@bitworks.de; Tue, 18 Dec 2007 13:12:32 +0100 (CET)
              Received: from pc14 (p5B03C3B4.dip0.t-ipconnect.de [91.3.195.180])
               by mrelayeu.kundenserver.de (node=mrelayeu0) with ESMTP (Nemesis)
               id 0MKwh2-1J4bL42aqH-00022y; Tue, 18 Dec 2007 13:14:22 +0100
              Message-ID: 001901c8416f$bb0d3780$2c65a8c0@pc14
              From: bitworks@online.de
              To: tom@bitworks.de
              Subject: Attachment
              Date: Tue, 18 Dec 2007 13:15:50 +0100
              MIME-Version: 1.0
              Content-Type: multipart/mixed;
               boundary="----=_NextPart_000_0016_01C84178.1C72DDB0"
              X-Priority: 3
              X-MSMail-Priority: Normal
              X-Mailer: Microsoft Outlook Express 5.50.4927.1200
              Disposition-Notification-To: bitworks@online.de
              X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4927.1200
              X-Provags-ID: V01U2FsdGVkX18ZKCVly+qqKRe2W304JdeiE8SlJiVLYPJZU1V
               N8XOiLyHLqLxshUoGW5B3ys7YTQxwkUAnR/zkaraNQHLWOhLc5
               J2LyQRCJ1X4O7nMl/OiDlpRObOgOyMc
              X-UIDL: Eon!!=1C!!h"!!n7e"!

              This is a multi-part message in MIME format.

              ------=_NextPart_000_0016_01C84178.1C72DDB0
              Content-Type: text/plain;
               charset="iso-8859-1"
              Content-Transfer-Encoding: 8bit

              Mail mit Anhang

              ---------------------------------------------
              bitworks®
              Mühlenstraße 19
              D-37444 Sankt Andreasberg
              Tel 05582/999881
              Fax 05582/999882
              bitworks@online.de

              ------=_NextPart_000_0016_01C84178.1C72DDB0
              Content-Type: text/plain;
               name="attachment.txt"
              Content-Transfer-Encoding: 7bit
              Content-Disposition: attachment;
               filename="attachment.txt"

              Textanhang
              Nur ein Test
              ------=_NextPart_000_0016_01C84178.1C72DDB0--

              Hier ist z.B. ersichtlich, dass zwischen dem Disposition-Header und dem Anhang eine Leerzeile steht...

              Harzliche Grüße vom Berg
              http://bergpost.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            2. Hello,

              Deine Zeile:

              $mail_header .= "\nContent-Type: multipart/mixed; boundary=$boundary";

              die aus Outlook Express:

              boundary="----=_NextPart_000_0016_01C84178.1C72DDB0"

              siehst Du den Unterschied?

              Es fehlen die begrenzenden Häkchen für die Boundary

              Harzliche Grüße vom Berg
              http://bergpost.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)