EXTRAIRE UNE PIÈCE JOINTE APRÈS RÉCEPTION D'EMAIL

apxa Messages postés 188 Date d'inscription mercredi 15 mai 2002 Statut Membre Dernière intervention 25 avril 2009 - 30 mars 2006 à 22:03
Me0s Messages postés 2 Date d'inscription mardi 24 août 2010 Statut Membre Dernière intervention 24 août 2010 - 24 août 2010 à 15:00
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36798-extraire-une-piece-jointe-apres-reception-d-email

Me0s Messages postés 2 Date d'inscription mardi 24 août 2010 Statut Membre Dernière intervention 24 août 2010
24 août 2010 à 15:00
J'oubliais, il y a une faute dans ton code à la fin moumoloud :
if(isset($nom_fichier)) if ($nom_fichier!=null) tu as oublié un {
Me0s Messages postés 2 Date d'inscription mardi 24 août 2010 Statut Membre Dernière intervention 24 août 2010
24 août 2010 à 14:42
Bonjour,
je n'arrive pas à faire fonctionner ce code.
J'ai remarqué avec des echo, qu'il ne rentrait pas dans la boucle property_exists et donc ni dans if (isset($part))

Je pense que le souci vient du $nbrparts = !$struct->parts ? "1" : count($struct->parts); qui vaut toujours 2. Alors que j'ai 4 e-mails dont un qui a une pièce jointe.

Quelqu'un peut--il m'expliquer la ligne $nbrparts = !$struct->parts ? "1" : count($struct->parts); ?

Merci pour votre aide.
moumoloud Messages postés 1 Date d'inscription mercredi 2 juin 2010 Statut Membre Dernière intervention 28 juin 2010
28 juin 2010 à 12:55
rajout de :
2 property_exists
et de 2 isset,
pour un code qui ne renvoie pas d'erreur

$nbmess = imap_num_msg($mail);

if ($nbmess == 0)
{
echo "


Aucun message présent sur le serveur




";
}
else
{
for($j =1;$j<=$nbmess;$j++)
{
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;
echo "+ ".$sujet."
";
$struct = imap_fetchstructure($mail,$j);

if ($struct->type == 1)
{
$nbrparts = !$struct->parts ? "1" : count($struct->parts);
}

$piece = array();
for($h=1;$h<=$nbrparts;$h++)
{
if (property_exists($struct, "parts[1]")){$part = $struct->parts[1] ; }

$piece = imap_fetchbody($mail,$j,$h+1);

if (isset($part)){if (property_exists($part, "encoding")){if ($part->encoding == "3")
{
$nbparam = count($part->parameters);
$i=0;
while ($i < $nbparam)
{
$i++;
$param = $part->parameters[$i];
$nom_fichier = $struct->parts[$h]->dparameters[0]->value;
if($nom_fichier!=null)
{
echo ' /'.$nom_fichier.'
';
}
}
$piece = imap_base64($piece);
}
}}
if(isset($nom_fichier)) if ($nom_fichier!=null)
{
$newfichier = fopen("./files".$nom_fichier,"w+");
fwrite($newfichier,$piece);
fclose($newfichier);
}
}
}
}
DragonicFlash Messages postés 20 Date d'inscription dimanche 22 juin 2003 Statut Membre Dernière intervention 31 octobre 2006
19 août 2009 à 14:36
Exactement ce que je cherchais ! =) BRAVO !
NONOKH Messages postés 2 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 16 février 2009
16 févr. 2009 à 11:56
merci pour tout le monde
je suis vraiment tres fiere pour les aide
j'ai essayer le code ca marche tres bien
je cherche un script qui donne le choix soit de consulter la piece jointe ou la telecharger ici
aider moi svp....!
wam_baloo Messages postés 1 Date d'inscription vendredi 8 juin 2007 Statut Membre Dernière intervention 1 juillet 2008
1 juil. 2008 à 09:50
J'ai testé ce script pour mon projet et j'avoue qu'il fonctionne à merveille. Seulement, je ne comprends pas comment récupérer les pièces jointes de chaque mail. En effet, ce script va permettre de scanner l'ensemble des pièces jointes contenues sur le serveur imap, et en extraire les noms de fichiers et les contenus.
Mon but à moi est de sortir les pièces jointes pour chaque mail. Je m'explique. Dans mon exemple, j'ai deux mails qui sont sur mon serveur. Le premier avec une pièce jointe nommée : test1.pdf, le deuxième avec deux pièces jointes nommées : test1.pdf et test2.pdf. Le script me ressort test1.pdf et test2.pdf, le problème est que je voudrais qu'il me sorte quelque chose du genre :

