Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Recupere le no de partie d'un mai l

4 views
Skip to first unread message

Underscape

unread,
Jun 14, 2009, 3:30:33 AM6/14/09
to
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

unread,
Jun 14, 2009, 8:01:19 PM6/14/09
to
Bonjour,

je n'y connais rien � imap_fetchstructure, mais...

Le 14/06/2009 09:30, Underscape a �crit :
>
> [...]

> [...]


>
> 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

unread,
Jun 15, 2009, 7:41:37 AM6/15/09
to
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

0 new messages