begin process at 2010 03 22 16:35:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

E-Mail / Messagerie

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

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


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :E-Mail / Messagerie Classé sous :extraire, enregistrer, recuperer, pièce, jointe Niveau :Initié Date de création :29/03/2006 Date de mise à jour :03/04/2006 11:47:22 Vu / téléchargé :22 636 / 841

Auteur : raven44

Ecrire un message privé
Commentaire sur cette source (26)
Ajouter un commentaire et/ou une note

 Description

Ce script permet d'extraire une pièce jointe d'un email reçu coté client et de l'enregistrer dans un dossier quelquonque en utilisant les fonctions imap propre à php.

Source

  • <?php
  • //Tout d'abord, on ouvre une boite mail
  • $mail = imap_open("{nom serveur ou localhost ou autres/pop3}INBOX",'utilisateur','motdepasse');
  • //Quitte à la faire, autant le faire pour chaque message !
  • $nbmess = imap_num_msg($mail);
  • if ($nbmess == 0)
  • {
  • print "
  • <div align='center'>
  • <b>Aucun message présent sur le serveur</b>
  • <br /><br />
  • </div>
  • ";
  • }
  • else
  • {
  • for($j=1;$j<=$nbmess;$j++)
  • {
  • //Extraction du sujet du message, pour ceux qui voudrait faire un test sur un titre au préalable
  • $header = imap_headerinfo($mail,$j);
  • $sujet = $header->subject;
  • //Extraction de la structure du message
  • $struct = imap_fetchstructure($mail,$j);
  • // On compte le nombre de partie dans la structure du message
  • if ($struct->type == 1)
  • {
  • $nbrparts = !$struct->parts ? "1" : count($struct->parts);
  • }
  • //On place le code binaire de la pièce dans un tableau
  • $piece = array();
  • for($h=2;$h<=$nbrparts;$h++)
  • {
  • $part = $struct->parts[1] ;
  • //Extraction du code binaire de la pièce jointe
  • $piece = imap_fetchbody($mail,$j,$h);
  • //Le 3 est spécifique à l'encodage en base64 (le plus répandu) pour les pièces jointes.
  • if ($part->encoding == "3")
  • {
  • //Comptage du nombre de parametres
  • $nbparam = count($part->parameters)
  • for ($i = 0; $i < $nbparam ; $i++)
  • {
  • //Récupération du nom de la pièce jointe
  • $param = $part->parameters[$i];
  • if ($param->attribute == "NAME")
  • {
  • $nom_fichier = $param->value;
  • }
  • else
  • {
  • $nom_fichier = "Nom de fichier introuvable";
  • }
  • }
  • //Décodage du code binaire de la pièce jointe
  • $piece[$h] = imap_base64($piece[$h]);
  • }
  • $nom_fichier = str_replace(".doc","",$nom_fichier) ;
  • //Ouverture du fichier et création s'il n'existe pas
  • $newfichier = fopen("C:/".$nom_fichier.$h.".doc","w+");
  • //Ecriture dans le fichier
  • fwrite($newfichier,$piece[$h]);
  • //Fermeture du fichier
  • fclose($newfichier);
  • }
  • }
  • }
  • ?>
<?php

//Tout d'abord, on ouvre une boite mail
$mail = imap_open("{nom serveur ou localhost ou autres/pop3}INBOX",'utilisateur','motdepasse');

//Quitte à la faire, autant le faire pour chaque message !
$nbmess = imap_num_msg($mail);
if ($nbmess == 0)
{
print "
	<div align='center'>
	  <b>Aucun message présent sur le serveur</b>
          <br /><br />
	</div>
      ";
} 
else
{   
for($j=1;$j<=$nbmess;$j++)
{
//Extraction du sujet du message, pour ceux qui voudrait faire un test sur un titre au préalable
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;

//Extraction de la structure du message	
$struct = imap_fetchstructure($mail,$j);

// On compte le nombre de partie dans la structure du message
if ($struct->type == 1)
{
$nbrparts = !$struct->parts ? "1" : count($struct->parts);
}

//On place le code binaire de la pièce dans un tableau
$piece = array();
for($h=2;$h<=$nbrparts;$h++)
{
$part = $struct->parts[1] ;

//Extraction du code binaire de la pièce jointe
$piece = imap_fetchbody($mail,$j,$h);
                
//Le 3 est spécifique à l'encodage en base64 (le plus répandu) pour les pièces jointes.
if ($part->encoding == "3") 
{
//Comptage du nombre de parametres
$nbparam =  count($part->parameters)
		    
for ($i = 0; $i < $nbparam ; $i++)
{
//Récupération du nom de la pièce jointe
$param = $part->parameters[$i];
if ($param->attribute == "NAME")
{
$nom_fichier = $param->value;
}
else
{
$nom_fichier = "Nom de fichier introuvable";
}
}
//Décodage du code binaire de la pièce jointe
$piece[$h] = imap_base64($piece[$h]);
}

$nom_fichier = str_replace(".doc","",$nom_fichier) ;

//Ouverture du fichier et création s'il n'existe pas
$newfichier = fopen("C:/".$nom_fichier.$h.".doc","w+");
//Ecriture dans le fichier
fwrite($newfichier,$piece[$h]);
//Fermeture du fichier
fclose($newfichier);
}
}
}

