Formular mit mehren Dateianhängen

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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!"); 
    Last edited by torud; 31-07-2006, 19:20.
    Danke
    Tom

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

    Comment


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

      Comment


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

        Comment


        • #5
          Soeben realisiert, sorry nochmals!
          Danke
          Tom

          Comment


          • #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.

            Comment


            • #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

              Comment


              • #8
                joar, das prinzip ist gut.

                Comment


                • #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

                  Comment


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

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

                    Comment


                    • #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

                      Comment


                      • #12
                        du könntest mal testaugaben machen.

                        Comment


                        • #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

                          Comment


                          • #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.
                            Last edited by penizillin; 27-07-2007, 16:21.

                            Comment


                            • #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)

                              Comment

                              Working...
                              X