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

Soyez le premier à donner votre avis sur cette source.

Vue 47 596 fois - Téléchargée 1 631 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

Messages postés
2
Date d'inscription
mardi 24 août 2010
Statut
Membre
Dernière intervention
24 août 2010

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 {
Messages postés
2
Date d'inscription
mardi 24 août 2010
Statut
Membre
Dernière intervention
24 août 2010

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.
Messages postés
1
Date d'inscription
mercredi 2 juin 2010
Statut
Membre
Dernière intervention
28 juin 2010

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);
}
}
}
}
Messages postés
20
Date d'inscription
dimanche 22 juin 2003
Statut
Membre
Dernière intervention
31 octobre 2006

Exactement ce que je cherchais ! =) BRAVO !
Messages postés
2
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
16 février 2009

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.