?>		   

 Conclusion

Voilà, le script est terminé. Maintenant, vous pouvez faire ce que vous voulez de votre pièce jointe !.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 mars 2006 16:30:18 :
Modification d'un commentaire afin qu'il soit plus visible
03 avril 2006 11:47:23 :
Suite au faite que mon code ne pouvait pas extraire plusieurs pièces jointes, j'ai modifier celui-ci afin qu'il réponde au problème. Seul problème que je n'arrive pas a résoudre : récupérer le nom des autres pièces jointe, je contourne la difficulté en changeant le nom de la pièce jointe en rajoutant un petit index, si quelqu'un trouve la solution, qu'il m'en avertisse. Merci à vous.

 Sources de la même categorie

Source avec Zip AJOUT D'UN RENDEZ-VOUS DANS UN CALENDRIER EXCHANGE 2003 par SachaWolf
TRANSFORMER DU TEXTE OU DE L'HTML EN TEXTE CONFORME À LA NOR... par fyav
Source avec Zip FORMULAIRE EMAIL AVEC PIECE JOINTE REPRIS DE LITTLEBUBU par cfndiaye
Source avec Zip Source avec une capture MESSAGERIE INTERNE AVEC FICHIER TEXTE par polly19
Source avec Zip FORMULAIRE EVOIE ET PLUS par florentinul

 Sources en rapport avec celle ci

RÉCUPÈRE LA PLACE PERDU DANS UNE BASE DE DONNÉES MYSQL par aminecherche
PHP EXTRAIRE DES MAILS D'UN GROS FICHIER LOCAL OU DISTANT par cosmoswarezone1
Source avec Zip [PHP5] - SIMPLE CLASSE D'ENVOI D'EMAIL par codefalse
Source avec Zip FORMULAIRE PERMETTANT D'ENVOYER UN E-MAIL (AVEC PIÈCES JOINT... par triumphs
Source avec Zip MAIL AVEC GROS FICHIER JOINT EN AUTOMATIQUE par michelcb

Commentaires et avis

Commentaire de apxa le 30/03/2006 22:03:08

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

Commentaire de raven44 le 31/03/2006 10:01:26

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.

Commentaire de malalam le 31/03/2006 13:50:38 administrateur CS

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

Commentaire de simonlartiste le 05/05/2006 14:35:03

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

Commentaire de Mica34 le 11/05/2006 16:07:10

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.

Commentaire de simonlartiste le 11/05/2006 17:40:01

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"

Commentaire de Mica34 le 12/05/2006 11:14:22

Ajoute un ; ligne 47 et ca ira mieux ;)

Commentaire de simonlartiste le 12/05/2006 11:56:27

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

Commentaire de simonlartiste le 12/05/2006 12:56:35

Autant pour moi, tout fonctionne, a+ les developpeux!!

Commentaire de thibotus le 01/06/2006 17:38:40

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.

Commentaire de thibotus le 02/06/2006 12:21:57

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

Commentaire de jdalton4 le 19/10/2006 19:51:17

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 "
    <div align='center'>
     <b>Aucun message présent sur le serveur</b>
<br /><br />
    </div>
";
}
else
{
for($j=1;$j<=$nbmess;$j++)
{
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;
echo "+ ".$sujet."<br>";  
$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 '&nbsp;&nbsp;&nbsp;&nbsp;/'.$nom_fichier.'<br>';
}
}
$piece = imap_base64($piece);
}  
if($nom_fichier!=null)
{
$newfichier = fopen("/usr/otiumfra/joint/fichiers/".$nom_fichier,"w+");
fwrite($newfichier,$piece);
fclose($newfichier);
}
}
}
}
  
?>

Commentaire de jdalton4 le 19/10/2006 20:00:22

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

Commentaire de raven44 le 05/01/2007 12:12:20

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.

