Extraire une pièce jointe après réception d'email

Soyez le premier à donner votre avis sur cette source.

Vue 51 011 fois - Téléchargée 1 716 fois

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 / Exemple :


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

Codes Sources

A voir également

Ajouter un commentaire Commentaires
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....!
Afficher les 29 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.