Page 1 sur 1

Envoie piece jointe mail

Posté : 28 déc. 2011, 16:29
par fab-6z
Bonjour,

Je viens exposer mon problème ici après 2 semaine de recherche ou j'en deviens désespéré. J'ai crée un formulaire html et fait en sorte qu'il soit directement envoyé à mon adresse mail des qu'une personne appuie sur envoyer, j'ai voulu rajouter un bouton parcourir afin que la personne puisse ajouter n'importe quel fichier, mais je voudrais que ce fichier soit envoyé directement à l'adresse mail (sur outlook) en meme temps que le formulaire, sans devoir uploader le fichier sur un serveur. Je ne sais pas si je me suis bien fait comprendre. Voici ce que j'ai pu trouver comme script qui m'envoie bien un fichier avec un nom commencant par ATT******.txt mais avec rien dedans.

$boundary = md5(uniqid(microtime(), TRUE));


$headers = 'Mime-Version: 1.0'."\r\n";
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
$headers .= "\r\n";

$msg = 'Texte affiché par des clients mail ne supportant pas le type MIME.'."\r\n";
$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type: text/html; charset=ISO-8859-1'."\r\n";
$msg .= 'Mon formulaire en html'."\r\n";

$file_name = $_FILES['send_fic']['name'];

if (file_exists($file_name))
{
$file_type = filetype($file_name);
$file_size = filesize($file_name);

$handle = fopen($file_name, 'r') or die('File '.$file_name.'can t be open');
$content = fread($handle, $file_size);
$content = chunk_split(base64_encode($content));
$f = fclose($handle);

$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
$msg .= 'Content-transfer-encoding:base64'."\r\n";
$msg .= $content."\r\n";
}

$msg .= '--'.$boundary."\r\n";




if(!mail('mon_email',$_POST['intitule_des_problemes'], $msg, $headers))
{echo "ERROR";}
else { echo "Mail bien envoyé";}

Re: Envoie piece jointe mail

Posté : 29 déc. 2011, 14:23
par moogli
mais je voudrais que ce fichier soit envoyé directement à l'adresse mail (sur outlook) en meme temps que le formulaire, sans devoir uploader le fichier sur un serveur
ce n'est pas possible, php ne fonctionne que sur le serveur.

Pour ce qui est de ton problème c'est parce que tu n'utilise pas le bon index du tableaux $_FILES.
il faut utiliser le fichier temporaire et non le nom du fichier. la ton script échoue sur le if car le fichier n'existe pas.
donc
<?php
$boundary = md5(uniqid(microtime(), TRUE));
 $headers = 'Mime-Version: 1.0'."\r\n";
 $headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
 $headers .= "\r\n";

 $msg = 'Texte affiché par des clients mail ne supportant pas le type MIME.'."\r\n"; 
 $msg .= '--'.$boundary."\r\n";
 $msg .= 'Content-type: text/html; charset=ISO-8859-1'."\r\n";
 $msg .= 'Mon formulaire en html'."\r\n";

$file_name = $_FILES['send_fic']['tmp_name'];

if (file_exists($file_name))
{
 $file_type = filetype($file_name);
 $file_size = filesize($file_name);

 $handle = fopen($file_name, 'r') or die('File '.$file_name.'can t be open');
 $content = fread($handle, $file_size);
 $content = chunk_split(base64_encode($content));
 $f = fclose($handle);

 $msg .= '--'.$boundary."\r\n";
 $msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
 $msg .= 'Content-transfer-encoding:base64'."\r\n";
 $msg .= $content."\r\n";
}

$msg .= '--'.$boundary."\r\n";
tu peux remplacer l'ouverture / fermeture du fichier par file_get_contents

par exemple
<?php
$boundary = md5(uniqid(microtime(), TRUE));
 $headers = 'Mime-Version: 1.0'."\r\n";
 $headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
 $headers .= "\r\n";

 $msg = 'Texte affiché par des clients mail ne supportant pas le type MIME.'."\r\n"; 
 $msg .= '--'.$boundary."\r\n";
 $msg .= 'Content-type: text/html; charset=ISO-8859-1'."\r\n";
 $msg .= 'Mon formulaire en html'."\r\n";

$file_name = $_FILES['send_fic']['tmp_name'];

if (file_exists($file_name))
{
 $file_type = filetype($file_name);
 $file_size = filesize($file_name);
 $content = chunk_split(base64_encode(file_get_contents($file_name)));

 $msg .= '--'.$boundary."\r\n";
 $msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
 $msg .= 'Content-transfer-encoding:base64'."\r\n";
 $msg .= $content."\r\n";
}
$msg .= '--'.$boundary."\r\n";
@+

