Einzelnen Beitrag anzeigen
  #10  
Alt 25.10.2009, 15:44:42
muhlba91 muhlba91 ist offline
Anfänger
 
Registriert seit: Oct 2009
Alter: 33
Beiträge: 15
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
Mit Zitat antworten