8791 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

Je suis actuellement bloqué sur la conception d'un client de messagerie.

J'ai réussi a afficher les informations sur le mail (expéditeur, date, objet, ...), le soucis que j'ai, c'est pour extraire les pièces jointes.

Je m'explique, dans un tableau, où j'ai déjà les informations sur le mail, je doit rajouter une case pour les pièces jointes. Le problème, c'est que je n'arrive pas à récupérer mes pièces jointes (les enregistrer dans un dossier) et mettre dans mon tableau si y a une ou plusieurs pièces jointes faire afficher "OUI" et quand on clique dessus que ça ouvre le(s) pièce(s) jointe(s) et ça les enregistre. Mais je n'arrive pas à les extraire.

Voici le code que j'ai réaliser:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
	<head>
		<title>Liste mail</title>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
		<meta name="description" content="" />
		<meta name="robots" content="all" />
	</head>
	<body>
		<?php
		
		//Fonction qui permet de rechercher selon une adresse mail et un mot de passe les mails correspondant et de les affiicher
		//Affiche, le numero du mail, la date, l'expéditeur et le sujet (lien pour ouvrir le mail).
		//Et les piéces jointes (lien sur le OUI qui permet d'enregistrer sur l'ordinateur et de les visualiser)
		
			function lecture_mail($boite,$serveur_entrant,$port,$protocole,$identifiant,$mot_de_passe)
			{
				$boite = "INBOX";
				$serveur_entrant = "pop3.bee-post.com";
				$port = "110";
				$protocole = "pop3";
				$identifiant = "utilisateur";
				$mot_de_passe = "mpd";
				
				//on ouvre la boite mail
				$mail = imap_open ( "{pop3.bee-post.com:110/pop3}INBOX" , $identifiant , $mot_de_passe );
				
				//Nombre de message dans la boite mail
				$nbmess = imap_num_msg($mail);
				//Recherche et affichage de chaque message
				if($nbmess == 0)
				{
					//Si il n'y a aucun mail
					print"
						<div align='center'>
							<b>Aucun message présent sur le serveur</b>
							<br /><br />
						</div>
					";
				}
				else
				{
					//Si y a au moins un mail
					print"
						<div align='center'>
							<b>Vous avez $nbmess message(s) en attente.</b>
							<br /><br />
						</div>
					";
			?>
			<!-- Tableau qui regroupe les différents éléments qui constitu le mail -->
				<center><table>
					<tr>
						<th width="30px">n°</th>
						<th width="200px">Qui l'as envoyé</th>
						<th width="250px">Date</th>
						<th width="200px">Sujet</th>
						<th width="150px">Piéce(s) jointe(s)</th>
					</tr>
				</table><center>
			<?php
					for($j=1;$j<=$nbmess;$j++)
					{
						//Extraction du sujet du message
						$header = imap_headerinfo($mail,$j);
						//Extraction de la premiére partie du mail
						$from1 = $header->from[0]->mailbox;
						//Extraction de la seconde partie
						$from2 = $header->from[0]->host;
						//Mise en forme du mail de l'expéditeur
						$from = $from1 .'@'. $from2;
						//var_dump ($header->from);
						$date = $header->date;
						$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);
						//}
			?>
			<!-- Affichage des données sur le mail -->
						<form name="mails" action="" method="post">
							<input type="hidden" name="origine" value="">
							<center><table border="1">
								<tr>
									<td width="30px"><?php echo $j; ?></td>
									<td width="200px"><?php echo $from; ?></td>
									<td width="250px"><?php echo $date; ?></td>
									<td width="200px"><p><a href="lire_mail.php?sujet=<?php echo imap_fetchbody($mail, $j, 1); ?>"><?php echo $sujet; ?><a></p></td>
									<td width="150px"><?php echo $nom_fichier; ?></td>
								</tr>
							</table></center>
						</form>
			<?php
					}
					// 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+");
						//Fermeture du fichier
						fclose($newfichier);
					}
				}
				if ($nom_fichier == TRUE)
				{
					echo "OUI";
				}
				else
				{
					echo "NON";
				}
			}
			
			lecture_mail($boite,$serveur_entrant,$port,$protocole,$identifiant,$mot_de_passe);
		?>
		
	</body>
