PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   imap: mail mit bild - anzeigefehler!!! (http://www.selfphp.de/forum/showthread.php?t=22292)

muhlba91 23.10.2009 18:00:33

imap: mail mit bild - anzeigefehler!!!
 
Hallo!

Ich habe ein kleines Problem mit meinem Mail-Skript. Hoffe ihr könnt mir helfen!!

Zum Grundverständnis: ich habe ein Mail, das als TEXT/HTML gesendet wurde.
Abholung per IMAP und Ausgabe funktioniert wunderbar, nur ist jetzt mein Problem, dass ich ein HTML-Mail habe, in dem ein Bild eingebettet wurde (zum Beispiel ein Smiley oder so...).
Und wenn ich nun mit denselben Befehlen meinen Mailbody ausgebe, bekomme ich eine elendslange "Wurst" aus Zeichen (also eine base64-Kodierung, wie normal -> dies schreibt er sogar bei der Ausgabe hin!!!). Der Rest der Mail (also der HTML-Teil) wird fast wunderbar angezeigt (es wird nur ein kurzer Header eingeblendet, der auch stört!).

Hat irgendjemand eine Idee wie ich meine Mail mit dem eingebetteten Bild fehlerfrei ausgeben kann???

Ich wäre über jede Idee wirklich sehr dankbar!!!

LG Daniel

rarios 24.10.2009 02:06:07

AW: imap: mail mit bild - anzeigefehler!!!
 
bas64-Kodierung -> base64-Dekodierung

http://de.php.net/manual/de/function.imap-base64.php
http://de.php.net/manual/de/function.base64-decode.php

muhlba91 24.10.2009 12:11:31

AW: imap: mail mit bild - anzeigefehler!!!
 
danke, aber ich kann nicht die ganze Nachricht dekodieren, da der Text sonst unleserlich ist!
Message Quelltext: http://www.auhof.eduhi.at/~muhlba91/mail.txt
Hoffe mein Problem wird dadurch klarer...

muhlba91 24.10.2009 14:39:48

AW: imap: mail mit bild - anzeigefehler!!!
 
habe nun endlich ich den ganz normalen Text meiner Mail herausbekommen.
Nur wie kann ich jetzt das eingebettete Bild anzeigen lassen?
Vielen Dank!

muhlba91 25.10.2009 10:40:54

mail mit eingebetteten bildern ausgeben - cid: ???
 
Hallo!

Ich habe ein Problem mit einem Mail. Bis jetzt kann ich alle Parts von einander trennen.
D.h. ich bekomme immer den richtigen HTML-Part, nur werden dort keine Bilder (in meinem Fall halt ein Smiley) ausgegeben. Diese sind wenn man sich den Quelltext des ausgegeben Textes ansieht mit <img src="cid:...@..."> eingebettet.
Was ich noch von meinem Mail und Bild habe ist der base64-Code des Bildes. Wenn ich diesen mit <img src="data:image/gif;base64,...."> ausgebe bekomme ich auch mein Bild.
Aber hierbei wird es gleich angezeigt!
Und jetzt meine Frage: Wie bekomme ich dieses Bild an die richtige Stelle bzw. gebe ihm den richtigen Namen (wie er im cid: steht), sodass es nur mehr dort erscheint - automatisch ohne, dass ich den ganzen HTML-Quelltext auseinander nehmen muss??

Bin wirklich für jede gute Idee offen!

LG Daniel

vt1816 25.10.2009 11:08:02

AW: imap: mail mit bild - anzeigefehler!!!
 
Hallo Daniel,

Themen werden nicht besser oder schneller beantwortet, wenn man sie mehrfach postet bzw. in mehreren Unterforen.

cortex 25.10.2009 12:26:39

AW: mail mit eingebetteten bildern ausgeben - cid: ???
 
Zitat:

Zitat von muhlba91 (Beitrag 131651)
Bin wirklich für jede gute Idee offen!

ok... dann lass das ganze und nimm eine anständige mail-klasse, die dir das mail-gefrickel erspart. such mal hier im forum nach "swift" - mail-probleme gibt's immer wieder und die empfehlungen sind häufig dieselben .-

cx

muhlba91 25.10.2009 13:32:56

AW: imap: mail mit bild - anzeigefehler!!!
 
danke, aber ich habs schon halbwegs gelöst...

vt1816 25.10.2009 14:00:02

AW: imap: mail mit bild - anzeigefehler!!!
 
Zitat:

Zitat von muhlba91 (Beitrag 131654)
danke, aber ich habs schon halbwegs gelöst...

Eine kurze Erinnerung an Punkt B6 sei gestattet.

muhlba91 25.10.2009 15:44:42

AW: imap: mail mit bild - anzeigefehler!!!
 
wollt ich später machen. also mach ichs jetzt...

1.habe ich mit einer funktion, die ein übergebebenes array mit den verschiedenen parts einer mail, die ich mit imap_fetchstructure erhalten habe, analysiert welche disposition und subtypes darin enthalten sind (disposition=INLINE für eingebettes image). die gab mir zurück ob überhaupt inline-images vorhanden sind oder ob der type multipart/related ist - dann muss ich das ganze nochmals machen nur eine ebene tiefer.
2.wenn ich diese info habe und ich weiß, dass inline-images vorhanden sind, habe ich eine neue funktion gemacht, die mir das ganze genauer analysiert:
- dieser funktion werden die parts übergeben und eine von mir deklarierte wo variable (wird zum herausfinden welcher body-part das image ist benötigt (zumindest brauche ich es ;=)))
- hierin wird jeder part wieder einzeln durchsucht und überprüft ob disposition=INLINE ist, wenn ja dann wäre das ein eingebettes image.
- wichtig für später ist die content-id des images, da es dadurch eingebunden wird. (z.b: $part->id - content-id wird beim jeweiligen part als id gespeichert)
- davon habe ich das erste und das letzte zeichen mit substr abgetrennt, da diese < > sind
- nun zur rückgabe:
"$part_num=1+$i; //erhalte part-number des bodys (hier:wenn ich keine anhänge habe, reicht das)
$inline_pics[$cid]["type"]="image/gif"; //image type ist gif -> kann aber auch durch analysieren des type und subtype des parts bekommen werden
$inline_pics[$cid]["encoding"]="base64"; //codierung - meistens eh base64, ansonsten gibt es bei den parts eine variable encoding - daraus kann auf die codierung geschlossen werden
$inline_pics[$cid]["content"]=imap_fetchbody($mbox, $msg_id, $part_num, FT_UID+FT_PEEK);" //der wert des bildes, wie es in der mail steht
- sollte ein anhang auch noch dabei sein, also eine ebene tiefer, dann ist part_num="1.2.".($i+1)
- dieser array wird dann zurückgegeben

nun zur funktion mit dem ersetzen:
mache ich mit preg_replace_callback:
$body=preg_replace_callback($pattern, 'replaceByContentID', $body);
$pattern ist: '#src="cid:(?<cid>[^"]+)"#imu' - dieser gibt der funktion replaceByContentID den gefunden werd zurück (z.B.: smiley.gif)
- die funktion analysiert nun diesen wert und gibt das entsprechende image aus:
$image = $inline_pics[ $matches['cid'] ]; //Hole image aus array mit der jeweiligen cid
return 'src="data:' . $image['type'] .';'. $image['encoding'] .','. $image['content'] .'"'; //gibt das image zurück...

und schon passts...
zum letzten teil - das habe nicht ich gefunden sondern dabei hatte ich hilfe von anderen...

hoffe, dass es etwas klarer wird - bin nicht so der große erklärer! ;=)
achja: ein image wird von einem mail mit <img src="cid:...@..."> eingebunden -> also der Content-ID


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:31:57 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.