Re: Envoie piece jointe mail

Posté : 29 déc. 2011, 15:19
par fab-6z
J'ai réussi a trouver une solution.
<?php
$boundary = md5(uniqid(microtime(), TRUE));
$headers = 'Mime-Version: 1.0'."\r\n";
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
$headers .= "\r\n";

$msg = 'Texte affiché par des clients mail ne supportant pas le type MIME.'."\r\n"; 
$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type: text/html; charset=ISO-8859-1'."\r\n";
$msg .= 'Mon formulaire en html'."\r\n";

$msg .= '--'.$boundary."\r\n";

if (isset($_FILES['send_fic']) AND $_FILES['send_fic']['error'] == 0)  
{  
 
if ($_FILES['send_fic']['size'] <= 1000000)  
{  
 
$infosfichier = pathinfo($_FILES['send_fic']['name']);   
{  
 
move_uploaded_file($_FILES['send_fic']['tmp_name'], './' . basename($_FILES['send_fic']['name'])); 
                  echo "L'envoi a bien été effectué !"; 
                  
}  
}  
}  

$file_name = $_FILES['send_fic']['name'];
if (file_exists($file_name))
{
echo ($file_name);
	$file_type = filetype($file_name);
	$file_size = filesize($file_name);

	$content = chunk_split(base64_encode(file_get_contents($file_name)))."\n";

	$msg .= '--'.$boundary."\r\n";
	$msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
	$msg .= 'Content-transfer-encoding:base64'."\r\n";
	$msg .= "Content-Disposition: attachment; filename=\"$file_name\"\n\n"; 
	$msg .= $content."\r\n";
}


	if(!mail('Mon_mail',$_POST['intitule_des_problemes'], $msg, $headers))
			{echo "ERROR";} 
			else { echo "Mail bien envoyé";}
ça marche nikel! Les fichiers se telechargent dans le dossier www puis s'envoie ensuite à l'email. L'inconveniant est qu'ils se mettent dans le repertoire www, hors si je veux les mettre dans un sous-dossier comme "uploads", je ne recois plus rien. Je ne sais pas comment changer ce bout de code afin de faire en sorte qu'il aille chercher directement dans le dossier uploads et non à la racine www.
$file_name = $_FILES['send_fic']['name'];

Re: Envoie piece jointe mail

Posté : 29 déc. 2011, 16:45
par Mazarini
Le fichier va la ou tu le mets :
move_uploaded_file($_FILES['send_fic']['tmp_name'], './' . basename($_FILES['send_fic']['name']));
Si tu remplaces './' par un autres répertoire, tu le mettras ailleurs. Au passage, il est bien de déposer les fichiers en dehors de l'arborescence du site et de vérifier l'extension. Le danger serait de charger un fichier .php avec un code malveillant que la personne peut exécuter depuis son navigateur

Re: Envoie piece jointe mail

Posté : 29 déc. 2011, 18:36
par fab-6z
Je sais Mazarini que je peux changer le dossier, le problème c'est plutot la
$file_name = $_FILES['send_fic']['name'];
le code va aller chercher un fichier à la racine qui ne sera pas telechargé, donc il faudrait que je sache comment faire pour faire en sorte que les fichiers ne soient pas pris à la racine, quelque chose du style
$file_name = 'uploads/' $_FILES['send_fic']['name'];
Sauf que ça ne marche pas :mrgreen:

Re: Envoie piece jointe mail

Posté : 29 déc. 2011, 19:09
par AB
J'ai réussi a trouver une solution.

ça marche nikel! Les fichiers se telechargent dans le dossier www puis s'envoie ensuite à l'email. L'inconveniant est qu'ils se mettent dans le repertoire www, hors si je veux les mettre dans un sous-dossier comme "uploads", je ne recois plus rien.
Tu as changé d'avis ? Au départ tu disais ne pas vouloir les télécharger sur le serveur... et dans ce cas moogli t'avais donné la solution. J'aurai juste fais un peu différemment mais le principe reste le même
if (isset($_FILES['send_fic']['tmp_name']) && is_uploaded_file($_FILES['send_fic']['tmp_name']))
	{
           $file_name = filetype($_FILES['send_fic']['name']);

           $file_type = filetype($_FILES['send_fic']['tmp_name']);
           $file_size = filesize($_FILES['send_fic']['tmp_name']);
           $content = chunk_split(base64_encode(file_get_contents($_FILES['send_fic']['tmp_name'])));

$msg .= '--'.$boundary."\r\n";
        $msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
        $msg .= 'Content-transfer-encoding:base64'."\r\n";
        $msg .= "Content-Disposition: attachment; filename=\"$file_name\"\n\n";
        $msg .= $content."\r\n";


	   @unlink($_FILES['userfile']['tmp_name']);

	//...
        }