Commentaire de Thierry_ZT le 11/01/2007 15:25:36

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.

Commentaire de simonlartiste le 11/01/2007 15:29:24

Rajoute ça en debut de code :
header("Content-Type: text/html; charset=iso-8859-15");

Commentaire de Thierry_ZT le 11/01/2007 15:37:14

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 "
    <div align='center'>
     <b>Aucun message présent sur le serveur</b>
<br /><br />
    </div>
";
}
else
{
for($j=1;$j<=$nbmess;$j++)
{
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;
echo "+ ".$sujet."<br>";  
$struct = imap_fetchstructure($mail,$j);
.
.
.
je l'ai placé au mauvais endroit?

Commentaire de simonlartiste le 11/01/2007 15:41:38

met le charset en UTF8 pour voir...

Commentaire de simonlartiste le 11/01/2007 15:43:54

comme ceci : content="text/html; charset=UTF-8"

Commentaire de Thierry_ZT le 11/01/2007 15:49:56

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 "
    <div align='center'>
     <b>Aucun message présent sur le serveur</b>
<br /><br />
    </div>
";
}
else
{
for($j=1;$j<=$nbmess;$j++)
{
$header = imap_headerinfo($mail,$j);
$sujet = $header->subject;
echo "+ ".$sujet."<br>";  
$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 '&nbsp;&nbsp;&nbsp;&nbsp;/'.$nom_fichier.'<br>';
}
}
$piece = imap_base64($piece);
}  
if($nom_fichier!=null)
{
$newfichier = fopen("Fichiers/".$nom_fichier,"w+");
fwrite($newfichier,$piece);
fclose($newfichier);
}
}
}
}
  
?>

Merci à l'avance.

Commentaire de lelapinou_69 le 13/06/2007 10:49:57

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.

Commentaire de godgod le 15/10/2007 08:37:51

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

Commentaire de dylan_salmon le 22/02/2008 10:47:18

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

Commentaire de wam_baloo le 01/07/2008 09:50:14

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.

Commentaire de NONOKH le 16/02/2009 11:56:15

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

Commentaire de DragonicFlash le 19/08/2009 14:36:26 10/10

Exactement ce que je cherchais !  =)  BRAVO !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

recuperer piece jointe d'un mail [ par thelivingdeadgirl ] bonjour !voila j'ai un petit probleme, je n'arrive pas a enregistrer une piece jointe sur le disque en dur mais pourtant, j'arrive a afficher son nom imap append avec pièce jointe [ par raoulman ] Bonjour,Je développe un webmail en php, et j'ai un souci avec imap_append.Quand j'envoie un mail avec une pièce jointe, le mail est bien formaté et ar Erreur dans un formulaire avec pièce jointe [ par vali103 ] Bonjour,J'ai récupéré un script d'enfoi de formulaire avec pièce jointe sur internet que j'ai adapté.Le problème est que si une personne envoi un fich Télécharger un CSV et en Extraire les Infos [ par jdaviaud ] Ben voila mon problème, je cherche à faire un script qui dialogue avec E-gold.com pour ceux qui connaissent.A un moment il me propose donc de téléchar Lire une pièce jointe dans une page php [ par Tikate ] Bonsoir,Je bosse en php.j'envoie un mail &#224; partir d'un formulaire, j'uploade une pi&#232;ce jointe, jusque l&#224; tt va bien. Je r&#233;ceptionn Afficher l'extansionde la pièce jointe , au lieu d'un fichier .tmp [ par azerto00 ] bonjours, j'ai adopté un code .php quipermet d'ajouter une pièce jointe par mail , mais le problème est que le fichier recu porte l'extension .php et Mailto et pièce jointe ! [ par 2swfan ] Bonjour &#224; tous !Est il possible de mettre une pi&#232;ce jointe directement avec un mailto ??Comment peut on faire ??Merci envois mail avec pièce jointe [ par aquacurious ] Bonjour, Je suis en train de faire une interface pour faire du mailing avec pi&#232;ces jointes. Je sauvegarde dans une base de donn&#233;es le sujet, Recevoir les résultats d'un formulaire en pièce jointe csv? [ par sharpeipanam ] Bonjour &#224; tousJe dois faire un formulaire, j'ai trouv&#233; une source qui me conviendra car en php&nbsp;(http://actuel.fr.selfhtml.org/articles/ Email PIèce JOinte [ par arocannes ] Bonjour tout le monde, Je suis actuellement sur un site, qui doit faire un devis (avec photos) et qui dois l'envoyer. Donc mon code PHP, m'envoit bie


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales