Forums Zebulon.fr: PHP Formulaire mail avec pièce jointe ne fonctionne pas - Forums Zebulon.fr

Aller au contenu

PHP Formulaire mail avec pièce jointe ne fonctionne pas Noter : -----

#1 L'utilisateur est hors-ligne   Icesik 

  • Junior Member
  • Groupe : Membres
  • Messages : 3
  • Inscrit(e) : 05-février 07

Posté 05 février 2007 - 09:29

Bonjour a tous! j'ai mis du temps a me décider a venir sur un forum pour cette histoire de formulaire, mais bon, vu que je débute dans le php, ben j'ai du mal a m'en sortir seul... donc me voilà!
J'ai passé 2aprèmes entieres a chercher du code qui créerait un formulaire qui m'enverrait le contenu d'une zone texte, et une pièce jointe.
Or, j'ai réussi a ce que l'envoi du mail se fasse, mais la pièce jointe bloque...
D'un coté, j'ai le formulaire et son php qui envoie correctement le mail (avec message) et de l'autre coté, j'ai un autre formulaire et son php qui envoie un tas d'info mais surtout une pièce jointe, et ca marche.

J'ai essayé d'integrer pas a pas la mise en forme de mon propre formulaire dans celui qui fonctionne avec la pièce jointe, mais rien a en tirer... J'ai fait des centaines de tests pour reperer d'ou venaient les erreurs, et je suis tombé sur des constatation désolantes... Exemple : quand je déclare un champ du formulaire en type="hidden", le mail ne s'envoie plus... Donc, vous restez mon seul espoir!
Je précise que j'ai créer mon formulaire perso avec Dreamweaver 8.

Je suis conscient qu'il y a surement du code inutile dans tout mon charabia mais j'ai préféré ne pas enlever des trucs qui pourraient être vital...

Voici le formulaire de mon mail qui marche answer.php :
(Désolé de mettre la déclaration de chaque calque, mais je préfère ne rien laisser au hasard...)

Citation

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Answer By Tiss</title>
<style type="text/css">
<!--
textarea {
color:white;
font-family:cruiser;
font-size:18px;
padding:1cm;
}
body,td,th {
font-family: Impact;
font-size: 24px;
color: #FFFFFF;
background-image: url(berserk.jpg);
}
body {
background-color: #000000;
background-image: url();
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
#Layer1 {
position:absolute;
width:200px;
height:115px;
z-index:1;
left: 203px;
top: 89px;
}
#Layer2 {
position:absolute;
width:477px;
height:528px;
z-index:2;
left: 20px;
top: 63px;
visibility: visible;
}
#Layer3 {
position:absolute;
width:200px;
height:115px;
z-index:1;
left: 17px;
top: 84px;
visibility: visible;
}
-->
</style>
<script type="text/javascript">
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->
</script>
</head>

<body>

<div id="Layer2">

<form method="post" action="mail.php">

<p>
<input type="hidden" name="votremail" value="NomFixeDeLExpediteur@aol.com"/>

<!-- Valeur par défaut de l'objet du mail -->
<input type="hidden" name="objet" value="Le Tiss a répondu!" />
</p>

<p>
<textarea cols="54" rows="16" style="background-image: url(berserk.jpg)" name="message"></textarea>
</p>
<p>
<input name="attach" type="file" size="16" maxlength="5000000"/>
</p>

<p>
<input type="submit" value="Envoyer" />
</p>

</form>

</div>
</div>
<div id="Layer3">
<center>
<table width="1024" height="768" border="3" bordercolor="#FFFFFF">
<tr>
<td width="954" height="70">&nbsp;</td>
</tr>
</table>
</center>
</div>
</body>
</html>
Et son morceau de PHP mail.php

Citation

<?php
// La variable $verif, va nous permettre d'analyser si la sémantique de l'email est bonne
$verif="!^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-zA-Z]{2,4}$!";

// On assigne et protége nos variables
$votremail=$_POST["votremail"];
$from=htmlentities("From: ".$votremail);
$message=stripslashes(htmlentities($_POST["message"]));

