Formular mit mehren Dateianhängen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Formular mit mehren Dateianhängen

    Hallo Wissende,

    mit folgendem Code, ist es mir möglich eine Datei als Anhang per Mail aus einem Formular heraus zu versenden. Meine Frage ist eigentlich nur, was ich machen muss, damit ich mehr als einen Dateianhang versenden kann. Ich würde mich dabei, der Einfachheit halber, auch an Namensrestriktionen halten und die Inputfelder im Form z.B. so benennen: upload1, upload2 usw...

    Folgenden Code nutze ich bisher

    könnte ich da irgendwo ne Schleife unterbringen? Es tut mir leid, aber ich habe leider nichts passendes bei der Suche finden können.

    PHP-Code:
    # Maximale Größe des Attachments in Bytes:
    $max_attach_size 100000;
    $filesize        false;
    $int_filesize    $_FILES['upload1']['size'];
    $str_filename    $_FILES['upload1']['name'];

    if (
    $int_filesize $max_attach_size)
     {
    $filesize false;
       echo 
    "<h3>Meldung vom FormMailer</h3>";
       echo 
    "Ihr Attachment <b>".$str_filename."</b> ist zu groß 
    ("
    .number_format($_FILES['upload1']['size']/1000,0,",","")." KB)
     - Maximalgröße: .number_format(
    $max_attach_size/1000,0,",","")." 
    KB<br>";
         echo "
    <br><a href=\"javascript:history:back()\">Zurück zum Formular</a>";
      }
    else
      {
    // Wenn Attachment vorhanden und grösse ok, dann MIME-Mail erstellen:
       
    $filesize true;
       if (
    $_FILES['upload1']['name'] && $filesize == true)
         {
          
    // Datei einlesen und codieren:
          
    $datei_content fread(fopen($_FILES['upload1']['tmp_name'],"r"),
    filesize($_FILES['upload1']['tmp_name']));
          
    $datei_content chunk_split(base64_encode($datei_content),76,"\n");

          
    // Boundary festlegen:
          
    $boundary md5(uniqid(rand()));

          
    // Mail-Header:
          
    $header "From: FormMailer<".$strFrom.">\r\n";
          
    $header .= "X-Sender-IP: ".$ip."\n";
          
    $header .= "MIME-Version: 1.0\n";
          
    $header .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n";
          
    $header .= "This is a multi-part message in MIME format.\n";
          
    // Mail-Text:
          
    $header .= "--".$boundary;
          
    $header .= "\nContent-Type: text/plain";
          
    $header .= "\nContent-Transfer-Encoding: 8bit";
          
    $header .= "\n\n".$text."\n\n(".number_format($int_filesize/1000,0,",","")." KB)";
          
    // Attachment:
          
    $header .= "\n--".$boundary;
          
    $header .= "\nContent-Type: ".$_FILES['upload1']['type']."; 
    name=\""
    .$_FILES['upload1']['name']."\"";
          
    $header .= "\nContent-Transfer-Encoding: base64";
          
    $header .= "\nContent-Disposition: attachment; 
    filename=\""
    .$_FILES['upload1']['name']."\"";
          
    $header .= "\n\n".$datei_content;

          
    // Ende:
          
    $header .= "\n--".$boundary."--";
          
    // Sende E-Mail und gebe Fehler bzw. Bestaetigung aus
          
    mail($email,$betreff,"",$header) or die ("Fehler beim Übermitteln!"); 
    Zuletzt geändert von torud; 31.07.2006, 20:20.
    Danke
    Tom

  • #2
    Warum habt ihr heute alle so probleme die PHP-Tags zu verwenden?

    Kommentar


    • #3
      ich ändere es sofort, wenn ich es finde...will ja schliesslich, dass jeder es lesen kann!
      Danke
      Tom

      Kommentar


      • #4
        Wunderbar, und jetzt bitte noch den horizontalen Scrollbalken weg: http://www.php-resource.de/forum/sho...threadid=50454

        Kommentar


        • #5
          Soeben realisiert, sorry nochmals!
          Danke
          Tom

          Kommentar


          • #6
            sehr gut. nun zu deinem problem, verzeihe wenn ichs nicht gleich einbaue.

            schau dir mal den inhalt des $_FILES-Array an nachdem du ein Form mit meheren Datenfelden abgesendet hast. dann erkennst du ganz schnell, wie man das realisiert.

            Kommentar


            • #7
              Ok TobiaZ,

              ich werde mal schauen, aber ich bin einer, der sich den Kram selbst beibringt und durch lesen, abschauen und Bücher lernt. Klar checke ich da auch das ein oder andere von allein, aber in diesem Fall bin ich eher skeptisch, bin ja auch schon sooo alt => 34!

              Mal sehen, vielleicht gehts ja wie hier o.ä.

              PHP-Code:
              foreach ($https as $key => $value
              Danke
              Tom

              Kommentar


              • #8
                joar, das prinzip ist gut.

                Kommentar


                • #9
                  Also folgendes habe ich dank Google gefunden:

                  PHP-Code:
                  <form action="" method="post" enctype="multipart/form-data">
                  <p>Pictures:
                  <input type="file" name="pictures[]" />
                  <input type="file" name="pictures[]" />
                  <input type="file" name="pictures[]" />
                  <input type="submit" value="Send" />
                  </p>
                  </form>

                  <?php
                  foreach ($_FILES["pictures"]["error"] as $key => $error) {
                     if (
                  $error == UPLOAD_ERR_OK) {
                         
                  $tmp_name $_FILES["pictures"]["tmp_name"][$key];
                         
                  $name $_FILES["pictures"]["name"][$key];
                         
                  move_uploaded_file($tmp_name"data/$name");
                     }
                  }
                  ?>
                  Damit bin ich um einiges schlauer. Es ist wirklich einfacher, als ich dachte => ABER: gemäß meinem Beispiel aus dem ersten Post, frage ich mich nun, wie ich die Dateien zum Attachment füge...

                  Hier wird ja der Dateiinhalt in einer Variablen übergeben
                  PHP-Code:
                  $datei_content fread(fopen($_FILES['upload1']['tmp_name'],"r"),
                  filesize($_FILES['upload1']['tmp_name']));
                        
                  $datei_content chunk_split(base64_encode($datei_content),76,"\n"); 
                  Und hier wurde der die Datei in den Header geknallt:

                  PHP-Code:
                  $header .= "\nContent-Type: ".$_FILES['upload1']['type']."; name=\"".$_FILES['upload1']['name']."\"";
                  $header .= "\nContent-Transfer-Encoding: base64";
                  $header .= "\nContent-Disposition: attachment; 
                  filename=\""
                  .$_FILES['upload1']['name']."\"";
                  $header .= "\n\n".$datei_content
                  Die Codes kann man bestimmt hier und da kürzen, aber würde es rein theoretisch auch so gehen?

                  PHP-Code:
                  <?php
                  foreach ($_FILES["pictures"]["error"] as $key => $error) {
                     if (
                  $error == UPLOAD_ERR_OK) {
                         
                  $tmp_name $_FILES["pictures"]["tmp_name"][$key];
                         
                  $name $_FILES["pictures"]["name"][$key];
                       
                  //und hier der Kram in den Header!?
                     
                  }
                  }
                  ?>
                  Ich frage lieber nach, bevor ich wieder nen riesen Fehler im Header habe, den ich dann nicht finden kann und um wirklich alle Dateien einzeln als Attachment in der Mail zu haben, sorry.
                  Danke
                  Tom

                  Kommentar


                  • #10
                    obs geht oder nicht verrät ein Test!

                    Zum anhängen gibts übrigens ziemlich gute fertige Klassen. nennen sich Mime Mail und konsorten...

                    Kommentar


                    • #11
                      fertige Klassen verstehe ich leider nicht. Ich habe 2 Bücher und habe dieses Thema leider noch nie verstanden, aber das ist ein anderes Thema.
                      Ich habe also im ganzen WWW innerhalb der letzten 10 Stunden nichts ausser ein paar Fetzen finden können und habe
                      nun folgenden Code, der NICHT funktioniert.

                      HTML-Code des Formulares:
                      PHP-Code:
                      <html>
                      <
                      head>
                      <
                      meta http-equiv="Content-Language" content="de">
                      <
                      meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
                      <
                      meta name="generator" content="Formular-Maker">
                      <
                      title>Kontakformular</title>
                      <
                      style type="text/css">
                        
                      body {background-color:#FFFFFF; font-family:"Arial";}
                        
                      h1.farbig {color:#000000; font-family:"Arial"; font-size:20px;}
                        
                      tr {font-family:"Arial"font-size:12px;}
                        .
                      td {font-family:"Arial"font-size:12px;}
                        
                      p.farbig {color:#000000; font-family:"Arial"; font-size:12px;}
                        
                      p.anno {color:#000000; font-family:"Arial"; font-size:12px;}
                      </style>
                      </
                      head>
                      <
                      body >
                      <
                      div align="center">
                      <
                      h1 class="farbig">Kontaktformular</h1>
                      <
                      class="anno">Mit diesem Formular können Sie uns erreichen.</p>
                      <
                      form name="Kontakt" action="formmailer_u.php"  enctype="multipart/form-data" method="POST">

                      <
                      input type="hidden" name="typ_sender" value="1">
                      <
                      input type="hidden" name="sender" value="">
                      <
                      input type="hidden" name="copy" value="">
                      <
                      input type="hidden" name="url" value="http://www.google.de">
                      <
                      input type="hidden" name="email" value="webmaster@nixda.de" >
                      <
                      input type="hidden" name="Betreff" value="Formular" >

                      <
                      table border="0px"  cellpadding="3px"  cellspacing="3px"  width="100%">
                      <
                      tr valign="middle" height="25">
                      <
                      td width="50%" class="td" align="right">Name</td>
                      <
                      td class="td"><input type="text" name="Name" value="" size="20" MaxLength="40"></td>
                      </
                      tr>
                      <
                      tr valign="middle" height="25">
                      <
                      td width="50%" class="td" align="right">E-Mail</td>
                      <
                      td class="td"><input type="text" name="SenderMail" value="" size="20" MaxLength="40"></td>
                      </
                      tr>
                      <
                      tr valign="middle" height="25">
                      <
                      td width="50%" class="td" align="right">Wählen Sie ein Bild auswelches Sie versenden wollen!</td>
                      <
                      td class="td"><input type="file" name="upload" size="50" MaxLength="110000"></td>
                      </
                      tr>
                      <
                      tr valign="middle" height="25">
                      <
                      td width="50%" class="td" align="right">Wählen Sie ein Bild auswelches Sie versenden wollen!</td>
                      <
                      td class="td"><input type="file" name="upload" size="50" MaxLength="110000"></td>
                      </
                      tr>
                      <
                      tr><td align="center" colspan="2">
                      <
                      input type="submit" name="next" value="Abschicken">
                      <
                      input type="reset" name="next" value="Zurücksetzen">
                      </
                      td></tr>
                      </
                      table>
                      </
                      form>
                      </
                      div>
                      </
                      body>
                      </
                      html
                      Code des FormMailers:
                      PHP-Code:
                      <?

                      $usermail = "webmaster@nixda.de";

                      $datum    = strftime("%d.%m.%Y");
                      $zeit     = date("H:i");
                      $https    = $HTTP_POST_VARS;
                      $email    = $_POST['email'];
                      $sender   = $_POST['sender'];
                      $betreff  = $_POST['betreff'];
                      $url      = $_POST['url'];
                      $rec2     = $_POST["email2"];
                      $copy     = $_POST["copy"];
                      $copyto   = $_POST["SenderMail"];
                      $strFrom  = $usermail;
                      $typ      = $_POST["typ_sender"];
                      $reply_to = $usermail;
                      $ip       = $_SERVER['REMOTE_ADDR'];


                      $text="Sie haben eine Mail am $datum um $zeit erhalten!\n
                      ___________________________________________________
                      \n";

                      $hidden_fields = array('next', 'url','copy','email','typ_sender','sender');

                      foreach ($https as $key => $value)
                      {
                          if (! in_array($key, $hidden_fields))
                              $text = $text."".$key." : ".stripslashes($value)."\n\n";
                      }

                      foreach ($https as $key => $value)
                      {
                          if (! in_array($key, $hidden_fields))
                              $text2= $text2."".$key." : ".stripslashes($value)."\n\n";
                      }
                          $text = $text."\n
                          __________________________
                          \nDatum:".$datum."\nUhrzeit:".$zeit." Uhr\nIP:".$ip."\n".$HTTP_USER_AGENT;

                          if(empty($betreff)) {$betreff="FormularMailer";}    
                          if(empty($email)) {$email= $strFrom;}
                          if(empty($url)) {$url='http://www.google.de';}

                          $reply_to = $copyto;

                          if (empty($typ)) {$reply_to=$sender;}
                          if ($typ ==1) {$reply_to = $_POST["SenderMail"];}
                          if ($typ ==0) {
                            if (empty($copyto)) $reply_to = $_POST["Sender"];
                            else                $reply_to = $_POST["SenderMail"];}

                          # Maximale Größe des Attachments in Bytes:
                          $max_attach_size = 100000;
                          $filesize        = false;


                        // Mail-Header:
                        $header = "From: FormMailer<".$strFrom.">\r\n";
                        $header .= "X-Sender-IP: ".$ip."\n";
                        $header .= "MIME-Version: 1.0\n";
                        $header .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n";
                        $header .= "This is a multi-part message in MIME format.\n";
                        // Mail-Text:
                        $header .= "--".$boundary;
                        $header .= "\nContent-Type: text/plain";
                        $header .= "\nContent-Transfer-Encoding: 8bit";

                          foreach ($_FILES["upload"]["error"] as $key => $error) {
                             if ($error == UPLOAD_ERR_OK) {
                                 $tmp_name        = $_FILES["upload"]["tmp_name"][$key];
                                 $str_filename    = $_FILES["upload"]["name"][$key];
                                 $int_filesize    = $_FILES['upload']['size'][$key];
                               //und hier der Kram in den Header!?

                                if ($int_filesize > $max_attach_size) 
                                  {$filesize = false;
                                   echo "<h3>Meldung vom FormMailer</h3>";
                                   echo "Ihr Attachment <b>".$str_filename."</b> ist zu groß
                                        (".number_format($int_filesize/1000,0,",","")." KB) - Maximalgröße: "
                                          .number_format($max_attach_size/1000,0,",","")." KB<br>";
                                   echo "<br><a href=\"javascript:history:back()\">
                      Zurück zum Formular</a>";
                                  }
                                else
                                  {// Wenn Attachment vorhanden und grösse ok, dann MIME-Mail erstellen:
                                 $filesize = true;
                                 if ($_FILES['upload']['name'][$key] && $filesize == true)
                                   {
                                    // Datei einlesen und codieren:
                                    $datei_content = fread(fopen($tmp_name,"r"),filesize($tmp_name));
                                    $datei_content = chunk_split(base64_encode($datei_content),76,"\n");

                                    // Boundary festlegen:
                                    $boundary = md5(uniqid(rand()));

                                    $header .= "\n\n".$text."\n\n(".number_format($int_filesize/1000,0,",","")." KB)";
                                    // Attachment:
                                    $header .= "\n--".$boundary;
                                    $header .= "\nContent-Type: ".$_FILES['upload']['type']."; name=\"".$tmp_name."\"";
                                    $header .= "\nContent-Transfer-Encoding: base64";
                                    $header .= "\nContent-Disposition: attachment; filename=\"".$tmp_name."\"";
                                    $header .= "\n\n".$datei_content;

                                   }
                                }

                            // Ende:
                            $header .= "\n--".$boundary."--";


                            // Sende E-Mail und gebe Fehler bzw. Bestaetigung aus
                            mail($email,$betreff,"",$header) or die ("Fehler beim Übermitteln!");

                            //hier werden dann noch die kopien abgefrühstückt
                            if ($rec2 != "") mail($rec2,$betreff,"",$header);
                            if ($copy != "") mail($copyto,$betreff,"",$header);


                             }
                          }

                      Header("Location: ".$url);

                      ?>
                      Ich bekomme leider keine Fehlermeldung...einfach nix. Ich habe hier im Forum nichts finden können und auch sonst nix...
                      und bin echt dankbar, wenn mir jemand etwas unter die Arme greifen könnte...

                      ps.: Keine Ahnung warum der Scrollbalken unten wieder da ist!
                      Danke
                      Tom

                      Kommentar


                      • #12
                        du könntest mal testaugaben machen.

                        Kommentar


                        • #13
                          Danke...Ich habs bis heut enicht hinbekommen. Es gibt einfach keine brauchbaren Tutorials. Warum nur? Finde ich sie nicht, oder gibt es keinen, der eins schreibt. Und warum verweisen immer alle auf den PhpMailer? Ich will das nicht, verzichte lieber drauf.
                          Danke
                          Tom

                          Kommentar


                          • #14
                            Es gibt einfach keine brauchbaren Tutorials. Warum nur?
                            weil es auch keine tutorials zum brotbacken, autofahren oder menschen operieren gibt. es gibt das fach und entweder lernst du es, oder du tust es nicht.
                            Und warum verweisen immer alle auf den PhpMailer? Ich will das nicht, verzichte lieber drauf.
                            das rad wurde schon erfunden. wo ist dein problem mit dem phpmailer?

                            p.s. es gibt noch pear und tausend anderer klassen, die du nehmen könntest.
                            Zuletzt geändert von penizillin; 27.07.2007, 17:21.

                            Kommentar


                            • #15
                              @topicstarter
                              Die Header Angaben zu einem Emailbestandteil müssen im Body der Email erfolgen und nicht im Header. Im Header der Email (also jene Var die als $header an mail() übergeben wird) steht nur, dass es sich um eine Multipart Email handelt.
                              Die "Headerangaben" zum einzelnen Attachment haben direkt vor den Nutzdaten des Attachments zu erfolgen. Im Header gibst du also nur die Daten an die emailweit gelten. Alles andere kommt in den body der Mail.

                              Gruss

                              tobi
                              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                              Kommentar

                              Lädt...
                              X