Michi: Formular Mailer mit Datei

Hallo

Ich versuche wie schon im Titel steht einen Formular Mailer zu basteln mit welchem man auch Dateien (voerst mal *.jpg) mitschicken kann!

Hier mein Code:
----------------------------------
$sender = '"Name" name@server.at';
   $subject = $formtitle;
   $datei = $_POST[file1];
   $strDelimiter  = ":\t";
    while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
   foreach($value as $value_array)
   {
    $strMailtext .= $strName.$strDelimiter.$value_array."\n";

}
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

if(get_magic_quotes_gpc())
 {
  $message = stripslashes($strMailtext);
 }

$empfaenger ="name@server.at";
   if ($_POST)) {

// Ab hier nix mehr ändern!!!
      $datei_content = fread(fopen($datei,"r"), filesize($datei));
      $datei_content = chunk_split(base64_encode($datei_content));
      $boundary = strtoupper(md5(uniqid(time())));

// Beginne den Mail-Header mit MIME-Mail-Header
      $mail_header = "From: ".$sender;
      $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 -- ";
      $mail_header .= "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: image/jpg; name="".$datei.""";

// Lese aus dem Array $contenttypes die Codierung fuer den MIME-Typ des Anhangs aus
      $mail_header .= "\nContent-Transfer-Encoding: base64";
      $mail_header .= "\nContent-Disposition: attachment; filename="".$datei.""";
      $mail_header .= "\n\n$datei_content";

// Gibt das Ende der eMail aus
      $mail_header .= "\n--$boundary--";

if (mail($empfaenger, $subject, $message, $mail_header))
         $status = "mail gesendet!";
      else
         $status = "fehler!";

echo "$status<BR><BR>";

}
-----------------------------------------------
Soweit so gut aber irgendwie dürften die Dateien falsch codiert werden oder so denn nach dem Empfang der Mail haben die Dateien keinen Inhalt!
Hilfe!

