Sebi80 Geschrieben 24. Oktober 2006 Geschrieben 24. Oktober 2006 Hallo. Habe für meine Homepage ein Formular einbauen wollen, mit dem es möglich ist, eine E-Mail mit Anhang zu versenden. Dazu verwende ich das Skript von: webmaster-resource.de Die E-Mail wird auch versendet aber die Anhänge werden nicht drangehängt. Ich bekomme in der Testmail zwar folgendes am Ende habe den Fehler aber noch nicht gefunden. Vielleicht kann mir da jemand helfen. $Empfaenger = "empfaenger@test.net"; $Betreff = "Feedback zu deiner Homepage"; $Dateiname1 = $HTTP_POST_VARS["datei1"]; $Dateiname2 = $HTTP_POST_VARS["datei2"]; $Dateiname3 = $HTTP_POST_VARS["datei3"]; $Dateiname1Mail = "anhang1"; $Dateiname2Mail = "anhang2"; $Dateiname3Mail = "anhang3"; $Header = "Feedback zu deiner Seite\n\n"; $Trenner = md5(uniqid(time())); $Header.= "\n"; $Header.= "MIME-Version: 1.0"; $Header.= "\n"; $Header.= "Content-Type: 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: text/html;charset=iso-8859-1"; $Header.= "\n"; $Header.= "Content-Transfer-Encoding: 8bit\n\n"; $Header.= "\n\n"; $Header.= "$Testnachricht\n\n"; $Header.="\n\n"; $Header .= "--$Trenner"; //Dateianhang 1 $Header .= "\n"; $Header .= "Content-Type: image/gif; name=$Dateiname1Mail"; $Header .= "\n"; $Header .= "Content-Transfer-Encoding: base64"; $Header .= "\n"; $Header .= "Content-Disposition: attachement; filename=$Dateiname1Mail"; $Header .= "\n\n"; $Dateiinhalt = fread(fopen($Dateiname1, "r"), filesize($Dateiname1)); $Header .= chunk_split(base64_encode($Dateiinhalt)); $Header .= "\n"; $Header .= "--$Trenner"; //Dateianhang 2 $Header .= "\n"; $Header .= "Content-Type: image/gif; name=$Dateiname2Mail"; $Header .= "\n"; $Header .= "Content-Transfer-Encoding: base64"; $Header .= "\n"; $Header .= "Content-Disposition: attachement; filename=$Dateiname2Mail"; $Header .= "\n\n"; $Dateiinhalt = fread(fopen($Dateiname2, "r"), filesize($Dateiname2)); $Header .= chunk_split(base64_encode($Dateiinhalt)); $Header .= "\n"; $Header .= "--$Trenner"; //Dateianhang 3 $Header .= "\n"; $Header .= "Content-Type: image/gif; name=$Dateiname3Mail"; $Header .= "\n"; $Header .= "Content-Transfer-Encoding: base64"; $Header .= "\n"; $Header .= "Content-Disposition: attachement; filename=$Dateiname3Mail"; $Header .= "\n\n"; $Dateiinhalt = fread(fopen($Dateiname3, "r"), filesize($Dateiname3)); $Header .= chunk_split(base64_encode($Dateiinhalt)); $Header .= "\n"; $Header .= "--$Trenner--"; //Versand E-Mail mail($Empfaenger, $Betreff, "", $Header); print "E-Mail wurde versandt"; [/PHP] Zitieren
geloescht_JesterDay Geschrieben 24. Oktober 2006 Geschrieben 24. Oktober 2006 Das Skript versendet alles als Header... der Body (mit anhängen) muss aber als Mailbody versendet werden eigentlich. Das macht theoretisch keinen Unterschied, aber je nach Mailer der hintendranhängt vielleicht schon. Das war jetzt das erste was mir aufgefallen ist. EDIT: Was wohl wichtiger ist aber: Auf welchem System läuft das bei dir? Der Zeilenumbruch ist das wichtigste überhaupt bei der Mail. Wenn der nicht passt kannste das vergessen. Auf Windows muss AFAIK \r\n genutzt werden. Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 Danke erstmal für die Antwort. Ich habe einen Fehler schon selbst gefunden denke ich. Und zwar habe ich anstelle von $Dateiname1 = $HTTP_POST_VARS["datei1"]; $Dateiname2 = $HTTP_POST_VARS["datei2"]; $Dateiname3 = $HTTP_POST_VARS["datei3"];[/PHP] nun [PHP] $Dateiname1 = $datei1; $Dateiname2 = $datei2; $Dateiname3 = $datei2; Schliesslich werden die Dateien ja im vorhergehendem Formular angegeben und nicht in der mail.php. Ich seh das doch richtig oder? Nun bekomm ich eine E-Mail die folgendermaßen aussieht: Email Text und darunter Anhänge: Content-Type: image/gif; name=anhang1 Content-Transfer-Encoding: base64 Content-Disposition: attachement; filename=anhang1 R0lGODlh0gBqAMZeAAAAAAEBAQICAgQEBAYGBgg... ..........usw usw....ikvgQAAOw== Es sind sehr viele sonderliche Zeichen, was mich irgendwie drauf schliessen lässt, dass der Anhang dranhängt aber anscheinend nicht richtig ausgelesen wird beim Empfänger. EDIT: Das ganze liegt bei Host-Europe. Nehme mal an dass dort kein Windows System ist Zitieren
geloescht_JesterDay Geschrieben 24. Oktober 2006 Geschrieben 24. Oktober 2006 Und zwar habe ich anstelle von $Dateiname1 = $HTTP_POST_VARS["datei1"]; $Dateiname2 = $HTTP_POST_VARS["datei2"]; $Dateiname3 = $HTTP_POST_VARS["datei3"];[/PHP] nun [PHP] $Dateiname1 = $datei1; $Dateiname2 = $datei2; $Dateiname3 = $datei2; Schliesslich werden die Dateien ja im vorhergehendem Formular angegeben und nicht in der mail.php. Ich seh das doch richtig oder? Keine Ahnung wo deine Dateien angegeben werden. Das musst du schon selbst wissen. $HTTP_POST_VARS ist die alte Variante von $_POST. Dann hast du ein Problem mit den Zeilenumbrüchen. Entweder passt es mit dem Head und Body nicht, oder das \n reicht nicht. Eine EMail besteht nur aus Text. Was dabei was ist, wird durch das Mail-Format bestimmt. Dieses besagt wiederum eine gewissen Trennung in Zeilen (deswegen die wichtigen Zeilenumbrüche) u.ä. Wenn dieses format nicht passt, kann der Client die Mail nicht als solche erkennen und nimmt alles als einen Body, sprich Text. Um zu prüfen wie deine Mail aussieht kannst du z.B. anstelle des Aufrufs von mail(...) einfach nur deinen Head und deinen Body ausgeben lassen. In deinen Fall ist ja alles Head. Das im Browser sieht natürlich nicht gut aus, aber die Quelltextansicht der Seite berücksichtigt dann wieder die Zeilenumbrüche. Oder du siehst dir die bei dir angekommene Mail im Quelltext an. Kenne aber keinen Mailclient der das so wirklich anbietet, von daher musst du z.B. auf die Ablage zurückgreifen (wenn der Client die als Textdatei speichert), oder auf den (deinen) Mailserver (wenn du da Zugriff hast). EDIT: Das ganze hab ich aber hier schon mehr als 1mal erklärt http://forum.fachinformatiker.de/skript-webserverprogrammierung/89797-mail-versenden-php.html http://forum.fachinformatiker.de/skript-webserverprogrammierung/87021-php-email-bild.html Sollte auch bei dir passen und da steht es ganz ausführlich, denke ich. Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 --8bd1783b8357f999f602671f1386eea5 ^^^Dies erscheint immer an der Stelle, an der ich den Trenner eingebaut habe. Ist das Ok und normal oder liegt mein Problem da begraben. Mit der Variante \r\n klappt das mit den Zeilenumbrüchen auch vernünftig. Danke schonmal. Ansonsten muss ich dass denn doch noch aufteilen mit dem Header. Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 Dank dir. Der Link ist klasse. Werds mir nach Mittag mal zur Gemüte führen Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 Erstmal Kompliment, die Erklärung ist eigentlich klasse. Nun hab ich es schon mal geschafft, dass die Email getrennt ist. Dot wo die Anhänge sein sollten ist allerdings nur folgendes: Content-Type: image/gif; name= Content-Transfer-Encoding: base64 Content-Disposition: attachement; filename= --4e7bee09b313d70a7f9938779b4037 e9 Anscheinend wurde gar nichts angehängt. Gehst du mit deinem Skript vom Versand einer auf dem Webserver liegenden Datei aus? Ich möchte die Dateien eigentlich nicht auf den Server hochladen. Werd noch etwas weiter rumtüfteln, über Tipss wär ich aber dennoch dankbar. Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 Bin inzwischen wieder so weit, dass die Dateien angehängt sind, das Problem ist aber immer noch dass es nur Hiroglyphen sind wie vorhin auch. Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 Ich hab da noch was ausgebessert und von der Grösse der E-Mail (64 KB) sollte der Anhang dabei sein. Anstelle der vielen Buchstaben ist nun aber gar nichts mehr zu sehen Verflixt noch mal Zitieren
geloescht_JesterDay Geschrieben 24. Oktober 2006 Geschrieben 24. Oktober 2006 Gib am besten mal deinen Mail-Quelltext an. Aber die angehängten Dateien selber kannst du kürzen, also die Hiroglyphen. Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 //*** Content-ID: $CID = md5(uniqid (rand(), 1)); $CID2 = md5(uniqid (rand(), 1)); $CID3 = md5(uniqid (rand(), 1)); $CID4 = md5(uniqid (rand(), 1)); // Die Content-ID brauchst du später für das Bild (jedes Bild eine eigene ID) $EOL = "\r"; $Empfaenger = 'test@gmx.net'; $Betreff= "Test"; // Diese Variable enthält einen Trenner, //der die einzelnen Inhalte im Body abgrenzt $mime_boundary = "" . md5(uniqid(mt_rand(), 1)); $Header.= "From: test.com - Mailsystem <test@gmx.net>$EOL"; $Header.= "X-Mailer: PHP/" . phpversion(). "$EOL"; $Header.= "MIME-Version: 1.0\r\n"; $Header.= "Content-Type: multipart/related; ". "boundary=\"".$mime_boundary."\"; type=\"text/html\"$EOL"; //$EOL enthält den Zeilenumbruch, der kann je nach System des Servers // unterschiedlich sein (\r\n, \r, \n) // Mail-Body $MailBody = "--".$mime_boundary."$EOL"; $MailBody.= "Content-Type: Text/HTML; charset=iso-8859-1$EOL"; $MailBody.= "Content-Transfer-Encoding: quoted-printable$EOL$EOL"; $MailBody.= "<html><head><title>Wichtige Nachricht vom Coasterbook</title></head><body>TEST<body background=\"".$CID.back."\" leftmargin=\"0\" topmargin=\"0\"><p> </p><table width=\"620\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\"><tr><td background=\"".$CID2.lay_mail1."\" valign=\"top\" height=\"115\"> </td></tr><tr><td background=\"".$CID3.lay_mail2."\" valign=\"top\"><br><table width=\"580\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\"><tr><td>".nl2br($_POST['msg'])."</td></tr></table><p> </p></td></tr><tr><td background=\"".$CID4.lay_mail3."\" valign=\"top\" height=\"52\"> </td></tr></table></body></html>"; $MailBody.= "$EOL$EOL"; $MailBody.= "--".$mime_boundary."$EOL"; //Dateianhang 1 $MailBody .= "$EOL"; $MailBody .= "Content-Type: image/gif; name=$datei1"; $MailBody .= "$EOL"; $MailBody .= "Content-Transfer-Encoding: base64"; $MailBody .= "$EOL"; $MailBody .= "Content-Disposition: attachement; filename=$datei1"; $MailBody .= "$EOL"; $Dateiinhalt = fread(fopen($datei1, "rb"), filesize($datei1)); $MailBody .= chunk_split(base64_encode($Dateiinhalt)); $MailBody .= "$EOL"; $MailBody .= "--".$mime_boundary."$EOL"; //Dateianhang 2 $MailBody .= "$EOL"; $MailBody .= "Content-Type: image/gif; name=$datei2"; $MailBody .= "$EOL"; $MailBody .= "Content-Transfer-Encoding: base64"; $MailBody .= "$EOL"; $MailBody .= "Content-Disposition: attachement; filename=$datei2"; $MailBody .= "$EOL"; $Dateiinhalt = fread(fopen($datei2, "rb"), filesize($datei2)); $MailBody .= chunk_split(base64_encode($Dateiinhalt)); $MailBody .= "$EOL"; $MailBody .= "--".$mime_boundary."$EOL"; //Dateianhang 3 $MailBody .= "$EOL"; $MailBody .= "Content-Type: image/gif; name=$datei3"; $MailBody .= "$EOL"; $MailBody .= "Content-Transfer-Encoding: base64"; $MailBody .= "$EOL"; $MailBody .= "Content-Disposition: attachement; filename=$datei3"; $MailBody .= "$EOL"; $Dateiinhalt = fread(fopen($datei3, "rb"), filesize($datei3)); $MailBody .= chunk_split(base64_encode($Dateiinhalt)); $MailBody .= "$EOL"; //Versand E-Mail $MailBody.= "--".$mime_boundary."--$EOL"; mail($Empfaenger, $Betreff, $MailBody, $Header); print "E-Mail wurde versandt"; session_destroy(); ?>[/PHP] Habs jetzt mal nach deinem Muster gemacht, also nicht alles Header und dann mit der Variable für den Zeilenumbruch. Zitieren
Sebi80 Geschrieben 24. Oktober 2006 Autor Geschrieben 24. Oktober 2006 Mailtext: TEST Dateien sind auch angehängt, aber der Inhalt der Dateien besteht nach wie vor aus Text und nicht als Bild. Anhang: Content-Type: image/gif; name=/tmp/phpStkBfo Content-Transfer-Encoding: base64 Content-Disposition: attachement; filename=/tmp/phpStkBfo R0lGODlhxABQAOZbAAFOjwFNj6K+1gFOjgFNjgJOjyFknZy60w.......... Zitieren
geloescht_JesterDay Geschrieben 25. Oktober 2006 Geschrieben 25. Oktober 2006 Ich meinte den Mail Quelltext. Nicht den PHP-Quelltext, der die Mail erzeugt. Also anstelle von mail($emfaenger, $subject, $body, $header); [/php] ein [php] echo $header.$body; EDIT: Und dann nicht die HTML Ausgabe (weil HTML keine Zeilenumbrüche anzeigt)! BTW: sicher dass \r richtig ist? Unter Linux kenn ich \n und unter Windows \r\n. Hab zwar irgendwo geschrieben, dass es auch \r sein könnte, aber ein reiner CarriageReturn langt glaube ich nicht. Zumindest nicht bei Linux/Windows. Eine Mail ist eigentlich ganz einfach, wenn die Formatierung stimmt. Es geht also weniger darum, die Anweisungen zu PHP-Code einfach umzusetzen, als vielmehr darum zu verstehen wie eine Mail aussehen muss um korrekt interpretiert zu werden. Und das steht ja in den ganzen Texten auch drin. Zitieren
Sebi80 Geschrieben 25. Oktober 2006 Autor Geschrieben 25. Oktober 2006 Dann bekomm ich das: From: test.com - Mailsystem X-Mailer: PHP/4.3.2 MIME-Version: 1.0 Content-Type: multipart/related; boundary="e782ad9f79ea696c1a7c4e4e0e42c118"; type="text/html" --e782ad9f79ea696c1a7c4e4e0e42c118 Content-Type: Text/HTML; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable TEST --e782ad9f79ea696c1a7c4e4e0e42c118 Content-Type: image/gif; name=/tmp/phpW7KZax Content-Transfer-Encoding: base64 Content-Disposition: attachement; filename=/tmp/phpW7KZax R0lGODlh0gBqAMZeAAAAAAEBAQICAgQEBAYGBggICAsLCwwMDA0NDQ8PDxAQEBISEhQUFBUVFRYW FhgYGBkZGRsbGyAgICUlJScnJykpKSwsLC0tLTAwMDMzMzQ0NDY2Njc3Nzk5OT09PUBAQERERE9P..... ....usw. usw. Zitieren
Sebi80 Geschrieben 25. Oktober 2006 Autor Geschrieben 25. Oktober 2006 From: test.com - Mailsystem <test@gmx.net> X-Mailer: PHP/4.3.2 MIME-Version: 1.0 Content-Type: multipart/related; boundary="e2d7a096e7e3f84c2501f300e21fcce7"; type="text/html" --e2d7a096e7e3f84c2501f300e21fcce7 Content-Type: Text/HTML; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable <html><head><title>TEST</title></head><body>TEST</body></html> --e2d7a096e7e3f84c2501f300e21fcce7 Content-Type: image/gif; name= Content-Transfer-Encoding: base64 Content-Disposition: attachement; filename=$ --e2d7a096e7e3f84c2501f300e21fcce7 Content-Type: image/gif; name=/tmp/phpe59TUj Content-Transfer-Encoding: base64 Content-Disposition: attachement; filename=/tmp/phpe59TUj R0lGODlh0gBqAMZeAAAAAAEBAQICAgQEBAYGBggICAsLCwwMDA0NDQ8PDxAQEBISEhQUFBUVFRYW FhgYGBkZGRsbGyAgICUlJScnJykpKSwsLC0tLTAwMDMzMzQ0NDY2Njc3Nzk5OT09PUBAQERERE9P [/PHP] Meinst du sowas hier??? Zitieren
Sebi80 Geschrieben 25. Oktober 2006 Autor Geschrieben 25. Oktober 2006 OK. Vielen Dank noch mal für deinen Hinweis mit dem Format. Lag tatsächlich daran. Hatte da noch ein "\r\n" vergessen Danke für deine Geduld Zitieren
geloescht_JesterDay Geschrieben 25. Oktober 2006 Geschrieben 25. Oktober 2006 Auf den ersten Blick fehlt das Mailende: --e2d7a096e7e3f84c2501f300e21fcce7-- am Mailende eben Zitieren
Sebi80 Geschrieben 25. Oktober 2006 Autor Geschrieben 25. Oktober 2006 Jetz hab ich noch so mal eine Frage zu HTML-Mails. Muss man dabei irgendwas beachten zwecks der Formatierung? Ich habe nämlich einen Text genommen der z.B. unter Frontpage oder so als HTML-Code ganz normal angezeigt wird, aber in der Mail stimmt die Formatierung der Tables nicht mehr Zur Not positionier ich das auch mit CSS, wenn das in einer HTML Mail denn auch geht !?!? Zitieren
geloescht_JesterDay Geschrieben 26. Oktober 2006 Geschrieben 26. Oktober 2006 Zur Not positionier ich das auch mit CSS, wenn das in einer HTML Mail denn auch geht !?!? Die Mail ist Text, und Text ist geduldig Auch HTML ist nur Text. Was dann angezeigt wird bestimmt derjenige, der das HTML interpretiert und ausgibt, also der Client, Mailclient in deinem Fall. In der Mail muss nur steht, dass der Teil den Inhaltstyp (Content-Type) text/HTML hat. Dann interpretiert der MailClient diesen Inhalt als HTML. Wenn du dort Bilder angeben willst, dann muss das mit der content id gemacht werden. Gleiches gilt wohl für externe css u.ä. In deinem Fall würd ich eher sagen, du hast ein MS Problem Sprich Frontpage macht Mist und kann den Mist natürlich auch "korrekt" anzeigen. Andere HTMLClients tun das aber anders. EDIT: Ich will damit sagen, der Mail ist es egal was du da drin stehen hast, weil die Mail nichts interpretiert oder sonst was tut. Mail ist nur Text Den teilst du richtig auf, gibst den Teilen den richtigen Typ und der rest wird vom Client gemacht. Zitieren
Sebi80 Geschrieben 26. Oktober 2006 Autor Geschrieben 26. Oktober 2006 Danke erstmal. Du hast wohl mal wieder Recht. Die gleiche Mail an meinen gmx Account verschickt wird korrekt angezeigt. Anscheinend liegt das an Outlook. Mal sehen. Zitieren
Sebi80 Geschrieben 26. Oktober 2006 Autor Geschrieben 26. Oktober 2006 Es liegt anscheinend daran, dass der Header Content Type: multipart/related hat, wenn ich den dort in text/html änder wird es korrekt angezeigt aber die Struktur der E-Mail wieder zerstört, was sich auf die Anhänge auswirkt. Zitieren
Sebi80 Geschrieben 26. Oktober 2006 Autor Geschrieben 26. Oktober 2006 Wenn ich den Content Type auf multipart/mixed umstelle habe ich wieder keine HTML-Mail. Hat dafür jemand eine Lösung? Danke Zitieren
geloescht_JesterDay Geschrieben 26. Oktober 2006 Geschrieben 26. Oktober 2006 multipart bezieht sich darauf, dass der Inhalt aus mehreren Parts besteht. Ansich hat eine Mail einen Part, dessen Content-Type du im Header angibst. Mit Multipart sagst du, dass es mehrere Teile sind, von denen jeder wiederum einen eigenen Header mit Content-Type hat. Mehr zu Multipart findest du hier: http://www.freesoft.org/CIE/RFC/1521/15.htm und zu multipart/related dann noch http://www.faqs.org/rfcs/rfc2387.html Zitieren
Sebi80 Geschrieben 26. Oktober 2006 Autor Geschrieben 26. Oktober 2006 Ich denke das hab ich verstanden. D.h. Ich hab oben im Header stehen $Header. ="Content-Type: multipart/mixed (oder related);". und dann im Mailbody: $MailBody.= "Content-Type: text/html; charset=iso-8859-1$EOL"; So ist das denn doch eigentlich der "Header" für den Mailbody oder seh ich da was falsch? Zitieren
geloescht_JesterDay Geschrieben 26. Oktober 2006 Geschrieben 26. Oktober 2006 So ist das denn doch eigentlich der "Header" für den Mailbody... Ja, und genauso war das ja in den verlinkten Beiträgen auch erklärt (denke ich zumindest). EDIT: Ach ja, wenn du eine reine HTML Mail haben willst, brauchst du keinen Multipart. Dann reicht der Content-Type text/html schon im eigentlichen Header. Multipart brauchst du nur dann, wenn du mehr als einen Teil in der Mail hast. EDIT2: Zu mehreren Teilen zählt aber auch eine reine HTML Mail mit Bild im HTML-Teil, eil das Bild ja dann auch mit der Mail, als extra Part, mitgeschickt werden soll. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.