das: Formmailer Attachment

Hallo liebes Forum,

ich muss für mein Studium einen Formmailer mit Dateianhang auf einer Seite integrieren.
Mal kurz vorweg, der Formmailer funktioniert an sich einwandfrei, die Emails kommen an, nur beim Anhang wird im Moment nur der Dateiname mitgeschickt.

Ich habe gelesen, dass hat was mit Attachment zu tun? Da ich mich mit PHP nicht besonders auskenne, wäre ich für einen Tip sehr dankbar! Natürlich nur, wenn das jetzt nicht zu weit geht.

Ist es möglich hier den Dateianhang einfach zu integrieren?

Hier mein Code:

<?php  
  
$strEmpfaenger = 'test@testmail.de';  
  
$strFrom       = '"Absendername" <Absendermail>';  
  
$strSubject    = 'Upload';  
  
$strReturnhtml = 'http://www.meine-seite.de';  
  
$strDelimiter  = ": ";  
  
### Ende Konfiguration ###  
  
if($_POST)  
{  
	if($_POST['name'] && $_POST['mail'] && $_POST['nachricht'] && $_POST['anhang'])  
{  
 $strMailtext = "";  
  
 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";  
  }  
 }  
}  
 else die('Es wurden nicht alle Felder ausgefuellt. Bitte ueber die Browsernavigation zurueck.');  
  
 if(get_magic_quotes_gpc())  
 {  
  $strMailtext = stripslashes($strMailtext);  
 }  
  
 mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)  
  or die("Die Mail konnte nicht versendet werden.");  
 header("Location: $strReturnhtml");  
 exit;  
}  
  
?>
<div id="form">  
<form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">  
  
<input name="name" size="20" type="text" value="Name" onfocus="if(this.value=='Name') this.value='';" onblur="if(this.value=='') this.value='Name';"><br />  
  
<input name="mail" size="20" type="text" value="Email" onfocus="if(this.value=='Email') this.value='';" onblur="if(this.value=='') this.value='Email';"><br />  
  
<textarea cols="25" name="nachricht" rows="5" value="Nachricht" onfocus="if(this.value=='Nachricht') this.value='';" onblur="if(this.value=='') this.value='Nachricht';">Nachricht</textarea><br />  
  
<input name="anhang" size="20" type="file"><br />  
  
<input name="Send" type="submit" value="Abschicken">    <input name="Reset" type="reset" value="Löschen">  
  
</form>  
  