Danke euch...

  1. Hello,

    $datei_content = chunk_split(base64_encode($datei_content));

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

    $mail_header = "From: ".$sender;
          $mail_header .= "\nMIME-Version: 1.0";

    und bei allen Headern

    $mail_header .= "\r\nMIME-Version: 1.0";

    Statt "\n" ggf. besser chr(10)
          "\r\n" ggf. besser chr(13).chr(10)

    oder etwas gleichwertiges schreiben.
    Definiere Dir am besten Konstanten dafür.

    In PHP werden \n und \r\n zwar als Konstanten behandelt (zumindest nach allen Unterlagen, die ich bisher dafür finden konnte), aber in PERL z.B. werden sie (laut Daniela Koller) nur als Platzhalter angesehen und dann plattformabhängig umgewandelt.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo»» Hello,

      $datei_content = chunk_split(base64_encode($datei_content));

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

      $mail_header = "From: ".$sender;
            $mail_header .= "\nMIME-Version: 1.0";

      und bei allen Headern

      $mail_header .= "\r\nMIME-Version: 1.0";

      Statt "\n" ggf. besser chr(10)
            "\r\n" ggf. besser chr(13).chr(10)

      Danke erstmal für die Hilfe....aber leider funktioniert es noch immer nicht. Selbes problem wie davor.

      Michi

      1. Hello,

        Danke erstmal für die Hilfe....aber leider funktioniert es noch immer nicht. Selbes problem wie davor.

        Auszug aus der RFC:

        Resnick                     Standards Track                     [Page 6]

        RFC 2822                Internet Message Format               April 2001

        to handle an arbitrarily large number of characters in a line
           (certainly at least up to the 998 character limit) for the sake of
           robustness.

        2.2. Header Fields

        Header fields are lines composed of a field name, followed by a colon
           (":"), followed by a field body, and terminated by CRLF.  A field
           name MUST be composed of printable US-ASCII characters (i.e.,
           characters that have values between 33 and 126, inclusive), except
           colon.  A field body may be composed of any US-ASCII characters,
           except for CR and LF.  However, a field body may contain CRLF when
           used in header "folding" and  "unfolding" as described in section
           2.2.3.  All field bodies MUST conform to the syntax described in
           sections 3 and 4 of this standard.

        Die Header müssen mit CRLF abgeschlossen werden. Das hast Du vielleicht vergessen.
        Und es gibt dann auch vor und nach einer Boundary Bedarf an Leerzeilen. Als Leerzeile gilt eine Zeile, bei der hinter einem CRLF sofort ein Whitespace folgt.

        Daraus ergibt sich für mich also eigentlich

        ...CRLF CRLF...

        Wobei die Punkte für Druckbare ASCII-Zeichen stehen.

        Ich erinnere mich daran, dass ich das gleiche Problem hatte, als ich mein Mailmodul erstellt habe. Nach nochmaligem sauberen Aufbau und Einhaltung der Leerzeilen vor und nach dem Content des Subbodys hat es dann geklappt.

        Außerdem dürfen keine Header-Zeilen ohne Value vorhanden sein, also nur der Name des Headers und dann kein Value-Element. Das vertragen verschiedene SMTP-Server nicht.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  2. Hallo

    if ($_POST)) {

    $datei_content = chunk_split(base64_encode(file_get_contents($datei)));
          $boundary = strtoupper(md5(uniqid(time())));

    // Beginne den Mail-Header mit MIME-Mail-Header
          $mail_header = "From: ".$sender;
          $mail_header .= "\r\nMIME-Version: 1.0";
          $mail_header .= "\r\nContent-Type: multipart/mixed; boundary=$boundary";
          $mail_header .= "\r\n\r\nThis is a multi-part message in MIME format -- ";
          $mail_header .= "Dies ist eine mehrteilige Nachricht im MIME-Format";

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

    // Hier faengt der Datei-Anhang an
          $anhang = "\r\n--$boundary";
          $anhang .= "\r\nContent-Type: image/jpg; name="".$datei.""";

    // Lese aus dem Array $contenttypes die Codierung fuer den MIME-Typ des Anhangs aus
          $anhang .= "\r\nContent-Transfer-Encoding: base64";
          $anhang .= "\r\nContent-Disposition: attachment; filename="".$datei.""";
          $anhang .= "\r\n\r\n$datei_content";

    // Gibt das Ende der eMail aus
          $ende = "\r\n\r\n--$boundary--";

    if (mail($empfaenger, $subject, $text_body.$anhang.$ende, $mail_header))
             $status = "mail gesendet!";
          else
             $status = "fehler!";

    echo "$status<BR><BR>";

    }

    Es macht wenig Sinn alles in den additional_headers reinzustellen und dann zu erwarten, der Text würde irgends erscheinen, desweiteren hatte Tom den wichtigsten Grund für Fehler beim versenden vom Mails schon genannt. "\r\n"

    Man beachte, daß zwischen dem Head der Mail und dem Body immer doppelter Absatz mit \r\n\r\n zu stehen hat, genauso wie zwischen den Inhaltsgrenzen (boundary) und dem folgenden Content!

    Gruß aus Berlin!
    eddi

    --
    wahsaga (http://forum.de.selfhtml.org/archiv/2004/9/90932/#m546295)
    > vielleicht könnte man für heteros eine "strict"-DTD zu grunde legen [...oder...] eine darauf anwendbare CSS-eigenschaft 'sex'
    In dem Sinne: Ein -Hoch- auf die Liebe zwischen Menschen! ;)
    1. Hello,

      Es macht wenig Sinn alles in den additional_headers reinzustellen und dann zu erwarten, der Text würde irgends erscheinen, desweiteren hatte Tom den wichtigsten Grund für Fehler beim versenden vom Mails schon genannt. "\r\n"

      Man beachte, daß zwischen dem Head der Mail und dem Body immer doppelter Absatz mit \r\n\r\n zu stehen hat, genauso wie zwischen den Inhaltsgrenzen (boundary) und dem folgenden Content!

      Ich möchte aber nochmal darauf hinweisen, dass noch ein durchaus berechtigter Dissenz zwischen Daniela und mir darüber besteht, ob man bei PHP auch die Code-Values (als Oktalwerte, Hexadezimalwerte oder eben als dezimalen ASCII-CODE) angeben muss, oder ob die Steuerzeichen "\r\n" tatsächlich auf jeder Plattform in CRLF übersetzt werden. Intuitiv habe ich das in meinen Applikationen immer in absoluten Codes angegeben (Konstanten definiert), weiß also deshalb nicht, ob die andere Variante Fehler verursachen kann. PERL ist da schließlich nicht identisch mit PHP. Aber auch in allen Dokus zu ANSI-C konnte ich bisher nur die absolute Übersetzung finden, und keine referenzierte.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hallo Tom,

        PERL ist da schließlich nicht identisch mit PHP.

        Wo ich Dich grade erwische, hast Du ein gutes Manuel (LanguagePriority de en) im Netz über Perl zu empfehlen?

        Gruß aus Berlin!
        eddi

        --
        wahsaga (http://forum.de.selfhtml.org/archiv/2004/9/90932/#m546295)
        > vielleicht könnte man für heteros eine "strict"-DTD zu grunde legen [...oder...] eine darauf anwendbare CSS-eigenschaft 'sex'
        In dem Sinne: Ein -Hoch- auf die Liebe zwischen Menschen! ;)
        1. Hello,

          PERL ist da schließlich nicht identisch mit PHP.

          Wo ich Dich grade erwische, hast Du ein gutes Manuel (LanguagePriority de en) im Netz über Perl zu empfehlen?

          Ich habe da ein Tutorial für PERL, falls Du das msint, nachdem ich mir das so nach und nach antue. Da ich ja so langsam auf den Exitus zuschreite, muss das immer hübsch langsam vorangehen. Aber da kann ich mich bei dem Tut nicht beklagen http://perl-seiten.privat.t-online.de/

          Kann man sich auch runterladen

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Moin Tom :)

            Danke!

            Gruß aus Berlin!
            eddi

            --
            wahsaga (http://forum.de.selfhtml.org/archiv/2004/9/90932/#m546295)
            > vielleicht könnte man für heteros eine "strict"-DTD zu grunde legen [...oder...] eine darauf anwendbare CSS-eigenschaft 'sex'
            In dem Sinne: Tassen hoch! Auf die Liebe zwischen Menschen! ;)