Frage zu email mit eingebettetem Bild!!
Jörg
- php
0 Tom1
Der Martin
Halli Hallo,
ich habe eine Routine, die an eine bestimmte email-adresse eine Grafik im MIME Format verschickt. Das ganze klappt auch wunderbar. Nur eins wundert mich: Wenn ich die empfangene email aufrufe und das Bild speichern will, erscheint beim Tunderbird als Speichername: "bild.gif" Beim Internet Explorer hingegen: "!cid_bild"
Woran liegt das bzw. wie kann ich das Programm so ändern, das hier auch "bild.gif" angezeigt wird? Hier der Quellcode:
<?php
$Betreff="Test";
$email="joerg.nieswand@arcor.de";
$Dateiname="foto.gif";
$DateinameMail = "bild.gif";
$Header = "From: mir";
$Trenner = md5(uniqid(time()));
$Header .= "\r\n";
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= 'Content-Type: multipart/related; boundary="part"';
$Header .= "\r\n";
$Header .= "\r\n";
$Header .= "This is a multi-part message in MIME format";
$Header .= "\r\n";
$Header .= "--part";
$Header .= "\n";
$Header .= "Content-Type: text/html; charset=us-ascii";
$Header .= "\r\n";
$Header .= "Content-Transfer-Encoding: 7bit";
$Header .= "\r\n";
$Header .='<html><head><meta http-equiv="Content-Language" content="de">';
$Header .= '<img src="cid:bild">';
$Header .= '</body></html>';
$Header .= "\n";
$Header .= "--part";
$Header .= "\r\n";
$Header .= "Content-Type: image/gif; name=$DateinameMail";
$Header .= "\r\n";
$Header .= "Content-Transfer-Encoding: base64";
$Header .= "\r\n";
$Header .= "Content-ID: <bild>";
$Header .= "\r\n";
$Dateiinhalt = fread(fopen($Dateiname, "r"), filesize($Dateiname));
$Header .= chunk_split(base64_encode($Dateiinhalt));
$Header .= "\r\n";
$Header .= "--part--";
mail($email, $Betreff, "", $Header);
?>
Hello,
Woran liegt das bzw. wie kann ich das Programm so ändern, das hier auch "bild.gif" angezeigt wird? Hier der Quellcode:
Für die Übersichtlichkeit in deinem "Programm" würdest Du bei mir eine "Fünf bis Sechs" bekommen. ;-)
Die Semantik von "Header" könntest Du ruhig etwas besser beachten. Eine MIME-Mail hat zwar Header, aber auch einen Body, der sogar aus mehreren Teilen bestehen kann.
Tipp zu Deiner Frage:
Nimm Deinen Outlook Express Client und erzeuge Dir eine eMail mit eingebettetem Bild. Nimm ein kleines Bild, damit Dein Papierverbrauch nicht so groß wird...
Und dann schau Dir im Quellcode an, wie dieser Client das macht mit dem Filename.
Mit dem anderen Client machst Du es genauso.
Außerdem kannst Du auch noch in die RFCs schauen, wie es eigentlich sein sollte.http://www.mhonarc.org/~ehood/MIME/
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom

Hallo Jörg,
ich habe eine Routine, die an eine bestimmte email-adresse eine Grafik im MIME Format verschickt.
so wie dein Code aussieht, möchtest du nicht nur einfach eine Grafik verschicken, sondern eine HTML-Mail mit eingebetteter Grafik.
Das ganze klappt auch wunderbar. Nur eins wundert mich: Wenn ich die empfangene email aufrufe und das Bild speichern will, erscheint beim Tunderbird als Speichername: "bild.gif" Beim Internet Explorer hingegen: "!cid_bild"
Mit "Internet Explorer" meinst du hier sicher Outlook oder Outlook Express, denn der IE ist ja kein Mailclient.
Woran liegt das bzw. wie kann ich das Programm so ändern, das hier auch "bild.gif" angezeigt wird? Hier der Quellcode:
Schau'mer mal.
Etwas allgemeines vorweg: An einigen Zeilen fehlt das \r für den korrekten Zeilenumbruch, du hast stellenweise nur \n alleine stehen.
$Header = "From: mir";
Ich nehme an, das soll nur ein Platzhalter sein, und da steht im fertigen Script eine gültige Mailadresse?
$Trenner = md5(uniqid(time()));
Schön, dass du einen Zufallswert für die Trennstellen ermittelst. Warum benutzt du ihn dann nicht? ;-)
$Header .= "\r\n";
Aus kosmetischen Gründen würde ich den Zeilenumbruch \r\n gleich hinter den eigentlichen Zeileninhalt schreiben, anstatt als separaten Teil anhängen. Ändert zwar nichts am Ergebnis, liest sich aber angenehmer, übersichtlicher.
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= 'Content-Type: multipart/related; boundary="part"';
$Header .= "\r\n";
$Header .= "\r\n";
Schluss. Hier ist der Header eigentlich zu Ende. Die beiden Zeilenumbrüche würden dann auch entfallen (die ergänzt PHP dann automatisch, wenn Header und Body zusammengefügt werden). Alles, was jetzt folgt, gehört eigentlich zum Mail-Body, nicht zum Header. Warum wird das eigentlich immer wieder so schlampig gelöst? Sieht man oft.
Klar, es funktioniert, weil beim Versand der erzeugten Mailnachricht sowieso Header und Body aneinandergehängt werden, aber es ist einfach unsauber.
$Header .='<html><head><meta http-equiv="Content-Language" content="de">';
$Header .= '<img src="cid:bild">';
Irgendwie scheint hier einiges zu fehlen. Nein, ich meine nicht das alt-Attribut für das img-Element. Ich vermisse nur die Stelle, wo head aufhört und body beginnt.
$Header .= "--part";
$Header .= "\r\n";
$Header .= "Content-Type: image/gif; name=$DateinameMail";
$Header .= "\r\n";
$Header .= "Content-Transfer-Encoding: base64";
$Header .= "\r\n";
$Header .= "Content-ID: <bild>";
$Header .= "\r\n";
Dieser Abschnitt ist zwar nicht falsch - aber eingebundene Bilder, die nur vom HTML-Teil referenziert werden, bekommen üblicherweise keine Angabe für den Dateinamen. Selbst wenn er vorhanden ist, ignoriert Outlook Express diesen Namen. "Des isch halt so."
Du könntest versuchen, stattdessen die Zeile
Content-Disposition: inline; filename="bild.jpg"
zu ergänzen, vielleicht beachtet OE den da angegebenen Dateinamen.
$Dateiinhalt = fread(fopen($Dateiname, "r"), filesize($Dateiname));
Achtung: Das funktioniert nur bei kleinen Dateien! Denn fread() liest nicht zwangsläufig die gesamte Datei in einem Durchgang, sondern erfahrungsgemäß nur maximal 8kB (scheint konfigurationsabhängig zu sein, auf manchen Systemen sind es gar nur 4kB pro Aufruf). Für größere Dateien muss man fread() in einer Schleife mehrmals aufrufen und zwischendurch mit feof() testen, ob schon das Dateiende erreicht ist.
Außerdem hast du noch eine kleine Schweinerei eingebaut, indem du den Rückgabewert von fopen(), das File-Handle ignorierst. So hast du keine Chance, die Datei ordnungsgemäß zu schließen, was du auch geflissentlich bleiben lässt. ;-)
So, nun alle Klarheiten beseitigt?
Schönen Sonntag noch,
Martin