// On met ici notre email
$destinataire="MonNom@aol.com";

/* On place le sujet du message qui ici sera toujours le même
puisque dans la partie Html on l'a mis en caché grace au type="hidden":P avec comme valeur "Vous avez un nouveau message" */
$objet=$_POST['objet'];

// C'est bon on est OK, vérifions si l'email est valide, grâce à notre sympathique REGEX
if(!preg_match($verif,$votremail))
{
echo "Votre email n'est pas valide";
}

// On verifie si il y a un message
elseif (trim($message)=="")
{
echo "Y'en a marre des messages vides !";
}

// Si tout est OK on envoie l'email
else
{
mail($destinataire,$objet,$message,$from);
header("Location: http://nomdedomaine.ifrance.com");
}

?>


Et voici le formulaire glané sur le net contact.php :

Citation

<form method=POST action="formmail.php" enctype="multipart/form-data">
Adresse : <br><input name="adresse" size=40 value=""><br>
CC : <br><input name="cc" size=40 value=""><br>
BCC : <br><input name="bcc" size=40 value=""><br>
Sujet : <br><input name="subject" size=40 value=""><br>
Message : <br>
<Textarea name="msg" cols=40 rows=10 WRAP=HARD>
</TextArea><br>
Fichiers : <br>
<input type=file size=40 name="attach"><br><br>
<center><input type=submit value="Envoyer"></center>
<input type=hidden name="message" value=1>
</form>
Ainsi que son morceau de PHP formmail.php :

Citation

<?
$headers = "From: Votre Nom <monnom@mondomaine.com>\n";
$headers .= "X-Sender: <monnom@mondomaine.com>\n";
$headers .= "X-Mailer: PHP\n";
$headers .= "X-Priority: 3\n";
$headers .= "Return-Path: <monnom@mondomaine.com>\n";
$headers .= "cc:".$cc."\n";
$headers .= "bcc:".$bcc."\n";
if (is_uploaded_file($attach)) {
$file = fopen($attach, "r");
$contents = fread($file, $attach_size);
$encoded_attach = chunk_split(base64_encode($contents));
fclose($file);

$headers .= "MIME-version: 1.0\n";
$headers .= "Content-type: multipart/mixed; ";
$headers .= "boundary=\"Message-Boundary\"\n";
$headers .= "Content-transfer-encoding: 7BIT\n";

$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/plain; charset=US-ASCII\n";
$body_top .= "Content-transfer-encoding: 7BIT\n";
$body_top .= "Content-description: Mail message body\n\n";

$msg_cpl = $body_top.stripslashes($msg);

$msg_cpl .= "\n\n--Message-Boundary\n";
$msg_cpl .= "Content-type: $attach_type; name=\"$attach_name\"\n";
$msg_cpl .= "Content-Transfer-Encoding: BASE64\n";
$msg_cpl .= "Content-disposition: attachment; filename=\"$attach_name\"\n\n";
$msg_cpl .= "$encoded_attach\n";
$msg_cpl .= "--Message-Boundary--\n";
}
if (mail ("$adresse","".stripslashes($subject)."","$msg_cpl",$headers)) {
echo ("<center><font color=green>Mail envoyé</font></center>");
}
?>


Et pour finir, voila ce que j'ai essayé d'en faire pour concilier les 2, histoire que ca vous donne une idée de ce que je veux réaliser a la fin, si je n'ai pas été très clair...

J'ai utilisé mon formulaire perso answer.php posté plus haut et voici le morceau de php correspondant :

Citation

<?php
// La variable $verif, va nous permettre d'analyser si la sémantique de l'email est bonne
$verif="!^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-zA-Z]{2,4}$!";

// On assigne et protége nos variables
$votremail=$_POST["votremail"];
$from=htmlentities("From: ".$votremail);
$message=stripslashes(htmlentities($_POST["message"]));

// On met ici notre email
$destinataire="MonNom@aol.com";

