GeccoW Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 Hallo, ich habe folgendes Problem: Ich möchte gerne per PHP eine Mail mit Bildern verschicken. Leider haben die meisten Email-Clients ja die Sicherheit so eingestellt, dass man erstmal nur das rote X für das Bild bekommt und man dann per rechtsklick das Bild downloaden kann. Dies hat ja meist den Hintergrund, dass das Bild auf einem Webserver liegt und heruntergeladen werden muss. Ich möchte dies gerne umgehen und habe mich auch schon in einigen Foren informiert. Das Ergebnis meiner Recherche und Arbeit findet ihr hier: $CID = md5(uniqid(rand(),1)); $img = "bild.jpg"; $to = "email@email.de"; $sub = "Testnachricht"; $txt = 'Testnachricht <img src="cid:'.$CID.'">'; $Trenner = md5(uniqid(time())); $header = "From: test@test.de"; $header .= "\n"; $header .= "X-Mailer: PHP/" . phpversion(); $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"; $header .= "\n\n"; $header .= "Sie haben folgende Nachricht erhalten: \n\n"; $header .= $txt; $header .= "\nDatum/Zeit: "; $header .= date("d.m.Y H:i:s"); $header .= "\n"; $header .= "--$Trenner"; $header .= "\n"; $header .= "Content-Type: image/jpeg; name=PA2293.JPG"; $header .= filesize ($img); $header .= "\n"; $header .= "Content-ID: <$CID.$img>"; $header .= "\n"; $header .= "Content-Transfer-Encoding: base64"; $header .= "\n"; $header .= "Content-Disposition: inline; filename=PA2293.JPG"; $header .= "\n\n"; $Dateiinhalt = fread(fopen("PA2293.JPG", "r"), filesize ($img)); $header .= chunk_split(base64_encode($Dateiinhalt)); $header .= "\n"; $header .= "--$Trenner--"; mail ($to, $sub, $txt, $header); [/PHP] Das Bild wird als Anhang mit versendet, aber leider habe ich im Text immer noch das rote X und ich kann es noch nicht mal laden lassen. Wer kann mir hier weiterhelfen? Zitieren
robotto7831a Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 Hallo, versuch das ganze doch mal mit den phpMailer. Der in solchen Sachen meistens besser. Der setzt den Header so wie die Mailclients es brauchen. Frank Zitieren
GeccoW Geschrieben 16. Dezember 2008 Autor Geschrieben 16. Dezember 2008 Hallo Frank, danke für den Tipp, aber ich möchte dies gerne in einem eigenem Skript lösen, ohne vorgefertigte Skripte zu verwenden. Ich bin ja in der Hoffnung, dass es sich nur um einen kleinen fehler handelt. Gruß Gecco Zitieren
Amstelchen Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 aber ich möchte dies gerne in einem eigenem Skript lösen, ohne vorgefertigte Skripte zu verwenden. was spricht gegen: - RFC-konformität, somit: - clientkompatible mailheader - MTA-kompatible mailheader - vereinfachung beim erstellen der mails - portabilität auf unterschiedlichen systemen - die oft jahrelange erfahrung der autoren bei PHP und SMTP? s'Amstel Zitieren
flashpixx Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 Ich gebe hier mal den Hinweis auf das Pear Archiv und die Mailkomponente Phil Zitieren
GeccoW Geschrieben 16. Dezember 2008 Autor Geschrieben 16. Dezember 2008 Hallo, ich hatte ja gehofft, es könnte sich jemand meinen Code oben anschauen und ggf. gleich den Fehler erkennen. Aber scheinbar werden hier nur Verweise auf andere Seiten gegeben. Gibt es hier denn keinen Experten, der mal auf meinen Code draufschauen kann? Gruß Gecco Zitieren
robotto7831a Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 Also es hat mit dem phpMailer etwa 10 Minuten gedauert um zwei Bilder in eine HTML Mail einzufügen. Frank Zitieren
DevilDawn Geschrieben 16. Dezember 2008 Geschrieben 16. Dezember 2008 $img = "bild.jpg"; [...] $header .= "Content-Type: image/jpeg; name=PA2293.JPG"; $header .= filesize ($img); $header .= "\n"; $header .= "Content-ID: <$CID.$img>"; [...] $Dateiinhalt = fread(fopen("PA2293.JPG", "r"), filesize ($img)); $header .= chunk_split(base64_encode($Dateiinhalt)); [/PHP] Auffälligkeiten: Du nutzt "bild.jpg" für filesize, liest aber "PA2293.JPG"? Du nutzt eine Content-ID die imho nur für referenzierung in HTML Mails genutzt wird. Du erzeugst eine Zeile "Content-Type: image/jpeg; name=foobar.jpg[b]nnnnn[/b]" (nnnnn=filesize($img)) Ich glaube den sinnvoll gekürzten(!) source der Mail die rauskommt wäre für das Debugging interessanter. PS: Der OP hat bereits gesagt er möchte was lernen und nichts fertiges Benutzen, ich halte Post der Art "mit XYZ geht das total leicht" daher für unsinnig. Wenn ich mich für Fernsehtechnik interessiere will ich eben nicht hören das ich ein Gerät billiger kaufen kann als es zu bauen... Zitieren
GeccoW Geschrieben 17. Dezember 2008 Autor Geschrieben 17. Dezember 2008 Hallo, schon mal danke für Deine Unterstützung. Endlich mal jemand, der auf mein Problem eingegangen ist. Der falsche Bildname zeugt von einem Wert, den ich vergessen habe umzustellen, als ich den Post anonym machen wollte :upps Zum Them Content-ID. Vielleicht kennst Du Newsletter von MyHammer oder andere, die sofort komlett angezeigt werden, wenn Sie im Postfach aufgerufen werden. Fast alle anderen Newsletter werden ohne Bilder dargestellt und man muss diese erst vom Webserver downloaden, damit der Newsletter richtig dargestellt wird. Genau dies möchte ich erreichen. Die Mail soll komplett mit Bildern dargestellt werden ohne dass ich diese erst runterladen muss. Aus diesem Grund habe ich die Content-ID eingesetzt. Die Mail die ankommt hat einen kurzen Quellcode, ein Bild im Anhang und in der Ausgabe der Mail ein rotes "X" für das nicht angezeigte Bild Sie haben folgende Nachricht erhalten: Testnachricht <img src="cid:d2ab22e22e01de43a4827a1784ad7d85"> Datum/Zeit: 17.12.2008 09:16:23 Zitieren
DevilDawn Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 Ich meinte eigentlich die Rohmail, nicht das was im Mailprogramm zu sehen ist [...] Subject: Testmail mit Bild Content-Type: multipart/mixed; boundary="------------020801090409010700090005" This is a multi-part message in MIME format. --------------020801090409010700090005 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Testmail mit Bild, sonst nix. --------------020801090409010700090005 Content-Type: image/jpeg; name="foobar.jpg" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="foobar.jpg" /9j/4AAQSkZJRgABAQIAAAAAAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof [...] AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKdH/rE+ooopx3QnsfY1FFFI Z//Z --------------020801090409010700090005-- Zitieren
GeccoW Geschrieben 17. Dezember 2008 Autor Geschrieben 17. Dezember 2008 Das ist aber alles, was ich aus der Mail raus bekomme. Wenn ich auf Quelltext gehe, sehe ich auch nur diesen Abschnitt. Wie kann ich mir den sonst anzeigen lassen? ich habe mal die Variable $header ausgeben lassen From: test@test.de X-Mailer: PHP/5.1.6 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=2b020b02020b16e38ddfb06611afa274 This is a multi-part message in MIME format --2b020b02020b16e38ddfb06611afa274 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Sie haben folgende Nachricht erhalten: Testnachricht Datum/Zeit: 17.12.2008 12:26:05 --2b020b02020b16e38ddfb06611afa274 Content-Type: image/jpeg; name=PA2293.JPG139230 Content-ID: Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=PA2293.JPG /9j/4AAQSkZJRgABAgEASABIAAD/7RLiUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAABscAgAAAgAC HAJ4AA9ORVcgQkNIMTA0NS5USUYAOEJJTQPpAAAAAAB4AAAAAABIAEgAAAAAAvQCQP/u/+4DBgJS IAIFKAP8AAAAAAFoAWgAAAAAD30LSgFsADILSkcYAFAAAQEBAAAAAScPAAEAAQAAAAAAAAAAAAAA . . . . --2b020b02020b16e38ddfb06611afa274-- Zitieren
DevilDawn Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 Das sieht so okay aus. Zitieren
GeccoW Geschrieben 17. Dezember 2008 Autor Geschrieben 17. Dezember 2008 Aber leider habe ich das Bild nur als Anhang und im Content wird mir das rote "X" für fehlendes Bild angezeigt. Zitieren
DevilDawn Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 Sagen wir so, ich hab meine Testmail bei mir auf dem Mailserver so abgeändert das es deiner Version möglichst ähnlich sieht, und mein MUA (Thunderbird) zeigt das Bild korrekt an. Allerdings hat "meine" Mail \r\n (0x0a 0x0d) als Zeilenumbruch. Content-Type: multipart/mixed; boundary=2b020b02020b16e38ddfb06611afa274 This is a multi-part message in MIME format. --2b020b02020b16e38ddfb06611afa274 Content-Type: text/html; charset=ISO-8859-15 Content-Transfer-Encoding: 8bit Testmail mit Bild, sonst nix. Dubidu 12345:12345 --2b020b02020b16e38ddfb06611afa274 Content-Type: image/jpeg; name=foobar.jpg123 Content-ID: Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=foobar.jpg /9j/4AAQSkZJRgABAQIAAAAAAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof [...] Z//Z --2b020b02020b16e38ddfb06611afa274-- Zitieren
GeccoW Geschrieben 17. Dezember 2008 Autor Geschrieben 17. Dezember 2008 Hallo, wird das Bild denn bei Dir in der Anlage geschickt oder wird es im textbereich direkt angezeigt? Wenn ich meinen Zeilenumbruch auf \r\n umstelle, dann bekomme ich nun den ganzen Senf in der Mail angezeigt, den ich auch lese, wenn ich mir den $header ausgeben lasse. Und die Mail wird als SPAM eingestuft. Gruß Gecco Zitieren
DevilDawn Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 wird das Bild denn bei Dir in der Anlage geschickt oder wird es im textbereich direkt angezeigt? Im Textbereich, also quasi direkt in der Mail (inline halt). Wenn ich meinen Zeilenumbruch auf \r\n umstelle, dann bekomme ich nun den ganzen Senf in der Mail angezeigt, den ich auch lese, wenn ich mir den $header ausgeben lasse. Und die Mail wird als SPAM eingestuft. Es kann sein das mein cyrus die Mails lediglich so speichert aber nicht ausliefert. Dem würde ich keine Beachtung schenken, \n sollte schon passen. Zitieren
Schandfleck Geschrieben 5. Januar 2009 Geschrieben 5. Januar 2009 (bearbeitet) Dein Hauptptoblem war, daß die Content-ID nicht richtig in der E-Mail erschien. Du solltest nicht die ganze E-Mail im Header verstauen. Reine HTML-Emails sind schlechter Stiel; es sollte auch eine Textversion vorhanden seien. Beachte, daß nicht jedes E-Mail-Backend mit 8bit oder binären Daten umgehen kann. Um es sauber zu machen, müßten die Text-Teile noch als quoted-printable konvertiert werden. Da PHP dafür leider keine fertige Funktion mitliefert, war mir das zu aufwendig. Im HTML-Teil konvertiert die Funktion htmlentities() die meisten 8bit-Zeichen (nicht alle!). Wenn Du ein Unix-System mit 8bit-sicherem Mail-Backend hat, ist in der Regel die Angabe eines zusätzlichen Parameters nötig, z.B. mail($to, $subject, $message, $headers, '-B'). »man sendmail« sollte Dir die nötige Information liefern. Bei Verständnisfragen, melde Dich nochmal. Ciao, Schadfleck <?php define('EOL', "\n"); // Linux: "\n", Windows: "\r\n" $from = 'test@test.de'; $to = 'email@email.de'; $betreff = 'Testnachricht'; $dateiname = 'bild.jpg'; // keine Umlaute und Sonderzeichen! $bildbeschreibung = 'tolles Bild'; // kurzer einzeiliger Text $text = 'Sie haben folgende Nachricht erhalten:' . EOL; $text .= EOL; $text .= 'weiterer Text' . EOL; $text .= 'weiterer Text' . EOL; $text .= EOL; $text .= 'Datum/Zeit: ' . date("d.m.Y H:i:s") . EOL; $subject = '=?iso-8859-1?B?' . base64_encode($betreff) . '?='; // nötig, falls Umlaute im Betreff $cid = uniqid('att', TRUE) . '*' . $from; $boundary = uniqid('=_', TRUE); $bild = file_get_contents($dateiname); if ($bild === FALSE) die('konnte Bild ' . $dateiname . ' nicht lesen'); $headers = 'From: ' . $from . EOL; $headers .= 'X-Mailer: PHP/' . phpversion() . EOL; $headers .= 'MIME-Version: 1.0' . EOL; $headers .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '-1"'; // letzte Zeile braucht kein EOL $message = '--' . $boundary . '-1' . EOL; $message .= 'Content-Type: text/plain; charset=iso-8859-1' . EOL; $message .= 'Content-Transfer-Encoding: 8bit' . EOL; $message .= EOL; $message .= $text; $message .= $bildbeschreibung . EOL; $message .= EOL . '--' . $boundary . '-1'. EOL; $message .= 'Content-Type: multipart/related; type="text/html"; boundary="' . $boundary . '-2"' . EOL; $message .= EOL; $message .= '--' . $boundary . '-2' . EOL; $message .= 'Content-Type: text/html; charset=iso-8859-1' . EOL; $message .= 'Content-Transfer-Encoding: 8bit'. EOL; $message .= EOL; $message .= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"' . EOL; $message .= ' "http://www.w3.org/TR/html4/strict.dtd">' . EOL; $message .= '<HTML>' . EOL; $message .= '<HEAD>' . EOL; $message .= ' <TITLE>' . htmlentities($betreff) . '</TITLE>' . EOL; $message .= '</HEAD>' . EOL; $message .= '<BODY>' . EOL; $message .= ' <P>' . EOL; $message .= strtr(htmlentities($text), array("\r\n" => '<BR>' . EOL, "\n" => '<BR>' . EOL)); $message .= ' </P>' . EOL; $message .= ' <P>' . EOL; $message .= ' Bild:' . EOL; $message .= ' <IMG src="cid:' . $cid . '" alt="' . htmlentities($bildbeschreibung) . '">' . EOL; $message .= ' </P>' . EOL; $message .= '</BODY>' . EOL; $message .= '</HTML>' . EOL; $message .= EOL . '--' . $boundary . '-2' . EOL; $message .= 'Content-Type: image/jpeg; name="' . $dateiname . '"' . EOL; $message .= 'Content-ID: <' . $cid . '>' . EOL; $message .= 'Content-Transfer-Encoding: base64' . EOL; $message .= EOL; $message .= chunk_split(base64_encode($bild), 76, EOL); $message .= EOL . '--' . $boundary . '-2--'; $message .= EOL . '--' . $boundary . '-1--'; if (!mail($to, $subject, $message, $headers)) die('Fehler beim E-Mail-Versand!'); ?> [/php] Bearbeitet 5. Januar 2009 von Schandfleck 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.