Discussion:
Recupere le no de partie d'un mai l
(trop ancien pour répondre)
Underscape
2009-06-14 07:30:33 UTC
Permalink
Coucou,
J'essaie de me faire un petit client de messagerie mail et pour tout
dire ca va a peu pres :(
disons que pour le recuperation des messages pas de probleme avec le
sujet, date etc...
La ou je bloque c'est sur la lecture des mails.

Pour etre plus precise, sur les messages n'ayant aucune parties ou une
pas de soucis cela est relativement simple.

Par contre des qu'il s'agit d'un message MULTIPART avec piece jointe ou
juste un transfert de mails alors la bonjour la galère!

Par exemple je recois un mail MULTIPART en 2 parties

a l'aide de
$struct = imap_fetchstructure($stream, $NumMessage);

je recupere la structure de ce mail et je l'affiche :

print_r($struct);


cela donne :

stdClass Object
(
[type] => 1
[encoding] => 0
[ifsubtype] => 1
[subtype] => SIGNED
[ifdescription] => 0
[ifid] => 0
[bytes] => 50409
[ifdisposition] => 0
[ifdparameters] => 0
[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => PROTOCOL
[value] => application/x-pkcs7-signature
)

[1] => stdClass Object
(
[attribute] => MICALG
[value] => sha1
)

[2] => stdClass Object
(
[attribute] => BOUNDARY
[value] => ------------ms050100070502000904020808
)

)

[parts] => Array
(
[0] => stdClass Object
(
[type] => 1
[encoding] => 0
[ifsubtype] => 1
[subtype] => MIXED
[ifdescription] => 0
[ifid] => 0
[bytes] => 42317
[ifdisposition] => 0
[ifdparameters] => 0
[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => BOUNDARY
[value] => ------------040300000509010000050902
)

)

[parts] => Array
(
[0] => stdClass Object
(
[type] => 0
[encoding] => 4
[ifsubtype] => 1
[subtype] => PLAIN
[ifdescription] => 0
[ifid] => 0
[lines] => 12
[bytes] => 225
[ifdisposition] => 0
[ifdparameters] => 0
[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => CHARSET
[value] => ISO-8859-1
)

[1] => stdClass Object
(
[attribute] => FORMAT
[value] => flowed
)

)

)

[1] => stdClass Object
(
[type] => 5
[encoding] => 3
[ifsubtype] => 1
[subtype] => JPEG
[ifdescription] => 0
[ifid] => 0
[bytes] => 39712
[ifdisposition] => 1
[disposition] => INLINE
[ifdparameters] => 1
[dparameters] => Array
(
[0] => stdClass Object
(
[attribute] => FILENAME
[value] => 125.jpg
)

)

[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => NAME
[value] => 125.jpg
)

)

)

[2] => stdClass Object
(
[type] => 0
[encoding] => 3
[ifsubtype] => 1
[subtype] => PLAIN
[ifdescription] => 0
[ifid] => 0
[lines] => 24
[bytes] => 1784
[ifdisposition] => 1
[disposition] => INLINE
[ifdparameters] => 1
[dparameters] => Array
(
[0] => stdClass Object
(
[attribute] => FILENAME
[value] => a vendre.txt
)

)

[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => NAME
[value] => a vendre.txt
)

)

)

)

)

[1] => stdClass Object
(
[type] => 3
[encoding] => 3
[ifsubtype] => 1
[subtype] => X-PKCS7-SIGNATURE
[ifdescription] => 1
[description] => S/MIME Cryptographic Signature
[ifid] => 0
[bytes] => 7604
[ifdisposition] => 1
[disposition] => ATTACHMENT
[ifdparameters] => 1
[dparameters] => Array
(
[0] => stdClass Object
(
[attribute] => FILENAME
[value] => smime.p7s
)

)

[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => NAME
[value] => smime.p7s
) ) ) ) )


Je vois donc que ce mail est en MULTIPART "([type] => 1)", qu'il est
encodé en texte "[encoding] => 0", qu'il est signé numeriquement
"[subtype] => SIGNED" et qu'il est en 2 parties.
Bon jusque la ca va, c'est maintenant que cela ce gatte.

En effet vu la structure du mail ci-dessus, comment trouvé le numéro de
la partie contenant le texte?
Car pour l'afficher "imap_fetchbody()" a besoin du numéro de partie.

J'ai regarder sur le net et franchement c'est super reduit.

Merci de votre aide
Olivier Miakinen
2009-06-15 00:01:19 UTC
Permalink
Bonjour,