</html>


Si vous avez une petite idée je vous en serrez très reconnaissante.

Miala
Modifié par Miala (30 Dec 2008 - 09:35)
Bonjour,

J'ai peut être trouvé une façon de faire ce que je voulais.

Si ceci fonctionne, je mettrais mon code sur le forum.

Bonne journée à tous.
Bonjour tout le monde,

Comme promis voici les codes que j'ai réalisé pour la gestion des pièces jointes.

Voici le code de base:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
	<head>
		<title>Liste mail</title>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
		<meta name="description" content="" />
		<meta name="robots" content="all" />
	</head>
	<body>
		<?php
		
		//Fonction qui permet de rechercher selon une adresse mail et un mot de passe les mails correspondant et de les affiicher
		//Affiche, le numero du mail, la date, l'expéditeur et le sujet (lien pour ouvrir le mail).
		//Et les piéces jointes (lien sur le OUI qui permet d'enregistrer sur l'ordinateur et de les visualiser)
		
			function lecture_mail($boite,$serveur_entrant,$port,$protocole,$identifiant,$mot_de_passe)
			{
				$boite = "INBOX";
				$serveur_entrant = "pop3.bee-post.com";
				$port = "110";
				$protocole = "pop3";
				$identifiant = "";
				$mot_de_passe = "";
				
				//on ouvre la boite mail
				$mail = imap_open ( "{pop3.bee-post.com:110/pop3}INBOX" , $identifiant , $mot_de_passe );
				
				//Nombre de message dans la boite mail
				$nbmess = imap_num_msg($mail);
				//Recherche et affichage de chaque message
				if($nbmess == 0)
				{
					//Si il n'y a aucun mail
					print"
						<div align='center'>
							<b>Aucun message présent sur le serveur</b>
							<br /><br />
						</div>
					";
				}
				else
				{
					//Si y a au moins un mail
					print"
						<div align='center'>
							<b>Bienvenue sur la consultation de mail $identifiant.</b>
							<br /><br />
							<b>Vous avez $nbmess message(s) en attente.</b>
							<br /><br />
						</div>
					";
			?>
			<!-- Tableau qui regroupe les différents éléments qui constitu le mail -->
				<center><table>
					<tr>
						<th width="30px">n°</th>
						<th width="250px">Qui l'as envoyé</th>
						<th width="280px">Date</th>
						<th width="275px">Sujet</th>
						<th width="200px">Piéce(s) jointe(s)</th>
						<th width="110px">Suppression</th>
					</tr>
				</table><center>
			<?php
					for($j=1;$j<=$nbmess;$j++)
					{
						//Extraction du sujet du message
						$header = imap_headerinfo($mail,$j);
						//Extraction de la premiére partie du mail
						$from1 = $header->from[0]->mailbox;
						//Extraction de la seconde partie
						$from2 = $header->from[0]->host;
						//Mise en forme du mail de l'expéditeur
						$from = $from1 .'@'. $from2;
						//var_dump ($header->from);
						$date = $header->date;
						$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();
						
						$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);

								//Récupération du nom de la pièce jointe
								$param = $part->parameters[0];
								//var_dump ($param);
								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
						if (file_exists ($nom_fichier))
						{
						$newfichier = fopen($nom_fichier.$h,"w+");
						//Fermeture du fichier
						fclose($newfichier);
						}
						
			?>
			<!-- Affichage des données sur le mail -->
						<form name="mails" action="" method="post">
							<input type="hidden" name="origine" value="">
							<center><table border="1">
								<tr>
									<td width="30px"><?php echo $j; ?></td>
									<td width="250px"><?php echo $from; ?></td>
									<td width="280px"><?php echo $date; ?></td>
									<td width="275px"><p><a href="lire_mail.php?mid=<?php echo $j;?>"><?php echo $sujet; ?><a></p></td>
									<td width="200px">
										<?php
											if ($nom_fichier == TRUE)
											{
										?>
												<a href="lecture_pj.php?mid=<?php echo $j;?>"><?php echo "Télécharger la pièce jointe ($nom_fichier)";?></a>
										<?php	
											}
											else
											{
												echo NON;
											}
										?>
									</td>
									<td width="110px">
										<center><table>
											<tr>
												<td>NON</td>
												<td><input type="radio" name="suppression" style="vertical-align:top" value="1" checked="checked" /></td>
											</tr>
											<tr>
												<td>OUI</td>
												<td><input type="radio" name="suppression" style="vertical-align:top" value="1" /></td>
											</tr>
										</table></center>
									</td>
								</tr>
							</table></center>
						</form>
			<?php
					}
					
				}
			?>
				<!-- Tableau qui regroupe les différents éléments qui constitu le mail -->
				<center><table>
					<tr>
						<th width="30px"></th>
						<th width="250px"></th>
						<th width="280px"></th>
						<th width="275px"></th>
						<th width="200px"></th>
						<th width="110px"><input type="submit" value="Supprimer" class="" style="" /></th>
					</tr>
				</table><center>
		<?php

			}
			
			lecture_mail($boite,$serveur_entrant,$port,$protocole,$identifiant,$mot_de_passe);
		?>
		
	</body>
