Formulaire PHP, réception des données par mail, antispam

Fermé
AurélieL73 Messages postés 2 Date d'inscription lundi 21 janvier 2013 Statut Membre Dernière intervention 21 janvier 2013 - Modifié par AurélieL73 le 21/01/2013 à 15:23
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 - 31 janv. 2013 à 23:44
Bonjour,


Voilà, ça fait 3 semaines que j'ai commencé mon site... (en partant de zéro, voire moins)
J'ai suivi plusieurs tutoriels et là, je planche sur le formulaire (depuis une bonne semaine, après avoir résolu plus ou moins de nombreux problèmes) et j'ai deux problèmes qui persistent :

- Je n'arrive pas à avoir le message (textarea) dans mon mail quand j'ai tout le reste (nom, prénom, tél, mail) et quand le fichier à transférer l'a bien été dans un dossier "uploads" (d'ailleurs, le fichier peut-il être envoyé à mon adresse mail ?)

- l'antispam ne fonctionne pas : même si je réponds de manière incorrecte, le formulaire est envoyé.

Voilà mon formulaire :

<table>
<form method="post" action="traitement.php" enctype="multipart/form-data">
<tr>
<td class="c1"><label for="nom"><span class="obligatoire" title="Champ obligatoire">Nom ou société :<strong>*</strong></span></label></td>
<td><input type="text" name="nom" id="nom" size="40" required /></td>
</tr>
<tr>
<td class="c1"><label for="prenom">Prénom :</label></td>
<td><input type="text" name="prenom" id="prenom" size="40" /></td>
</tr>
<tr>
<td class="c1"><label for="email"><span class="obligatoire" title="Champ obligatoire">Adresse mail :<strong>*</strong></span></label></td>
<td><input type="email" name="email" id="email" size="40" required /></td>
</tr>
<tr>
<td class="c1"><label for="tel">Téléphone</label> :</td>
<td><input type="tel" name="tel" id="tel" size="40" /></td>
</tr>
<tr> <!--telecharger un fichier-->
<td class="c1"><label for="telechargement">Pièce jointe</label> :</td>
<td><input name="fichier" type="file"></td>
</tr>
<tr>
<td class="c1"><label for="objet"><span class="obligatoire" title="Champ obligatoire">Objet :<strong>*</strong></span></label></td>
<td><input type="text" name="objet" id="objet" size="73" required /></td>
</tr>
<tr>
<td class="c1"><label for="message"><span class="obligatoire" title="Champ obligatoire">Message :<strong>*</strong></span></label></td>
<td><textarea name="message" id="texte" rows="6" cols="60" required></textarea></td>
</tr>
<tr>
<td class="c1"> </td>
<td><input type="checkbox" name="copie" id="copie" /> <label for="copie">Recevoir une copie dans votre boîte mail</label></td>
</tr>
</table>
<label for="code"><span class="obligatoire" title="Champ obligatoire"><?php echo $nospam['question']; ?><strong>*</strong></span></label>
<input type="text" name="code" id="code" size="4" class="c2" required />
<input type="hidden" name="nospam_question" value="<?php echo $nospam['num']; ?>" />
<p class="fin"><input type="submit" value="Envoyer" /><input type="reset" name="reset" value="Annuler" /></p>
</form>


voilà ma page traitement.php

<? php

// destinataire est votre adresse mail
$destinataire = 'monmail@mail.fr';

// copie ? (envoie une copie au visiteur)
$copie = 'oui'; // 'oui' ou 'non'

// Messages de confirmation du mail
$message_envoye = "Votre message a bien été envoyé !";
$message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer SVP.";
$fichier_envoye = "L'envoi du fichier a bien été effectué !";

// Messages d'erreur du formulaire
$message_erreur_formulaire = "Vous devez d'abord <a href=\"contact_fr.php\">envoyer</a> le formulaire.";
$message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur.";

/*
********************************************************************************************
FIN DE LA CONFIGURATION
********************************************************************************************

/*
* cette fonction sert à nettoyer et enregistrer un texte
*/
function Rec($text)
{
$text = htmlspecialchars(trim($text), ENT_QUOTES);
if (1 === get_magic_quotes_gpc())
{
$text = stripslashes($text);
}

$text = nl2br($text);
return $text;
};

/*
* Cette fonction sert à vérifier la syntaxe d'un email
*/
function IsEmail($email)
{
$value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\'\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\'\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
return (($value === 0) || ($value === false)) ? false : true;
}

// formulaire envoyé, on récupère tous les champs.
$nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : '';
$prenom = (isset($_POST['prenom'])) ? Rec($_POST['prenom']) : '';
$email = (isset($_POST['email'])) ? Rec($_POST['email']) : '';
$tel = (isset($_POST['tel'])) ? Rec($_POST['tel']) : '';
$objet = (isset($_POST['objet'])) ? Rec($_POST['objet']) : '';
$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';
$nospam = (isset($_POST['nospam'])) ? Rec($_POST['nospam']) : '';

// On va vérifier les variables et l'email ...
$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré

if (($nom != '') && ($email != '') && ($objet != '') && ($message != ''))
{
// les 5 variables sont remplies, on génère puis envoie le mail
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'From:'.$nom.' <'.$email.'>'. "\r\n" .
'Reply-To:'.$email. "\r\n" .
'X-Mailer:PHP/'.phpversion();

// ne mets pas le contenu de $objet dans le sujet ça risque d'être un peu long
//$subject="$objet";
$subject="Mail de ".$nom." ".$prenom;
//corps du message
$message="Message de: ".$prenom." ".$nom."\n"; // \n = retour à la ligne dans le mail
$message .="Telephone: ".$tel."\n";
$message .="Mail: ".$email."\n\n";
$message .="Objet: ".$objet."\n";
$message = $message;

// envoyer une copie au visiteur ?
if ($copie == 'oui')
{
$cible = $destinataire.','.$email;
}
else
{
$cible = $destinataire;
};

// Remplacement de certains caractères spéciaux
$message = str_replace("'","'",$message);
$message = str_replace("'","'",$message);
$message = str_replace(""",'"',$message);
$message = str_replace('<br>','',$message);
$message = str_replace('<br />','',$message);
$message = str_replace("<","<",$message);
$message = str_replace(">",">",$message);
$message = str_replace("&","&",$message);

// Envoi du mail
if (mail($cible, $objet, $message, $headers))
{
echo '<p class="msg">'.$message_envoye.'</p>'."\n";
}
else
{
echo '<p class="msg">'.$message_non_envoye.'</p>'."\n";
};
}
else
{
// une des 5 variables (ou plus) est vide ...
echo '<p class="msg">'.$message_formulaire_invalide."\n";
};

?>



Et voilà la partie antispam :

<?php
function NoSpamQuestion($mode = 'ask', $answer = 0)
{
$array_pictures = array(); $j = 0;
$array_pictures[$j]['num'] = $j;
$array_pictures[$j]['question'] = "Combien y a-t-il de jours dans la semaine ?";
$array_pictures[$j]['answer'] = "7";
$j++;

$array_pictures[$j]['num'] = $j;
$array_pictures[$j]['question'] = "Combien y a-t-il de mois dans l'année ?";
$array_pictures[$j]['answer'] = "12";
$j++;



if ($mode != 'ans')
{
// on est en mode 'tirer au sort', on tire une image aléatoire
$lambda = rand(0, count($array_pictures)-1);
return $array_pictures[$lambda];
}
else
{
// on demande une vraie réponse
foreach($array_pictures as $i => $array)
{
if ($i == $answer)
{
return $array;
break;
};
};
}; // Fin if ($mode != 'ans')
};
?>


intégrée dans ma page de formulaire :

<?php
// on inclut le fichier des questions/réponses
require_once('antispam.php');

// on tire au sort une question
$nospam = NoSpamQuestion();
?>

Voilà, si jamais vous avez quelques remarques à faire qui pourraient m'aider, n'hésitez pas ! Et surtout, merci d'avance !!!


A voir également:

1 réponse

JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 31/01/2013 à 23:44
Salut,

- Pour vérifier un email, il suffit de :
filter_var($email, FILTER_VALIDATE_EMAIL) 
- T'as oublier de récupérer le champs "code" de ton formulaire.

- Tu as utilisé la variable "$message" pour deux usages différents, le premier pour la variable "$_POST['message']" et le deuxième pour le message du mail, alors ajoute une autre variable pour différencier entre les deux.

- Lorsque tu crée le message du mail, dans la dernière étape tu dois continuer de concaténer et non pas affecter.

- La variable $copie ne change jamais de valeur, tu l'as oublier ?

- Le point virgule n'a rien a faire après des accolades.
else  
{  
$cible = $destinataire;  
}; 

- Quelques fautes
// Inutile, rien ne se changera 
$message = str_replace("'","'",$message); 
$message = str_replace("<","<",$message);  
$message = str_replace(">",">",$message);  
$message = str_replace("&","&",$message);  

// Un antislash 
$message = str_replace("\"",'"',$message); 

- Ta méthode anti-spam n'est pas aussi efficace qu'elle en a l'air, un robot peux mémoriser les questions.


Mettez en résolu quand c'est résolu -.- ...
1