je n'y connais rien à imap_fetchstructure, mais...
Post by Underscape
[...]
[parts] => Array
(
[0] => stdClass Object
(
[type] => 0
[encoding] => 4
[ifsubtype] => 1
[subtype] => PLAIN
[ifdescription] => 0
[ifid] => 0
[lines] => 12
[bytes] => 225
[ifdisposition] => 0
[ifdparameters] => 0
[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => CHARSET
[value] => ISO-8859-1
)
[1] => stdClass Object
(
[attribute] => FORMAT
[value] => flowed
)
)
)
[...]
En effet vu la structure du mail ci-dessus, comment trouvé le numéro de
la partie contenant le texte?
... je parie pour celui dont le sous-type est PLAIN, et qui a un CHARSET
de défini (qui plus est en format flowed, beurk).
--
Olivier Miakinen
Sophie
2009-06-15 11:41:37 UTC
Permalink
Bonjour,
j'essaie de recuperé les informations imap, contenu dans
"imap_fletchstructure()" afin de pouvoir decortiqué les infos et ainsi
n'afficher que ce que je souhaite.
Par exemple, j'ai un mail contenant plusieurs partie (MULTIPART) celui-ci a
du texte et du html plus un fichier joint.
Pour l'heure je me fiche du fichier joint seul m'importe d'afficher le mail.
Le probleme c'est que "imap_fletchstructure() " renvoi un espece de tableau
bien embetant.
En effet le tableau contient une suite de tableau imbriqué les uns dans les
autres qu'il est super dur de parcourir pour trouvé l'info voulu.
Alors faute de trouver le truc ideal j'ai bricolé le code ci-dessous, me
permettant, de me connecter a ma boite, de compter le nombre de partie du
mail puis d'en sortir un indexage de chaque partie afin de pouvoir le
reutilisé plus tard via "imap_fletchbody()"


$MaBox = imap_open("{".$imap_server.":110/pop3}", $imap_user,
$imap_pass); //ma connexion

$MessNum = $IDMESS;
//numero du mail envoyé par url pour test

$StructureInfos = imap_fetchstructure($MaBox, $MessNum);
// la structure du mail recuperé via son n°

$NbParts = count($StructureInfos->parts);
//Nbre de partie du mail ex :1, 2, etc....

//*****************
// fonction qui me permet de connaitre les N° de parties du mail

function mime_scan_multipart(&$parts, $part_number)
{
$n = 1;
foreach ($parts as $obj) {
if ($obj->type == 1)
mime_scan_multipart($obj->parts, "$part_number$n.");
else
echo "$part_number$n\n";
$n++;
}
}

function mime_scan(&$obj)
{
if ($obj->type == 1)
mime_scan_multipart($obj->parts, "");
else
echo "1";
}

$TabNom = mime_scan($StructureInfos);

//*****************
// fonction qui met le resultat de imap_fletchstructure dans un tableau pour
trouver ce que je cherche

function create_part_array($structure, $prefix="") {
//print_r($structure);
if (sizeof($structure->parts) > 0)
{
// plusieurs parties
foreach ($structure->parts as $count => $part) {
add_part_to_array($part, $prefix.($count+1), $part_array);
}}else{
$part_array[] = array('part_number' => $prefix.'1', 'part_object' =>
$obj);
}
return $part_array;
}


// Sub fonction appelé uniquement via creat_part_array
function add_part_to_array($obj, $partno, & $part_array) {
$part_array[] = array('part_number' => $partno, 'part_object' => $obj);
if ($obj->type == 2)
{
// verif au cas ou message en RFC-822
//print_r($obj);
if (sizeof($obj->parts) > 0) {
foreach ($obj->parts as $count => $part) {

if (sizeof($part->parts) > 0) {
foreach ($part->parts as $count2 => $part2) {
add_part_to_array($part2, $partno.".".($count2+1),
$part_array);
}}else{
$part_array[] = array('part_number' =>
$partno.'.'.($count+1), 'part_object' => $obj);
}}}else{
$part_array[] = array('part_number' => $prefix.'.1',
'part_object' => $obj);
}}else{
if (sizeof($obj->parts) > 0) {
foreach ($obj->parts as $count => $p) {
add_part_to_array($p, $partno.".".($count+1), $part_array);
}}}}

//***************
// je recupere le resultat de la fonction
$RecupPartArray = create_part_array($StructureInfos);

// bon alors la c'est le bazar
//Une fois la moulinette sur les parties faite, je souhaite pouvoir recuperé
les variables qui m'interresse et les mettres dans un petit tableau qui
comportera que
//les infos dont j'ai besoin a savoir, le N° de partie, le format du mail
(html, RFC ou texte) et le codage.


foreach ($RecupPartArray as $Key1Rang=>$Valeur1Rang) {//x

$Board1Rang[$Key1Rang] = $Valeur1Rang;
//print_r($Board1Rang[$Key1Rang]);

$RecupNumPart = $Board1Rang[$Key1Rang]['part_number']; //N° des
differentes parties du mail
echo "(".$RecupNumPart.")";

};//x

Voila donc mon soucis, car le tableau retourné via "$RecupPartArray"
contient un autre tableau qui contient un autre tableau etc....
Et la pour recuperé les variables correspondante a 'subtype' ou 'encoding'
ou d'autres impossible a chaque fois il ne me trouve rien.
j'ai essayé en remettant une couche de foreach dans le precedent mais
rien....
Bref si quelqu'un a une idée ca serait bien zen.
Merci

Continuer la lecture sur narkive:
Loading...