Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

PHP Formulaire mail avec pièce jointe ne fonctionne pas


Messages recommandés

Posté(e)

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...)

 

<!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"> </td>

</tr>

</table>

</center>

</div>

</body>

</html>

Et son morceau de PHP mail.php

 

<?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 :

 

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

 

<?

$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 :

 

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

Posté(e)

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.

Posté(e)

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!

Posté(e) (modifié)

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

Modifié par ricou33
Posté(e)

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>

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...