/* On place le sujet du message qui ici sera toujours le même
puisque dans la partie Html on l'a mis en caché grace au type="hidden":P avec comme valeur "Vous avez un nouveau message" */
$objet=$_POST['objet'];

if (!is_uploaded_file($attach))
{
mail($destinataire,$objet,$message,$from);
header("Location: http://NomDeDomaine.ifrance.com");
}

elseif (is_uploaded_file($attach)) {
$file = fopen($attach, "r");
$contents = fread($file, $attach_size);
$encoded_attach = chunk_split(base64_encode($contents));
fclose($file);

$headers .= "MIME-version: 1.0\n";
$headers .= "Content-type: multipart/mixed; ";
$headers .= "boundary=\"Message-Boundary\"\n";
$headers .= "Content-transfer-encoding: 7BIT\n";

$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/plain; charset=US-ASCII\n";
$body_top .= "Content-transfer-encoding: 7BIT\n";
$body_top .= "Content-description: Mail message body\n\n";

$msg_cpl = stripslashes($message);

$msg_cpl .= "\n\n--Message-Boundary\n";
$msg_cpl .= "Content-type: $attach_type; name=\"$attach_name\"\n";
$msg_cpl .= "Content-Transfer-Encoding: BASE64\n";
$msg_cpl .= "Content-disposition: attachment; filename=\"$attach_name\"\n\n";
$msg_cpl .= "$encoded_attach\n";
$msg_cpl .= "--Message-Boundary--\n";
}
if (mail ($destinataire,$objet,$msg_cpl,$headers)) {
echo ("<center><font color=green>Mail envoyé</font></center>");
}

// C'est bon on est OK, vérifions si l'email est valide, grâce à notre sympathique REGEX
elseif(!preg_match($verif,$votremail))
{
echo "Votre email n'est pas valide";
}

// On verifie si il y a un message
elseif (trim($message)=="")
{
echo "Y'en a marre des messages vides !";
}

?>


Merci par avance!
0

PUBLICITÉ

  • Annonces Google

#2 L'utilisateur est hors-ligne   ricou33 

  • Extrem Member
  • Groupe : Membres
  • Messages : 747
  • Inscrit(e) : 09-octobre 04

Posté 06 février 2007 - 12:43

Salut,

Je débute aussi mais j'ai tout de même regardé ton code et il y a certaines choses que je ne comprends pas.
1- pourquoi mettre les champs hidden et comment récupères-tu le mail de l'expéditeur ?
2- Le dernier code est la page d'envoi du mail avec pièce jointe, en rapport avec le premier code inscrit ? Parce qu'ils n'ont rien à voir, les noms des cases ne correspondent pas.
3- Les 4 premiers codes sont clair mais le dernier est un peu fouillis, je pense qu'il y a quelques petites choses à revoir, surtout dans les conditions
4- Que veux-tu réellement faire ? Avoir un formulaire avec des données à rentrer et la possibilité d'envoyer un fichier ? Si c'est ça, pourrais-tu mettre le code html et le php que tu souhaites au final stp, et éventuellement l'uploadé afin d'avoir un aperçu du rendu souhaité, c'est plus facile à comprendre.
5- Si ce n'est déjà fait, tu peux jeter un oeil à ce topic juste en dessous qui traite également de l'envoi de mail par php.
Mon site web en création : http://citations.ovh.org/ et mes animaux de compagnie.
Il ne faut jamais retenir un pet, il grossit, se compresse puis remonte par la colonne vertébrale jusqu'au cerveau et c'est comme ça que naissent des idées de MERDE.
La théorie, c'est quand on comprend, mais que ça ne marche pas. La pratique, c'est quand ça marche, mais qu'on ne comprend pas. Et généralement, théorie et pratique se rejoignent en un point commun, ça ne marche pas et on n'y comprend rien. ©itation Phantomique 2006 - suivre JVRAD
0

#3 L'utilisateur est hors-ligne   Icesik 

  • Junior Member
  • Groupe : Membres
  • Messages : 3
  • Inscrit(e) : 05-février 07

