Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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

Geschrieben
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

Geschrieben

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

Geschrieben


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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

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

  • 3 Wochen später...
Geschrieben (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 von Schandfleck

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