Bonjours à tous,
Il y a quelques temps, j'avais ouvert un post vous demandant les possiblités de récupérer les pièces jointe d'un mail pour les enregistrer sur mon serveur web et ainsi mettre à jour certaines pages de mon site grace à une nouvelle fonction en cours de test du plugin UP de Lomart (file_in_content) par un simple envoi de mail.
Vous m'aviez donné certaines pistes qui m'ont permis d'avancer sur le sujet.
Après bien des tentatives et bien des échecs, j'ai enfin réussi à lister et surtout détacher mes 2 pièces jointes pour les enregistrer sur le serveur (je n'arrivais à détacher qu'une seule pièce jointe à la fois).
Il m'a fallu rajouter un
dans le
pour que les 2 fichiers soient bien enregistrés
L'ensemble du code est donc
Pour ceux qui seraient intéressés, Je vous livre l'ensemble du code qui fonctionne sous PHP 8.0.19
Comme je l'avais indiqué, je suis loin de parler et d'écrire courament le PHP, il est fort probable que ce code puisse être optimisé. Si vous avez des idées n'hésitez pas à commenter et me donnez vos avis.
Merci d'avance
Il y a quelques temps, j'avais ouvert un post vous demandant les possiblités de récupérer les pièces jointe d'un mail pour les enregistrer sur mon serveur web et ainsi mettre à jour certaines pages de mon site grace à une nouvelle fonction en cours de test du plugin UP de Lomart (file_in_content) par un simple envoi de mail.
Vous m'aviez donné certaines pistes qui m'ont permis d'avancer sur le sujet.
Après bien des tentatives et bien des échecs, j'ai enfin réussi à lister et surtout détacher mes 2 pièces jointes pour les enregistrer sur le serveur (je n'arrivais à détacher qu'une seule pièce jointe à la fois).
Il m'a fallu rajouter un
Code:
if($name)
Code:
foreach ($attachments as $i => $attachment){}
L'ensemble du code est donc
Code:
foreach ($attachments as $i => $attachment) { $name = $attachment['name']; $contents = $attachment['attachment']; echo "Pièce jointe : " .$name. "<br />\n"; echo "valeur key : " .$i. "<br />\n"; if($name) {file_put_contents($name,$contents);} }
Code:
<?php //ouvre inbox listing messages et copie pièces jointes multiples $server="{serveur:port/tls}INBOX"; // connection au dossier inbox de la mailbox $username="nom_utilisateur"; //imap login $password="mot_de_passe"; //imap password $imap = imap_open($server, $username, $password) or die("imap connection error"); $message_count = imap_num_msg($imap); for ($m = 1; $m <= $message_count; ++$m) { $header = imap_headerinfo($imap, $m); //print_r($header); $email[$m]['from'] = $header->from[0]->mailbox.'@'.$header->from[0]->host; $email[$m]['fromaddress'] = $header->from[0]->personal; $email[$m]['to'] = $header->to[0]->mailbox; $email[$m]['subject'] = $header->subject; $email[$m]['message_id'] = $header->message_id; $email[$m]['date'] = $header->udate; $from = $email[$m]['fromaddress']; $from_email = $email[$m]['from']; $to = $email[$m]['to']; $subject = $email[$m]['subject']; $structure = imap_fetchstructure($imap, $m); $attachments = array(); if (isset($structure->parts) && count($structure->parts)) { for ($i = 0; $i < count($structure->parts); $i++) { $attachments[$i] = array( 'is_attachment' => false, 'filename' => '', 'name' => '', 'attachment' => ''); if ($structure->parts[$i]->ifdparameters) { foreach($structure->parts[$i]->dparameters as $object) { if(strtolower($object->attribute) == 'filename') { $attachments[$i]['is_attachment'] = true; $attachments[$i]['filename'] = $object->value; } } } if ($structure->parts[$i]->ifparameters) { foreach($structure->parts[$i]->parameters as $object) { if(strtolower($object->attribute) == 'name') { $attachments[$i]['is_attachment'] = true; $attachments[$i]['name'] = $object->value; } } } if ($attachments[$i]['is_attachment']) { $attachments[$i]['attachment'] = imap_fetchbody($imap, $m, $i+1); if($structure->parts[$i]->encoding == 3) { // 3 = BASE64 $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); } elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); } } } foreach ($attachments as $i => $attachment) { $name = $attachment['name']; $contents = $attachment['attachment']; echo "Pièce jointe : " .$name. "<br />\n"; echo "valeur key : " .$i. "<br />\n"; if($name) {file_put_contents($name,$contents);} } } } $check = imap_mailboxmsginfo($imap); echo "Nombre de messages avant effacement : " . $check->Nmsgs . "<br />\n"; imap_close($imap); ?>
Merci d'avance