Posté 06 février 2007 - 11:18

1/ Le champ hidden me permet de déclarer qui est l'expediteur de mon formulaire, car il s'agit toujours de la meme personne.
J'aurais pu le déclarer dans le code php concernant l'envoi du mail, mais j'étais pas sur de le faire comme il fallait, donc j'ai gardé cette solution qui fonctionne bien!
2/ Je m'y perd également... C'est pas vraiment évident, mais y'a tout un tas d'opérations qui sont faites pour l'encodage de la pièce jointe, le decompressage... donc je m'y perd, mais le code a fait ses preuves au niveau du contenu du mail, a part la piece jointe, mais si je trouvais plus simple, ca me plairait davantage, c'est sur!
3/C'est clair que le mélange des conditions des 2 codes php, ca m'a pas l'air de trop bien collé, mais encore une fois, j'ai avisé pour faire au mieux. Ces conditions me permettent d'arriver au résultat final, soit la redirection vers une certaine page après l'envoi du formulaire, donc les conditions ont l'air de tourner plutot rond, mais vu que le resultat n'est pas celui escompté, je te confirme qu'il y a des choses a revoir, mais j'ai fait mon possible sur ce bout de code, et c'est pour ca que j'ai besoin d'aides experimentées!
4/En fait, j'écris quotidiennement sur une page a quelqu'un, cette personne pourrait me répondre via ce formulaire avec la possibilité d'ajouter une pièce jointe (voir plusieurs, mais dans un premier temps, on va pas forcer!). Donc en variable, on a uniquement le textarea du message, et la pièce jointe s'il y en a une.
Le formulaire final que je souhaiterais, c'est la page answer.php que j'ai posté tout en haut de mon 1er message. Pour le php, ben j'suis dans l'incapacité de te donner ce que je souhaiterais avoir... Mais vu que tu sais ce qu'est mon projet, tu seras surement plus avancé...?
5/Je vais tacher de trouver des infos sur le topic!
0

#4 L'utilisateur est hors-ligne   ricou33 

  • Extrem Member
  • Groupe : Membres
  • Messages : 747
  • Inscrit(e) : 09-octobre 04

Posté 07 février 2007 - 12:52

Donc en considérant que ce code que tu as fait vérifie s'il y a une pièce jointe et l'envoi si c'est le cas et qu'il fonctionne car c'est au-delà de mes compétences :
if (is_uploaded_file($attach)) {
$file = fopen($attach, "r");
$contents = fread($file, $attach_size);
$encoded_attach = chunk_split(base64_encode($contents));
fclose($file);

$headers .= "MIME-version: 1.0\n";
$headers .= "Content-type: multipart/mixed; ";
$headers .= "boundary=\"Message-Boundary\"\n";
$headers .= "Content-transfer-encoding: 7BIT\n";

$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/plain; charset=US-ASCII\n";
$body_top .= "Content-transfer-encoding: 7BIT\n";
$body_top .= "Content-description: Mail message body\n\n";

$msg_cpl = stripslashes($message);

$msg_cpl .= "\n\n--Message-Boundary\n";
$msg_cpl .= "Content-type: $attach_type; name=\"$attach_name\"\n";
$msg_cpl .= "Content-Transfer-Encoding: BASE64\n";
$msg_cpl .= "Content-disposition: attachment; filename=\"$attach_name\"\n\n";
$msg_cpl .= "$encoded_attach\n";
$msg_cpl .= "--Message-Boundary--\n";
}