</html>


Et celui-ci pour enregistrer la pièce jointe:
<?php
	$j= $_GET['mid'] ;


	$boite = "INBOX";
	$serveur_entrant = "pop3.bee-post.com";
	$port = "110";
	$protocole = "pop3";
	$identifiant = "";
	$mot_de_passe = "";
				
	//on ouvre la boite mail
	$mail = imap_open ( "{pop3.bee-post.com:110/pop3}INBOX" , $identifiant , $mot_de_passe );
		

	//Extraction du sujet du message
	$header = imap_headerinfo($mail,$j);
	//Extraction de la premiére partie du mail
	$from1 = $header->from[0]->mailbox;
	//Extraction de la seconde partie
	$from2 = $header->from[0]->host;
	//Mise en forme du mail de l'expéditeur
	$from = $from1 .'@'. $from2;
	//var_dump ($header->from);
	$date = $header->date;
	$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();
	
	$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);

			//Récupération du nom de la pièce jointe
			$param = $part->parameters[0];
			//var_dump ($param);
			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+");
	//Fermeture du fichier
	//fclose($newfichier);
	//$newfichier = fopen($nom_fichier.$h,"w+");
	//Fermeture du fichier
	//fclose($newfichier);


	header("Content-disposition: attachment; filename=".$nom_fichier);
	//header("Content-Type: application/msword");
	header("Content-Transfer-Encoding: binary");
	//header("Content-Length: ".filesize($nom_fichier));
	//header("Pragma: no-cache");
	//header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
	//header("Expires: 0");
	set_time_limit(120);
	//readfile($nom_fichier);
	echo imap_base64(imap_fetchbody($mail,$j,$h));


	
?>


Voilà, j'espère que ce code pourras servir.
Par contre j'ai une autre question (elle est un peut nulle d'ailleur).

J'ai un tableau où j'ai mis toutes les informations du mail et des bouton radio ('OUI' et 'NON') pour permettre de le supprimer, à la fin du tableau, j'ai ajouté un bouton supprimer.

Je n'arrive pas à supprimer la ligne que je sélectionne en choisissant 'OUI'.
Le code est celui de base que j'ai mis dans mon précédent message.

Si vous avez un petit code pour m'aider, je vous en serais trés reconnaissante.

Bonne journée.