pieces jointes et IMAP

Le
CrazyCat
Bonjour,

je suis en train d'écrire une petite classe pour faire un webmail
réduit, mais j'ai de gros problèmes pour récupérer les pièces jointes.

Actuellement, j'ai ceci:

<?
$struct = imap_fetchstructure($this->popconn, $msguid, FT_UID);
if ($struct->type == 1) {
// multipart message
$j = 2;
foreach ($struct->parts as $part) {
if ($part->ifdparameters) {
$message['attachment'][] = array("name" =>
$part->dparameters[0]->value, "mime" => $part->type, "content" =>
base64_decode(imap_fetchbody($this->popconn,$msguid,$j)));
}
$j++;
}
}
$message['body'] = $this->decode($msguid, "1", $struct->encoding);
?>

Les problèmes:
1) le nom du fichier joint peut être encodé (ISO-8859-1''Num%E9ris.jpg)
2) la pièce jointe n'est pas forcémment en base64 (dans l'exemple, c'est
une image)
3) le type mime donné par imap_fetchstructure est assez réduit

Quelqu'un aurait-il une fonction (ou plusieurs) qui me permette(nt) de
récupérer mes pièces jointes et les infos les concernant (sachant que je
les enregistrerait sous forme de fichier)?

Merci d'avance
--
Astuces pour webmasters: http://www.crazycat.info
Tchat francophone: http://www.crazy-irc.net

  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
P'tit Marcel
Le #107725
Salut Crazycat,

je n'ai pas d'expérience de l'extension imap (préfèrant attaquer en
bourrin par le protocope pop) mais voici mes idées d'ignare :


$struct = imap_fetchstructure($this->popconn, $msguid, FT_UID);
if ($struct->type == 1) {
// multipart message
$j = 2;
foreach ($struct->parts as $part) {
if ($part->ifdparameters) {
$message['attachment'][] = array("name" =>
$part->dparameters[0]->value, "mime" => $part->type, "content" =>
base64_decode(imap_fetchbody($this->popconn,$msguid,$j)));



Les problèmes:
1) le nom du fichier joint peut être encodé (ISO-8859-1''Num%E9ris.jpg)


bon, ça doit pouvoir se gérer :

$nom = $part->dparameters[0]->value;
if(preg_match("`ISO-([-0-9])+''(.+)`i", $nom, $reg)) {
$nom = urldecode($reg[2]);
}
(sans garantie du gouvernement)


2) la pièce jointe n'est pas forcémment en base64 (dans l'exemple, c'est
une image)


apparemment, tu peux tester la valeur de $part->encoding, genre :

$contenu_brut = imap_fetchbody($this->popconn, $msguid, $j);
switch($part->encoding) {
case 3 : # base64
$contenu = base64_decode($contenu_brut);
break;
case 4 : # QP
$contenu = quoted_printable_decode($contenu_brut);
break;
default: # 7 bits ou 8 bits ou binaire ou autre
$contenu = $contenu_brut;
}


3) le type mime donné par imap_fetchstructure est assez réduit...


??
est-ce que tu veux dire que l'extension IMAP filtre les informations
présentes dans le message ou bien que c'est le type présent dans le
message qui est imprécis ?

a+
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

Etienne SOBOLE
Le #107719
je suis en train d'écrire une petite classe pour faire un webmail réduit,
mais j'ai de gros problèmes pour récupérer les pièces jointes.


http://www.php.net/manual/fr/function.imap-fetchstructure.php

chercher la contribution de
spam at emielmols dot info

Ca pourra te donner un point de départ.

voila.

Poster une réponse
Anonyme