Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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]

Geschrieben

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.

Geschrieben

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 ;)

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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 :D

Geschrieben


//*** 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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben


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???

Geschrieben

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 !?!?

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

Geschrieben

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?

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...