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