Le mail de l'expéditeur sera-t-il toujours le même ? Ici j'ai considéré que dans le formulaire il y avait un champ qui permet au visiteur d'inscrire son mail qui servira en mail d'expéditeur, si tu n'en as pas besoin il faudra revoir certaine petites choses, j'ai fait comme cela car j'ai repris pas mal de choses de ton code.
Le formulaire renvoi les variables $_POST pour le mail : ['votremail'] et pour le textarea : ['message'] et en remplissant les variables $destinataire et $objet en haut de la page php, je verrais bien quelque chose dans ce genre :
<?
if (isset($_POST['votremail'])) AND ($_POST['votremail'] != "") //Si un mail a été posté
{
	$destinataire = "" //A compléter
	$objet = "" //A compléter
	
	if ($_POST['message'] != NULL) //Si le textarea contient un message
	{
		$message=stripslashes(htmlentities($_POST["message"])); //On créé une variable $message protégée
	}
	else
	{
		$message = "Aucun message n'a été envoyé dans ce mail"; //Phrase envoyée dans le mail si le textarea est vide (possible de la modifier)
	}
	if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail'])) //Si le mail est valide
	{
	   	if (is_uploaded_file($attach)) //S'il y a une pièce jointe (reprise de ton code)
		{
			$file = fopen($attach, "r");
			$contents = fread($file, $attach_size);
			$encoded_attach = chunk_split(base64_encode($contents));
			fclose($file);

			$headers .= "MIME-version: 1.0\n";
			$headers .= "Content-type: multipart/mixed; ";
			$headers .= "boundary=\"Message-Boundary\"\n";
			$headers .= "Content-transfer-encoding: 7BIT\n";

			$body_top = "--Message-Boundary\n";
			$body_top .= "Content-type: text/plain; charset=US-ASCII\n";
			$body_top .= "Content-transfer-encoding: 7BIT\n";
			$body_top .= "Content-description: Mail message body\n\n";

			$msg_cpl = stripslashes($message);

			$msg_cpl .= "\n\n--Message-Boundary\n";
			$msg_cpl .= "Content-type: $attach_type; name=\"$attach_name\"\n";
			$msg_cpl .= "Content-Transfer-Encoding: BASE64\n";
			$msg_cpl .= "Content-disposition: attachment; filename=\"$attach_name\"\n\n";
			$msg_cpl .= "$encoded_attach\n";
			$msg_cpl .= "--Message-Boundary--\n";
			
			mail ($destinataire,$objet,$msg_cpl,$votremail) //Il faut créer les variables plus haut avec les valeurs nécessaires
			echo ("<center><font color=green>Mail envoyé</font></center>"); //Ceci n'est pas du xhtml strict, mais si ça fonctionne comme ça après c'est du détail à modifier
		}
		else //s'il n'y a pas de pièce jointe, seul le message est envoyé
		{
			 mail ($destinataire,$objet,$message,$votremail) //Il faut créer les variables plus haut avec les valeurs nécessaires
			echo ("<center><font color=green>Mail envoyé</font></center>");
		}
	}
	else //Si le mail n'est pas valide
	{
		echo "Votre email n'est pas valide";
	}
}
else //S'il n'y a pas eu de mail posté
{
	echo "Y'en a marre des messages vides !";
}
?>


Je ne peux pas essayer le code et je ne te promets pas qu'il fonctionne. Je te conseille de le regarder, d'essayer de comprendre ce que j'ai fait (j'ai mis des commentaires), de voir si cela correspond à ce que tu recherches, de vérifier si je n'ai rien oublié et de corriger mes erreurs éventuelles.
N'oublie de me dire ce qu'il en est. :P

Ce message a été modifié par ricou33 - 07 février 2007 - 01:06 .

Mon site web en création : http://citations.ovh.org/ et mes animaux de compagnie.
Il ne faut jamais retenir un pet, il grossit, se compresse puis remonte par la colonne vertébrale jusqu'au cerveau et c'est comme ça que naissent des idées de MERDE.
La théorie, c'est quand on comprend, mais que ça ne marche pas. La pratique, c'est quand ça marche, mais qu'on ne comprend pas. Et généralement, théorie et pratique se rejoignent en un point commun, ça ne marche pas et on n'y comprend rien. ©itation Phantomique 2006 - suivre JVRAD
0

#5 L'utilisateur est hors-ligne   Icesik 

  • Junior Member
  • Groupe : Membres
  • Messages : 3
  • Inscrit(e) : 05-février 07