Oui enfin pour te dire qu'on a pas besoin d'utiliser "move_uploaded_file" si l'on ne souhaite pas garder le fichier sur le serveur. On utilise simplement le fichier temporaire (du répertoire temporaire) que l'on efface juste après pour libérer l'espace.

Re: Envoie piece jointe mail

Posté : 30 déc. 2011, 10:32
par fab-6z
Oui j'ai changer d'avis étant donner que l'on est obliger de telecharger le fichier vu qu'on est dans du php comme l'a dis moogli. J'avais trouver une solution afin de faire en sorte que le fichier soit telechargé, puis envoyé par mail, puis ensuite supprimer automatiquement, sa reprend un peu ton code AB.
if (isset($_FILES['send_fic']) AND $_FILES['send_fic']['error'] == 0)  
{  
 
if ($_FILES['send_fic']['size'] <= 1000000)  
{  
 
$infosfichier = pathinfo($_FILES['send_fic']['name']);   
{  
 
move_uploaded_file($_FILES['send_fic']['tmp_name'], './' . basename($_FILES['send_fic']['name'])); 
                  echo ""; 
                  
}  
}  
}  

$file_name = $_FILES['send_fic']['name'];
if (file_exists($file_name))
{
	$file_type = filetype($file_name);
	$file_size = filesize($file_name);

	$content = chunk_split(base64_encode(file_get_contents($file_name)))."\n";

	$msg .= '--'.$boundary."\r\n";
	$msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
	$msg .= 'Content-transfer-encoding:base64'."\r\n";
	$msg .= "Content-Disposition: attachment; filename=\"$file_name\"\n\n"; 
	$msg .= $content."\r\n";
	unlink($file_name);
}
Sa marche nikel :)

Re: Envoie piece jointe mail

Posté : 30 déc. 2011, 21:21
par AB
Oui j'ai changer d'avis étant donner que l'on est obliger de telecharger le fichier vu qu'on est dans du php comme l'a dis moogli. J'avais trouver une solution afin de faire en sorte que le fichier soit telechargé, puis envoyé par mail, puis ensuite supprimer automatiquement, sa reprend un peu ton code AB.
Oui mais apparemment tu n'as toujours pas compris comment ça fonctionne puisque tu utilises toujours "move_uploaded_file" et que je viens de te dire qu'il n'y en a pas besoin.

1/ Quand le visiteur clique sur "envoyer", le formulaire est envoyé au serveur en incluant le contenu des champs du formulaire (textes + fichiers).

2/ Quand le serveur reçois le formulaire, si celui-ci contient des fichiers alors automatiquement ils sont téléchargés sur le serveur dans un répertoire temporaire et disponibles via les variables $_FILES, les champs textes étant accessibles via les variables $_POST, et tout cela INDEPENDAMMENT DU CODE PHP QUI SERA EXECUTE A LA SUITE.

On utilise ensuite "move_uploaded_file" si besoin pour DEPLACER les fichiers présents dans le répertoire temporaire vers un autre répertoire du serveur uniquement si l'on souhaite les garder quelque part sur le serveur.
Dans un code d'envoi de mail avec fichiers joints on utilise pas cette fonction puisque précisément on a pas besoin de les garder sur le serveur - ni envie à cause des virus et autres bestioles qu'ils pourraient contenir. On prend donc le fichier depuis le répertoire temporaire et on le joint au mail.

En utilisant cette méthode on a la meilleure sécurité puisque les fichiers temporaires sont automatiquement effacés à la fin du script.

Dans ton code, non seulement "move_uploaded_file" ne sert à rien mais en plus, comme tu as déplacé le fichier en dehors du répertoire temporaire, son effacement ne dépend plus que de l'exécution de la fonction unlink avec aucune sécurité si ton script, pour une raison ou pour une autre, était interrompu avant ou si unlink renvoyait une erreur... En bref tu rends ton code plus lourd et finalement moins sécurisé.

Re: Envoie piece jointe mail

Posté : 30 déc. 2011, 23:58
par fab-6z
J'avais essayé le code de moogli, hors il me mettait une erreur et je ne recevais qu'un fichier ATT*****.txt avec un autre fichier avec en extension .bmp
J'ai mis par la suite une sécurité afin que certains type de fichiers ne soient pas autorisés à être envoyé. Maintenant ce formulaire ne restera qu'en local et sera utilisé seulement par des personnes fiables. Donc on va dire que tant que sa marche c'est plutôt cool :)
Merci tout de même.