mail1 : test1.pdf
mail2 : test1.pdf, test2.pdf.

Si quelqu'un a une petite idée je suis preneur. Je vais continuer à chercher de mon côté en attendant.
dylan_salmon Messages postés 8 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 31 juillet 2006
22 févr. 2008 à 10:47
Pour un fichier dont le $part->encoding est à 4, utilise imap_qprint sur ton retour de imap_fetchbody
> ça convertit une chaîne à guillemets en une chaîne à 8 bits
godgod Messages postés 1 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 15 octobre 2007
15 oct. 2007 à 08:37
Bonjour,
Votre script marche très bien néanmoins, j'arrive pas à récupérer les fichiers texte (.txt). Apparemment, le $part->encoding est de 4. Si quelqu'un a une solution qu'il m'en fasse part :)
lelapinou_69 Messages postés 64 Date d'inscription mardi 27 janvier 2004 Statut Membre Dernière intervention 10 novembre 2008
13 juin 2007 à 10:49
Salut all.
Je viens minutieusement de lire tous les commentaires de ce script. J'ai récemment récupérer un script qui permet d'envoyer des emails avec des pièces jointes (un fichier pdf en l'occurrence), mais malheureusement lors de l'ouverture de cette dernière, j'ai un beau message d'erreur qui me dit que le fichier est soit corrompu soit envoyé en tant que pièce jointe et mal décodé.
Ai-je besoin de cette source ci pour récupérer cette pièce jointe, et si oui, à quel niveau dois-je l'introduire?
Merci pour vos réponses.
Thierry_ZT Messages postés 6 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 11 janvier 2007
11 janv. 2007 à 15:49
Non, j'ai toujours le même affichage.

Voici mon code complet, si vous pouvez m'aider:

<?php
header("Content-Type: text/html; charset= iso-8859-15");
$mail = imap_open("{msgnotes1:110/pop3}INBOX","neoxis","neoxis07");
$nbmess = imap_num_msg($mail);

if ($nbmess == 0)
{
echo "


Aucun message présent sur le serveur




";
}
else
{
for($j =1;$j<=$nbmess;$j++)
{
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;
echo "+ ".$sujet."
";
$struct = imap_fetchstructure($mail,$j);

if ($struct->type == 1)
{
$nbrparts = !$struct->parts ? "1" : count($struct->parts);
}

$piece = array();
for($h=1;$h<=$nbrparts;$h++)
{
$part = $struct->parts[1] ;

$piece = imap_fetchbody($mail,$j,$h+1);

if ($part->encoding == "3")
{
$nbparam = count($part->parameters);
$i=0;
while ($i < $nbparam)
{
$i++;
$param = $part->parameters[$i];
$nom_fichier = $struct->parts[$h]->dparameters[0]->value;
if($nom_fichier!=null)
{
echo ' /'.$nom_fichier.'
';
}
}
$piece = imap_base64($piece);
}
if($nom_fichier!=null)
{
$newfichier = fopen("Fichiers/".$nom_fichier,"w+");
fwrite($newfichier,$piece);
fclose($newfichier);
}
}
}
}

?>

Merci à l'avance.
simonlartiste Messages postés 39 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 28 décembre 2007
11 janv. 2007 à 15:43
comme ceci : content="text/html; charset=UTF-8"
simonlartiste Messages postés 39 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 28 décembre 2007
11 janv. 2007 à 15:41
met le charset en UTF8 pour voir...
Thierry_ZT Messages postés 6 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 11 janvier 2007
11 janv. 2007 à 15:37
Merci SIMONLARTISTE de la réactivité, mais j'ai le même pb. J'ai 3 mails dans la boite:

+ = ?iso-8859-1?Q?TR:_D=E9claration_REA_pour_SECM-GT_n=B0_3952?=
+ =?iso-8859-1?Q?TR:_D=E9claration_REA_n=B0_3956_et_3957?=
/AJP Lettre de Confirmation 0701GBU1578646 - 3AI.pdf
+ TR: test mail

Extrait du code:
<?php
header("Content-Type: text/html; charset=iso-8859-15");
$mail = imap_open("{msgnotes1:110/pop3}INBOX","neoxis","neoxis07");
$nbmess = imap_num_msg($mail);

if ($nbmess == 0)
{
echo "


Aucun message présent sur le serveur




";
}
else
{
for($j =1;$j<=$nbmess;$j++)
{
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;
echo "+ ".$sujet."
";
$struct = imap_fetchstructure($mail,$j);
.
.
.
je l'ai placé au mauvais endroit?
simonlartiste Messages postés 39 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 28 décembre 2007
11 janv. 2007 à 15:29
Rajoute ça en debut de code :
header("Content-Type: text/html; charset=iso-8859-15");
Thierry_ZT Messages postés 6 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 11 janvier 2007
11 janv. 2007 à 15:25
Super le script,

mais j'ai un pb d'affichage. Il m'affiche:
+ =?iso-8859-1?Q?TR:_D=E9claration_REA_pour_SECM-GT_n=B0_3952?=
au lieu de:
Déclaration REA pour SECM-GT n° 3952

Quelqu'un saurait m'expliquer ce qu'il se passe.

Merci.
raven44 Messages postés 315 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 21 mars 2011 1
5 janv. 2007 à 12:12
Ah jdalton, tu as finalement réussi à récupérer chaque noms de pièces jointes, félicitation !!

C'est vrai que ceci m'a causé des problèmes. enfin bon. C'est bien, ca va aider les autres désormais.
jdalton4 Messages postés 2 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 19 octobre 2006
19 oct. 2006 à 20:00
Ps: j'ai corrigé la merdouille qu'il y avait avec la gestion des noms. Sa roule now!

chaque fichier a son petit nom propre

++ les gens

JD4

jdalton4@gmail.com
jdalton4 Messages postés 2 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 19 octobre 2006
19 oct. 2006 à 19:51
Kikou!

Voici le script modifié par mes soins et fonctionnel (désolé j'ai viré les commentaires du script...), il récupère toutes les pièces jointes d'une messagerie et les stocke dans un dossier (modifier /usr/otiumfra/joint/fichiers/ par l'absolute path du dossier dans lequel vous voulez sauvegarder vos pieces jointes). Have fun!

JD4

<?
$mail = imap_open("{localhost:110/pop3}INBOX","adresse@domaine.com","motdepasse");
$nbmess = imap_num_msg($mail);

if ($nbmess == 0)
{
echo "


Aucun message présent sur le serveur




";
}
else
{
for($j =1;$j<=$nbmess;$j++)
{
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;
echo "+ ".$sujet."
";
$struct = imap_fetchstructure($mail,$j);

if ($struct->type == 1)
{
$nbrparts = !$struct->parts ? "1" : count($struct->parts);
}

$piece = array();
for($h=1;$h<=$nbrparts;$h++)
{
$part = $struct->parts[1] ;

$piece = imap_fetchbody($mail,$j,$h+1);

if ($part->encoding == "3")
{
$nbparam = count($part->parameters);
$i=0;
while ($i < $nbparam)
{
$i++;
$param = $part->parameters[$i];
$nom_fichier = $struct->parts[$h]->dparameters[0]->value;
if($nom_fichier!=null)
{
echo ' /'.$nom_fichier.'
';
}
}
$piece = imap_base64($piece);
}
if($nom_fichier!=null)
{
$newfichier = fopen("/usr/otiumfra/joint/fichiers/".$nom_fichier,"w+");
fwrite($newfichier,$piece);
fclose($newfichier);
}
}
}
}

?>
thibotus Messages postés 4 Date d'inscription dimanche 2 octobre 2005 Statut Membre Dernière intervention 28 mai 2007
2 juin 2006 à 12:21
Finalement j'ai réussi en suivant le beug décri par MICA34.

Ensuite, il ne récupère pas le nom de la pièce jointe chez moi, alors en faisantune connection POP3 ca fonctionne. {pop.domaine.com:110/pop3}INBOX

Et pour supprimer les messages :

imap_delete($mail, $i);
imap_expunge($mail);
imap_close($mail);

Ca serait bien que le créateur du script met à jour les deux beugs :

- le ; manquant
- $piece[$h] par $piece
thibotus Messages postés 4 Date d'inscription dimanche 2 octobre 2005 Statut Membre Dernière intervention 28 mai 2007
1 juin 2006 à 17:38
Moi j'essaye de récupérer simplement une image JPG attaché afin de l'upload dans un dossier défini... :/ mais y arrive pas avec ce code.
simonlartiste Messages postés 39 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 28 décembre 2007
12 mai 2006 à 12:56
Autant pour moi, tout fonctionne, a+ les developpeux!!
simonlartiste Messages postés 39 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 28 décembre 2007
12 mai 2006 à 11:56
Merci, je me sens légèrement ridicule mais bon... sinon c est normal que ma piéce jointe extraite soit vide??
Faut il que le mail soit envoyé via la fonction mail de PHP et non via outlook??
d avance merci
Mica34 Messages postés 2 Date d'inscription mercredi 11 juin 2003 Statut Membre Dernière intervention 12 mai 2006
12 mai 2006 à 11:14
Ajoute un ; ligne 47 et ca ira mieux ;)
simonlartiste Messages postés 39 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 28 décembre 2007
11 mai 2006 à 17:40
Désolé mais j ai toujours une erreur :
"Parse error: syntax error, unexpected T_FOR in C:\wamp\www\test_mail.php on line 50"
Mica34 Messages postés 2 Date d'inscription mercredi 11 juin 2003 Statut Membre Dernière intervention 12 mai 2006
11 mai 2006 à 16:07
Salut à tous.
Je viens de passer un petit moment sur ce script pour des besoins persos. Il y a quelques problèmes. Les pièces sont bien recupérés mais leur taille est nulle. En regardant de plus prés j'ai pu corriger. Juste pour savoir, est ce que cela fonctionne chez vous ?

Pour info j'ai donc modifié cela :
$piece = array();
$piece = imap_fetchbody($mail,$j,$h);
En fait imap_fetchbody ne retourne pas un tableau mais une chaine. L'appel ensuite par $piece[$h] ne marche pas et par conséquent le contenu est vide.

J'ai donc utilisé $piece en tant que variable normale et tout marche sans problème.

Merci pour ce script en tous cas ! Cela m'a permis d'aprrendre beacoup de chose sur les emails et leur composition.
simonlartiste Messages postés 39 Date d'inscription vendredi 12 novembre 2004 Statut Membre Dernière intervention 28 décembre 2007
5 mai 2006 à 14:35
Slt,
le code est trés interessant cependant l erreur ligne 49 :"Parse error: syntax error, unexpected T_FOR in C:\wamp\www\mail\index.php on line 49 " me bloque, aurais tu la solution, d avance merci
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mars 2006 à 13:50
je peux pas tester, mais bon, c'est bien l'idée y est : ça permet à ceux qui veulent développer une appli webmail de voir un peu comment on peut s'y prendre pour extraire les pièces jointes.

Par contre, tu aurais pu t'appliquer côté code :
- comparaisons typées (plus rapides, et plus exactes)
- NEVER, EVER...ne JAMAIS utilier une fonction dans l'expression d'évaluation d'une boucle for! Ici, fais ton count () en dehors de ta boucle, stocke le résultat dans une variable, et fous la variable dans ton for (). For évalue à chaque itération son expression. Ce qui veut dire que ton tableau, tu le comptes autant de fois que tu boucles avec ton for (), alors que tu pourrais ne le compter qu'une fois.
- ça manque de gestion d'erreurs
raven44 Messages postés 315 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 21 mars 2011 1
31 mars 2006 à 10:01
Salut Apxa, en effet non, pour le moment ce petit bout de code ne permet que de recupérer une seule pièce jointe ! peut etre que si j'ai le temps, je le modifierai afin que l'on puisse en extraire plusieurs !.

Merci de cette remarque.
apxa Messages postés 188 Date d'inscription mercredi 15 mai 2002 Statut Membre Dernière intervention 25 avril 2009
30 mars 2006 à 22:03
iop,
Ca m'a l'air bien ca mais est ce que ton code gère plusieurs pieces jointes dans un même email ?

Have Fun ;)