Posté 08 février 2007 - 11:39

J'avais demandé de l'aide sur un autre forum, et on m'a proposé une solution qui fonctionne, alors je tiens a la faire partager pour tout
ceux qui pourraient galerer comme je l'ai fait...

En tout cas, un grand merci a vous qui avez pris la peine de m'aider pour trouver une solution!!! :P

<?php
Require_once('class.phpmailer.php');
 
if(isset($_POST['destinataire'])){
 
  set_time_limit(0);
  if(is_uploaded_file($_FILES['attach']['tmp_name'])){
	$mail = new PHPmailer();
	$mail->IsHTML();
	$mail->From='expediteur';
	$mail->AddAddress($_POST['destinataire']);
	$mail->AddReplyTo('expediteur');	
	$mail->Subject=$_POST['subject'];
	$mail->Body=htmlentities($_POST['message']);
	$mail->AddAttachment($_FILES['attach']['tmp_name']);
	if(!$mail->Send())
	  echo $mail->ErrorInfo; else
	  header("Location: http://*****.com");
	unset($mail);
  }elseif(!empty($destinataire)){
	  $mail = new PHPmailer();
	$mail->IsHTML();
	$mail->From='expediteur';
	$mail->AddAddress($_POST['destinataire']);
	$mail->AddReplyTo('expediteur');	
	$mail->Subject=$_POST['subject'];
	$mail->Body=htmlentities($_POST['message']);
	if(!$mail->Send())
	  echo $mail->ErrorInfo; else
	  echo 'Mail envoyé avec succès';
	unset($mail);
	}
  
}
?>
 
<form method="post" action="" enctype="multipart/form-data">
  <input  type="text" name="expediteur" value=""/><br/>
  <input  type="text" name="destinataire" value=""/><br/>
  <input type="text" name="subject" value=""/><br/>
  <textarea cols="54" rows="16" name="message"></textarea><br/>
  <input name="attach" type="file"/>
  <input type="hidden" name="MAX_FILE_SIZE" value="2000000"/><br/> 
  <input type="submit" value="Envoyer"/><br/>
</form>

0



Réponse rapide

  

Similar Topics
  Sujet Commencé par Statistiques Infos sur le dernier message
Sujet ouvert (nouvelles réponses) Comment fonctionne AllChars ?
Existe-t-il un tuto ou une doc, SVP
Patrick St P. Bosguerard 
  • 9 réponses
  • 173 vues
Sujet ouvert (nouvelles réponses) Ma Webcam ne fonctionne plus
Je cherche de l'aide
alaly 
  • 1 réponses
  • 118 vues
Sujet ouvert (nouvelles réponses) Webcam intégrée ne fonctionne plus Valentine  
  • 1 réponses
  • 260 vues
Sujet ouvert (nouvelles réponses) [Résolu] « Envoyer un mail à un destinataire »
Disparition de cette fonction avec IE9 sous Windows 7
jobelin4 
  • 8 réponses
  • 604 vues
Sujet ouvert (nouvelles réponses) Ma boîte mail Windows Live Mail est-elle piratée ?
Samsung R730
yves13 
  • 0 réponses
  • 275 vues
Sujet ouvert (nouvelles réponses) MySpace Music Player ne fonctionne pas bezulon 
  • 1 réponses
  • 402 vues
Sujet ouvert (nouvelles réponses) Mail douteux de Free ?
Excusez-moi mais c'est urgent
Tarte0prune 
  • 3 réponses
  • 696 vues
Sujet ouvert (nouvelles réponses) PC très lent, ne fonctionne qu'en mode sans échec Flo2 
  • 8 réponses
  • 452 vues
Sujet chaud (nouvelles réponses) [Résolu] Aucun logiciel de protection ne fonctionne annelyse 
  • 16 réponses
  • 657 vues
Sujet ouvert (nouvelles réponses) Mon PC ne fonctionne plus qu'en mode sans échec
Je stresse
Barban 
  • 2 réponses
  • 281 vues

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)



    Page officielle Zebulon.fr