</div>
  1. Moin!

    ich muss für mein Studium einen Formmailer mit Dateianhang auf einer Seite integrieren.
    Mal kurz vorweg, der Formmailer funktioniert an sich einwandfrei, die Emails kommen an, nur beim Anhang wird im Moment nur der Dateiname mitgeschickt.

    Ich habe gelesen, dass hat was mit Attachment zu tun? Da ich mich mit PHP nicht besonders auskenne, wäre ich für einen Tip sehr dankbar! Natürlich nur, wenn das jetzt nicht zu weit geht.

    Dein Formular ist falsch.

    Und dein Mailer ist falsch. Und der ist an so vielen Stellen falsch, dass ich gar keine Lust habe, dir das im Detail aufzudröseln. Mal als Stichworte:

    • Kein Escaping
    • Alte PHP3-Strukturen
    • Unsachgemäße Behandlung von magic quotes.
    • Und nebenbei auch keinerlei korrekte Behandlung des Datei-Uploads.

    Was idt dein Studieninhalt? Programmierst du, oder geht es nur um das technische Abwickeln eines Mailversands, um was anderes zu erreichen?

    Im letzteren Fall sollten passende Skipte, die die notwendigen Sicherheitsanforderungen erfüllen, doch bei Google zu finden sein, ggf. auch als passender Formmailer-Dienst, oder durch Ersetzen mit einem schlichten mailto-Link.

    Für den ersteren Fall: Nimm einer Programmiersprache, die du besser kennst.

    - Sven Rautenberg

    1. Dein Formular ist falsch.

      Und dein Mailer ist falsch. Und der ist an so vielen Stellen falsch, dass ich gar keine Lust habe, dir das im Detail aufzudröseln. Mal als Stichworte:

      naja, das Formular ist schon etwas älter, das stimmt, aber ich habe es bei selfhtml.org gefunden und es funktioniert.

      Was idt dein Studieninhalt? Programmierst du, oder geht es nur um das technische Abwickeln eines Mailversands, um was anderes zu erreichen?

      nene, ich programmiere nicht. es geht im Grunde nur um den Upload, mehr brauche ich nicht. Die Datei soll mir dann automatisch per Mail zugeschickt werden.
      Dann schau ich mich nochmal nach fertigen Skripts um, bisher hab ich da nur nicht viel brauchbares gefunden.

      Trotzdem Danke für deine Zeit!

      1. Liebe(r) das,

        habe es [...] gefunden und es funktioniert.

        welch begnadete Argumentation... Da kommt bei mir unwillkürlich die Frage auf, warum Du hier dann Hilfe suchst.

        Aber egal. Hier meine Tipps:

        1.) Einfacher PHP-Formmailer
        2.) Steuerung von Dateiuploads mit PHP

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hallo Felix,

          habe es [...] gefunden und es funktioniert.

          ich ergänze das, was Du herausgestrichen hast.

          aber ich habe es bei selfhtml.org gefunden und es funktioniert.

          welch begnadete Argumentation... Da kommt bei mir unwillkürlich die Frage auf, warum Du hier dann Hilfe suchst.

          Aber egal. Hier meine Tipps:

          1.) Einfacher PHP-Formmailer

          welch begnadete Argumentation ... Da kommt bei mir unwillkürlich die Frage auf, ob Du die beiden Beiträge gelesen hast ;-)

          Das hier *ist* ganz genau dieser von Dir verlinkte einfache PHP-Formmailer.

          Freundliche Grüße

          Vinzenz

          1. Lieber Vinzenz Mai,

            Das hier *ist* ganz genau dieser von Dir verlinkte einfache PHP-Formmailer.

            fast! Wenn Du genau hinschaust, dann fehlt im OP der Teil mit der magic-quotes-Geschichte. Mag sein, dass der gepostete Code eine veraltete Version des im verlinkten Artikel beschriebenen Formmailers ist (die Variablennamen deuten darauf hin, auch diverses am Code-Layout), jedoch nicht das vermurkste Markup im HTML-Teil.

            Ich hielt es für angebracht, den Artikel zu verlinken, damit sich "das" den im Artikel propagierten Code noch einmal streng prüfend zur Brust nehmen kann - selbst auf die Gefahr hin, dass der Murks im OP aus einer Modifikation des originalen Codes entstanden war.

            Wenn ich Deine harsche Kritik an der Programmstruktur im OP in Erinnerung rufe, und Deine Behauptung, der gepostete Code sei 1:1 der im Artikel vorgeschlagene, dann bekommst Du von mir ein <I> für den Artikel. Annehmen musst Du es selbstverständlich nicht. ;-)

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hallo,

              Das hier *ist* ganz genau dieser von Dir verlinkte einfache PHP-Formmailer.

              fast! Wenn Du genau hinschaust, dann fehlt im OP der Teil mit der magic-quotes-Geschichte. Mag sein, dass der gepostete Code eine veraltete Version

              nicht veraltet, die aktuelle Version.

              des im verlinkten Artikel beschriebenen Formmailers ist (die Variablennamen deuten darauf hin, auch diverses am Code-Layout), jedoch nicht das vermurkste Markup im HTML-Teil.

              Ach Gott, so schrecklich ist der HTML-Teil doch gar nicht. Kann man alles mit CSS regeln. Definitionslisten für Formulare sind Murks. Ich persönlich bevorzuge in der Regel Tabellen zur Formulargestaltung, weil es sich bei Formularinhalten fast immer um tabellarische Daten handelt, siehe Archiv. Den Missbrauch von Listen für solche Zwecke halte ich für Murks ;-)

              Ich habe den PHP-Code aus dem Artikel kopiert, den Code aus dem OP füge ich Zeile für Zeile mit // auskommentiert ein. Damit man leichter vergleichen kann, habe ich den Originalcode um drei Leerzeichen eingerückt. Es ist leicht zu sehen, dass es sich - bis auf eine (im Grunde belanglose) Modifikation - um den Originalcode aus dem Artikel in dessen Originalformatierung handelt.

                 <?php  
              // <?php  
                
                 ### Konfiguration ###  
                
                 # Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!  
                
                 # An welche Adresse sollen die Mails gesendet werden?  
                 $strEmpfaenger = 'IhrName@provider.xy';  
              // $strEmpfaenger = 'test@testmail.de';  
                
                 # Welche Adresse soll als Absender angegeben werden?  
                 # (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)  
                 $strFrom       = '"Formmailer" <IhrAndererName@provider.xy>';  
              // $strFrom       = '"Absendername" <Absendermail>';  
                
                 # Welchen Betreff sollen die Mails erhalten?  
                 $strSubject    = 'Feedback';  
              // $strSubject    = 'Upload';  
                
                 # Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?  
                 # Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!  
                 $strReturnhtml = 'http://www.provider.xy/IhrName/IhreSeite.htm';  
              // $strReturnhtml = 'http://www.meine-seite.de';  
                
                 # Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?  
                 $strDelimiter  = ":\t";  
              // $strDelimiter  = ": ";  
                
                 ### Ende Konfiguration ###  
              // ### Ende Konfiguration ###  
                
                 if($_POST)  
              // if($_POST)  
                 {  
              // {  
              //    if($_POST['name'] && $_POST['mail'] && $_POST['nachricht'] && $_POST['anhang'])  
              // {  
                
                  $strMailtext = "";  
              //  $strMailtext = "";  
                
                  while(list($strName,$value) = each($_POST))  
              //  while(list($strName,$value) = each($_POST))  
                  {  
              //  {  
                   if(is_array($value))  
              //   if(is_array($value))  
                   {  
              //   {  
                    foreach($value as $value_array)  
              //    foreach($value as $value_array)  
                    {  
              //    {  
                     $strMailtext .= $strName.$strDelimiter.$value_array."\n";  
              //     $strMailtext .= $strName.$strDelimiter.$value_array."\n";  
                    }  
              //    }  
                   }  
              //   }  
                   else  
              //   else  
                   {  
              //   {  
                    $strMailtext .= $strName.$strDelimiter.$value."\n";  
              //    $strMailtext .= $strName.$strDelimiter.$value."\n";  
                   }  
              //   }  
                  }  
              //  }  
              // }  
              //  else die('Es wurden nicht alle Felder ausgefuellt. Bitte ueber die Browsernavigation zurueck.');  
                
                
                  if(get_magic_quotes_gpc())  
              //  if(get_magic_quotes_gpc())  
                  {  
              //  {  
                   $strMailtext = stripslashes($strMailtext);  
              //   $strMailtext = stripslashes($strMailtext);  
                  }  
              //  }  
                
                  mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)  
                   or die("Die Mail konnte nicht versendet werden.");  
              //  mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)  
              //   or die("Die Mail konnte nicht versendet werden.");  
                  header("Location: $strReturnhtml");  
              //  header("Location: $strReturnhtml");  
                  exit;  
              //  exit;  
                 }  
              // }  
                
                 ?>  
              // ?>  
              
              

              Der PHP-Code ist bis auf eine zusätzliche Überprüfung der Formularfelder identisch. Die Überprüfung ist nicht besonders und die Reaktion eine Zumutung. Aber es *ist* der Code des Formmailers.

              Der HTML-Teil ist aufs Formular gekürzt, enthält jedoch identisches PHP und enthält halt keine Definitionsliste (die ich selbst ebenfalls *nicht* verwendete), dafür Verstöße gegen das DRY-Prinzip.

              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
              <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">  
                  <head>  
                      <title>Einfacher PHP-Formmailer</title>  
                      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  
                  </head>  
                  <body>  
                      <h1>Beispielformular</h1>  
                      <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">  
              
              

              Und so sieht es im OP aus:

                      <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post"> -->  
              
              

              [...] Formularfelder gekürzt

                          <!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->  
                          <dl>  
                              <dt>Ihr Name:</dt>  
                              <dd><input type="text" name="Versender" /></dd>  
                              <dt>Ihre E-Mail:</dt>  
                              <dd><input type="text" name="E-Mail" /></dd>  
                              <dt>Sie k&ouml;nnen:</dt>  
                              <dd><input type="checkbox" name="kannwas[]" value="HTML" />HTML <input type="checkbox" name="kannwas[]" value="PHP" />PHP</dd>  
                              <dt>Sie sind:</dt>  
                              <dd><input type="radio" name="sexus" value="M" />Mann <input type="radio" name="sexus" value="Frau" />Frau</dd>  
                              <dt>Sie m&ouml;gen:</dt>  
                              <dd><select name="Browser"><option value="Opera">Opera</option><option value="Mozilla">Mozilla</option></select></dd>  
                              <dt>Bemerkungen:</dt>  
                              <dd><textarea name="Bemerkungen" rows="3" cols="20">Bemerkungen</textarea></dd>  
                          </dl>  
                          <!-- Ende der Beispielangaben -->  
                          <p>  
                          <input type="submit" value="Senden" />  
                          <input type="reset" value="Zurücksetzen" />  
                          </p>  
                      </form>  
                
                
                  </body>  
              </html>  
              
              

              Wenn ich Deine harsche Kritik an der Programmstruktur im OP in Erinnerung rufe,

              Verwechselst Du Sven und mich?

              und Deine Behauptung, der gepostete Code sei 1:1 der im Artikel vorgeschlagene,
              dann bekommst Du von mir ein <I> für den Artikel.

              Ich gebs Dir gerne zurück, da: <I> :-)

              Freundliche Grüße

              Vinzenz

              1. Lieber Vinzenz Mai,

                die Sache mit den Magic Quotes habe ich im OP doch glatt übersehen. Sowas...

                Es ist leicht zu sehen, dass es sich - bis auf eine (im Grunde belanglose) Modifikation - um den Originalcode aus dem Artikel in dessen Originalformatierung handelt.

                Ich stimme Dir zu. Wer seine Augen auch zum sehen benutzt, hat es definitiv leichter. *blindfischblinzel*

                Die Überprüfung ist nicht besonders und die Reaktion eine Zumutung. Aber es *ist* der Code des Formmailers.

                <I> ;-P

                Wenn ich Deine harsche Kritik an der Programmstruktur im OP in Erinnerung rufe,

                Verwechselst Du Sven und mich?

                Ja. *schonwiederblindfischblinzel* Vielleicht sollte ich besser ins Bett, anstatt hier Unsinn zu posten?

                dann bekommst Du von mir ein <I> für den Artikel.

                Ich gebs Dir gerne zurück, da: <I> :-)

                Ich will nicht. Ich finde auf Anhieb nichteinmal heraus, was Sven und Du an der Prüfung schlecht finden.

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
              2. Moin!

                Das hier *ist* ganz genau dieser von Dir verlinkte einfache PHP-Formmailer.

                Jetzt nicht mehr. Ich hab die gröbsten Schrecklichkeiten mal überarbeitet.

                Ob's dadurch besser wird? Keine Ahnung. Mailen ist ein sehr anspruchsvoller Vorgang, weil das korrekte Zusammensetzen einer Mail viel Detailwissen erfordert.

                Ich persönlich würde für ernsthaftere Zwecke (also mehr als nur "mal eben schnell eine Mail rausschicken") immer eine passende Library einsetzen: http://swiftmailer.org/ wäre mein Favorit.

                Und damit machen Datei-Attachments dann auch keine Probleme mehr, weil man das gesamte Fachwissen zum korrekten Einbetten in einen Mime-Teil nicht nochmal selbst fehleranfällig selbst programmieren muss, sondern einfach $message->attach(Swift_Attachment::fromPath('/path/to/image.jpg')); einfügt.

                - Sven Rautenberg

                1. Hallo Sven,

                  Das hier *ist* ganz genau dieser von Dir verlinkte einfache PHP-Formmailer.

                  Jetzt nicht mehr. Ich hab die gröbsten Schrecklichkeiten mal überarbeitet.

                  danke für Dein Engagement.

                  Ob's dadurch besser wird? Keine Ahnung.

                  Ich hoffe es.

                  Mailen ist ein sehr anspruchsvoller Vorgang, weil das korrekte Zusammensetzen einer Mail viel Detailwissen erfordert.

                  Auf jeden Fall. Und sobald man Attachments mitschickt, geht es über einen *einfachen* Formmailer hinaus. Sobald man - aus welchen Gründen auch immer - HTML-Mails versenden will, geht dies über einen *einfachen* Formmailer hinaus.

                  Ich persönlich würde für ernsthaftere Zwecke (also mehr als nur "mal eben schnell eine Mail rausschicken") immer eine passende Library einsetzen [...]
                  Und damit machen Datei-Attachments dann auch keine Probleme mehr, weil man das gesamte Fachwissen zum korrekten Einbetten in einen Mime-Teil nicht nochmal selbst fehleranfällig selbst programmieren muss, [...]

                  da stimme ich Dir - unabhängig von der verwendeten Bibliothek - voll und ganz zu.

                  Freundliche Grüße

                  Vinzenz

  2. Das ist ein Beispiel für die deutsche Hilfsbereitschaft und Mentalität.
    Sven Rautenberg und Felix Riesterer zeigen dies exemplarisch.
    Statt einfach kurz zu helfen - lieber 'das', wenn du immer noch hilfe brauchst bei deinem Problem, dann melde dich nochmal hier; gerne kann ich deinen code überarbeiten - beginnen sie kurzer Hand Hetztiraden zu verfassen.
    Nur weil ihr über voraussichtlich durchschnittlichen Programmierkentnisse verfügt, solltet ihr nicht davon ausgehen die Könige der Welt zu sein.
    Ich hoffe euer Arzt behandelt euch gleich, wenn ihr das nächste mal ein gesundheitliches Problem habt: 'Ich hab gar keine Lust' ihnen weiter zu helfen.
    Schlimm was mit den einstigen Werten unseres Vaterlandes passiert ist.

    1. Das ist ein Beispiel für die deutsche Hilfsbereitschaft und Mentalität.

      Und deine Hilfe? Wie sieht die aus?

      1. Meine hilfe? Die habe ich ja wohl angeboten, falls 'das' das problem nicht bereits anderweitig gelöst haben sollte.
        Les meinen post nochmal und es wird dir auch auffallen.
        Lg

        1. Liebe(r) Nnnnnnnnnnnnnnnn,

          Meine hilfe? Die habe ich ja wohl angeboten, falls 'das' das problem nicht bereits anderweitig gelöst haben sollte.

          soso, mit einem "dann melde dich nochmal hier"... Warum kannst Du nicht sofort helfen sondern lässt Dich hübsch darum bitten?

          Les meinen post nochmal und es wird dir auch auffallen.

          Du bist ein Troll.

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. hi,

    <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">

    Was fehlt, ist das Atribut enctype="multipart/form-data"

    Damit schickt der Browser die Datei aus <input type="file"> ansonsten nur den Dateinamen.

    Schönen Sonntag,
    Hotti