Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pieces jointes et IMAP

2 réponses
Avatar
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

2 réponses

Avatar
P'tit Marcel
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/

Avatar
Etienne SOBOLE
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.