Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Php Script um eine Datei anzuhängen

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
ProfiSchnell
PostRank 1
PostRank 1
Beiträge: 16
Registriert: 15.07.2009, 09:22
Wohnort: Hamburg

Beitrag von ProfiSchnell » 15.07.2009, 09:27

Hallo erstmal,

ich habe da eine Frage ich benötige ein Formular bzw. Script um eine oder mehrere Dateien an unser Formular anzubinden das Formular wurde mit PHP erstellt.

Es funktioniert relativ simpel jemand gibt seine Daten ein und das Formular versendet die E-Mail mit den Daten per "mailto" - nun benötige ich ein Script um eine Datei an die Mail anzuhängen (es wird sich bei diesen Dateien meistens um eine Word / Excel oder PDF handeln) - kann mir da jemand helfen?

Vielen Dank schon mal.

Ralf

Anzeige von ABAKUS

von Anzeige von ABAKUS »

Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

Nullpointer
PostRank 10
PostRank 10
Beiträge: 4790
Registriert: 22.04.2005, 19:14
Wohnort: West Berlin

Beitrag von Nullpointer » 15.07.2009, 09:44

wenn eine datei ausreicht:
https://de.selfhtml.org/html/formulare/datei_upload.htm

bei mehreren dateien ist die frage, ob du schon etwas wie jquery verwendest
( https://www.blogwave.de/jquery-multiple ... orial.html )
oder selbst etwas stricken wills.t

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 15.07.2009, 09:55

Ich denke, er hat weniger ein Formularproblem, denn ein Mailproblem.

Mehrteilige E-Mails sind gemäß MIME-Standard aufgebaut, festgelegt in RFC 2045 ff. Für PHP gibt es (mindestens) eine Erweiterung namens Mail_Mime, bei der du anscheinend recht simpel über den Aufruf von ::addAttachment() Dateien anhängen kannst. Sicherlich gibt's auch noch weitere Skripte, such' einfach mal nach MIME und PHP.

Der Aufbau einer MIME-konformen Mail ist allerdings auch nicht so dramatisch, mit fortgeschrittenen PHP-Kenntnissen lässt sich das auch selbst implementieren. Wenn du dir eine Mail mit Anhang schickst und dann den Quelltext davon anschaust, hast du ein gutes Beispiel für die Struktur, alles weitere steht in besagter RFC.

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Michael1967
PostRank 9
PostRank 9
Beiträge: 2158
Registriert: 26.10.2005, 23:51

Beitrag von Michael1967 » 15.07.2009, 09:57

Könnte man so machen - musst du aber noch anpassen, gg

Code: Alles auswählen

$Empfaenger = "deine@email.de";
 
if($_REQUEST['Send'])
{
    if(empty($_REQUEST['Name']) || empty($_REQUEST['Straße']) || empty($_REQUEST['Ort']) || empty($_REQUEST['agb']) || empty($_REQUEST['Email']))
    {


        echo"<p><strong>Fehler!</strong> Bitte gehen Sie <a href=\"javascript&#58;history.back&#40;&#41;;\"><strong>zurück</strong></a> und füllen Sie alle Felder aus!</p>";
    
&#125;
    else
    &#123;
        $Mailbetreff = "Der Betreff&#58; ";
        $Mailbetreff .= $_REQUEST&#91;'Betreff'&#93;;
 
        $Trenner = md5&#40;uniqid&#40;time&#40;&#41;&#41;&#41;;
 
        $Header = "From&#58; ".$_REQUEST&#91;'Email'&#93;; 
        $Header .= "\n"; 
        $Header .= "MIME-Version&#58; 1.0"; 
        $Header .= "\n"; 
        $Header .= "Content-Type&#58; multipart/mixed; boundary=$Trenner"; 
        $Header .= "\n\n"; 
        $Header .= "This is a multi-part message in MIME format"; 
        $Header .= "\n"; 
        $Header .= "--$Trenner"; 
        $Header .= "\n"; 
        $Header .= "Content-Type&#58; text/plain"; 
        $Header .= "\n"; 
        $Header .= "Content-Transfer-Encoding&#58; 8bit"; 
        $Header .= "\n\n"; 
        $Header .= "Sie haben folgende Nachricht erhalten&#58;";
 
       foreach&#40;$_REQUEST as $Formularfeld => $Wert&#41;
&#123;
if&#40;$Formularfeld != "Send" && $Formularfeld != "Anhang"&#41;
&#123;
$Header .= $Formularfeld."&#58; ".$Wert."\n";
&#125;
&#125;
 
        $Header .= "\nDatum/Zeit&#58; ";
        $Header .= date&#40;"d.m.Y H&#58;i&#58;s"&#41;;
        $Header .= "\n"; 
        $Header .= "--$Trenner"; 
        $Header .= "\n"; 
        $Header .= "Content-Type&#58; ";
        $Header .= $_FILES&#91;'Anhang'&#93;&#91;'type'&#93;;
        $Header .= "; name=";
        $Header .= $_FILES&#91;'Anhang'&#93;&#91;'name'&#93;; 
        $Header .= "\n"; 
        $Header .= "Content-Transfer-Encoding&#58; base64"; 
        $Header .= "\n"; 
        $Header .= "Content-Disposition&#58; attachment; filename=";
        $Header .= $_FILES&#91;'Anhang'&#93;&#91;'name'&#93;; 
        $Header .= "\n\n"; 
        $Dateiinhalt = fread&#40;fopen&#40;$_FILES&#91;'Anhang'&#93;&#91;'tmp_name'&#93;, "r"&#41;, $_FILES&#91;'Anhang'&#93;&#91;'size'&#93;&#41;;
        $Header .= chunk_split&#40;base64_encode&#40;$Dateiinhalt&#41;&#41;;
        $Header .= "\n"; 
        $Header .= "--$Trenner--"; 
 
       mail&#40;$Empfaenger, $Mailbetreff, "", $Header&#41;;

        echo"<p>Vielen Dank für Ihre eMail! <br /><br /><a href=\"index.html\">Zurück zur Hauptseite</a><p>";
  
&#125;
&#125;

Code: Alles auswählen

 echo" <h2>Titel</h2> 
<p>Text</p>

<fieldset><br /><legend>.....</legend>
<form action="datei.html" enctype="multipart/form-data" method="post">
 
<label>Name&#58;</label>
  <input name="Name" size="20" type="text"  class="field" /><br />
 
<label>eMail&#58;</label>
  <input name="Email" size="20" type="text"  class="field" /><br />

<label>Straße&#58;</label>
  <input name="Straße" size="20" type="text"  class="field" /><br />

<label>PLZ/Ort&#58;</label>
  <input name="Ort" size="20" type="text"  class="field" /><br />

<label>Kategorie&#58;</label>
  <select name="Betreff" size="1" class="field"><br /><br />

<label>Ihr Dokument&#58;</label>
  <input name="Anhang" size="20" type="file" class="anhang" />
 <input type="checkbox" name="agb" value="agb" />

<input name="Send" type="submit" value="Abschicken" class="submit" />    
<input name="Reset" type="reset" value="Löschen" class="submit" />

</form></fieldset>

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 15.07.2009, 10:08

Michael1967 hat geschrieben:

Code: Alles auswählen

$Mailbetreff .= $_REQUEST&#91;'Betreff'&#93;;
$Header = "From&#58; ".$_REQUEST&#91;'Email'&#93;; 
mail&#40;$Empfaenger, $Mailbetreff, "", $Header&#41;;
Das ist ein offenes Tor für Spammer, man muss lediglich im Formularfeld 'Email' einen Zeilenumbruch, gefolgt von einer BCC:-Zeile mit den Spamempfängern übermitteln. Im Feld 'Betreff' gilt IIRC zumindest für ältere PHP-Versionen das Gleiche.

Von außen kommende Daten niemals ungeprüft und ungesichert übernehmen!

Die Nachricht bei den Kopfzeilen zu übermitteln anstatt im vorgesehenen mail()-Parameter, halte ich davon unabhängig auch nicht für besonders stilsicher.
Zuletzt geändert von Mork vom Ork am 15.07.2009, 10:09, insgesamt 1-mal geändert.

Michael1967
PostRank 9
PostRank 9
Beiträge: 2158
Registriert: 26.10.2005, 23:51

Beitrag von Michael1967 » 15.07.2009, 10:09

Jo, hatte ja gesagt - das mussst du noch anpassen! Sollte nur als Beispiel dienen.

Man könnte voher ja prüfen -

Code: Alles auswählen

$absender = preg_replace&#40; "/&#91;^a-z0-9 !?&#58;;,.\/_\-=+@#$&\*\&#40;\&#41;&#93;/im", "",  $meineemail &#41;;
$absender = preg_replace&#40; "/&#40;content-type&#58;|bcc&#58;|cc&#58;|to&#58;|from&#58;&#41;/im", "", $absender &#41;;
oder so, gg

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 15.07.2009, 10:13

Michael1967 hat geschrieben:Jo, hatte ja gesagt
Nein, du hattest mit einem Kichern gesagt, dass er das anpassen soll. Von einem gravierenden Sicherheitsproblem war nicht die Rede und darauf täte ich auch nicht kichernd hinweisen.

Michael1967
PostRank 9
PostRank 9
Beiträge: 2158
Registriert: 26.10.2005, 23:51

Beitrag von Michael1967 » 15.07.2009, 10:19

Naja, kichern deswegen, weil ich doch kein Sicherheitsexperte bin. Ich habe nicht gesagt - er soll das so benutzen, sondern nur - man könnte das so machen - muss aber noch angepasst werden.

Und warum darf man hier nicht kichern? Nene! Das lass ich mir nicht nehmen.

moooki
PostRank 2
PostRank 2
Beiträge: 37
Registriert: 13.11.2007, 11:59

Beitrag von moooki » 15.07.2009, 10:23

google mal nach "phpmailer" - das ist eine super mailer klasse... kannst alles mit machen, auch dateien anhängen!

ProfiSchnell
PostRank 1
PostRank 1
Beiträge: 16
Registriert: 15.07.2009, 09:22
Wohnort: Hamburg

Beitrag von ProfiSchnell » 15.07.2009, 12:03

Kann mir jemand sagen warum das Script von Selfhtml nicht funktioniert - die Mail kommt an aber ohne Anhang.

Vielen Dank.

Ralf

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 15.07.2009, 15:27

ProfiSchnell hat geschrieben:Kann mir jemand sagen warum das Script von Selfhtml nicht funktioniert - die Mail kommt an aber ohne Anhang.
Welches Skript? Auf der von Nullpointer genannten Seite gibt's keines und jenes Perl-Skript, das man über diese Seite erreichen kann, verschickt keine Mails.

ProfiSchnell
PostRank 1
PostRank 1
Beiträge: 16
Registriert: 15.07.2009, 09:22
Wohnort: Hamburg

Beitrag von ProfiSchnell » 15.07.2009, 16:18

So danke erstmal für die Antworten

mein PHP Script sieht wie folgt aus:

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>

Mein Html Code wie folgt:

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br/>
<input type="submit" name="submit" value="Submit" />

Also er sagt mir nun in der neu geöffneten Seite...

Upload: AcroRdIF.dll
Type: application/octet-stream
Size: 105.609375 Kb
Stored in: /tmp/phpvxKmaa

Aber wo ist es bitte gespeichert "/tmp/phpvxKmaa" gibt es nicht ... es sollte eigentlich im "Upload" (der steht auf 777) Ordner sein aber ist es leider auch nicht.

Könntet ihr mir da helfen?

Eigentlich wollte ich, dass der Server die Datei mit der Mail weiterleitet...kann mir da jemand helfen?

Vielen Dank.

Ralf

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 16.07.2009, 09:50

ProfiSchnell hat geschrieben:Upload: AcroRdIF.dll
Type: application/octet-stream
Size: 105.609375 Kb
Stored in: /tmp/phpvxKmaa
Das kann insofern nicht angehen, als dass du nicht den Text &#8222;Stored in:&#8220; ausgibst, sondern &#8222;Stored in: upload/&#8220;:
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
n.b.: Der &#8222;upload/&#8220;-Teil ist ein normaler, fest einprogrammierter Text, der muss in der Ausgabe erscheinen, egal, was in $_FILES passiert oder auch nicht.

Weiterhin dürfte (fast) überhaupt keine Ausgabe stattfinden, denn weder steht in $_FILES["file"]["type"] der richtige Typ, noch ist $_FILES["file"]["size"] kleiner als 20.000. Solange das nicht passt, macht das Skript, das du hier zitiert hast, nichts bis auf &#8222;Invalid File&#8220; auszuspucken.

Du solltest erstmal den richtigen Ablauf klären.

&#8222;/tmp/phpvxKmaa&#8220; dürfte weiter vorne herstammen, dort wo du &#8222;Temp file:&#8220; ausgibst. Dass du diese temporäre Datei in /tmp nicht findest, ist kein Wunder, denn erstens verschiebst du sie vor der &#8222;Stored in upload/&#8220;-Ausgabe mit move_uploaded_file(), und zweitens werden temporäre Dateien am Ende des Skriptes von PHP gelöscht. Kurz: Aus /tmp verschwunden ist sie in jedem Fall.

Hast dir in diesen beiden Punkten Klarheit verschafft, solltest du daran gehen, den Rückgabewert von move_uploaded_file() nicht einfach zu ignorieren, sondern auszuwerten. Die Funktion gibt im Fehlerfall false zurück.

Dann hast du IMHO ein Problem mit $_FILES[]["name"], ich kann in der PHP-Anleitung gerade keine Aussage darüber finden, was da genau drinsteht. Falls du nicht schlauer bist, solltest du tunlichst verhindern, dass jemand als Dateiname einen kompletten Pfad übermittelt und du unwissentlich die Datei statt in upload/bla in ein beliebiges anderes Verzeichnis schiebst.
Benutze $_FILES[]["name"] nur mit der Funktion basename()!

Und last but not least ist die Angabe in $_FILES[]["type"] definitiv mit Vorsicht zu genießen; sie stammt direkt vom Browser und auch dort kann dir von pösen Puben&#8482; alles mögliche zugeschickt werden bzw. genauer: es kann jede beliebige Datei mit dem Aufkleber image/jpeg übermittelt und dir untergejubelt werden. Dass image/jpeg draufsteht, ist keine Sicherheit, dass auch JPEG drin ist.
Prüfe den Inhalt der Datei selbst mittels mime_content_type() oder, so vorhanden, finfo_file().
Eigentlich wollte ich, dass der Server die Datei mit der Mail weiterleitet...kann mir da jemand helfen?
Dann solltest du dich allerdings nicht mit move_uploaded_file() aufhalten (mit dem Rest schon). Wie man Dateien per mail() verschickt, wurde hier schon ein paar Mal genannt.

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag