Formulaire de contact - message répété dans champ Objet

Vous avez un soucis de développement et ce n'est pas du ressort de notre support ? N'hésitez pas à soumettre vos petits soucis de développement et à vous entre aider par la même occasion.
Avatar de l’utilisateur
Tilde3
Messages : 461
Inscription : 19 octobre 2011 à 13:11
Contact :

EDIT 2012-01-04: Merci à @didier07 et @elodie pour leurs remarques et aides à propos des filtres de validation. Le problème reste entier à propos du champ Objet :)

Bonsouair !

Je viens enfin de passer le cap du formulaire de contact sur mon blog \o/ Le code html est valide, et le traitement php fonctionne.
Néanmoins, j'ai deux questions :
  1. Pourquoi est-ce que je récupère le contenu du message dans le champ Objet de ma webmail? Comment éviter cela?
  2. Que pensez-vous de ce formulaire et de ces codes (voir ci-dessous)? Votre avis sur le script php m'intéresse au plus au point car je n'y connais rien.
[h]Formulaire HTML[/h]

Code : Tout sélectionner

<form id="c-form" method="post" enctype="application/x-www-form-urlencoded" action="/scripts/contact.scr.php">
\t<p>
\t\t<label for="name"><b class="c-label">Votre nom&nbsp;:</b>
\t\t\t<input class="c-input f-item" id="name" name="name" type="text" autocomplete="on" maxlength="99" required />
\t\t</label>
\t</p>
\t<p>
\t\t<label for="email"><b class="c-label">Votre adresse email&nbsp;:</b>
\t\t\t<input class="c-input f-item" id="email" name="email" type="email" autocomplete="on" maxlength="99" required />
\t\t</label>
\t</p>
\t<p>
\t\t<label for="message"><b class="c-label">Votre message&nbsp;:</b>
\t\t\t<textarea class="c-input f-item" id="message" name="message" maxlength="999" required></textarea>
\t\t</label>
\t</p>
\t<p>
\t\t<button class="c-input f-item" id="send" name="send" type="submit">Envoyez&nbsp;!</button>
\t</p>
</form>
[h]Script PHP[/h]

Code : Tout sélectionner

<?php
/*
\tAuthor: <http://www.php-astux.info/script-formulaire-contact.php>
\tLast mod: 2013-01-03
*/
/*
\t*************************
\tCONFIGURATION
\t*************************
*/
// destinataire
$destinataire = 'contact@***.eu';

// envoie d'une copie au visiteur
$copie = 'non'; // 'oui' ou 'non'

// Messages de confirmation du mail
$message_envoye = "<b>Votre message a été envoyé. Vous pouvez <a href=\"/\">retourner à la page d'accueil</a>.</b>";
$message_non_envoye = "<b>Désolé, l'envoi a échoué. Merci d'avance de <a href=\"/contact\">réessayer</a>.</b>";

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

/*
\t****************************
\tFIN DE LA CONFIGURATION
\t****************************
*/

// on teste si le formulaire a été soumis
if (!isset($_POST['send']))
{
\t// formulaire non envoyé
\techo '<p>'.$message_erreur_formulaire.'</p>'."
";
}
else
{
\t/*
\t * cette fonction sert à nettoyer et enregistrer un texte
\t */
\tfunction Rec($text)
\t{
\t\t$text = htmlspecialchars(trim($text), ENT_QUOTES);
\t\tif (1 === get_magic_quotes_gpc())
\t\t{
\t\t\t$text = stripslashes($text);
\t\t}

\t\t$text = nl2br($text);
\t\treturn $text;
\t};

\t/*
\t * Cette fonction sert à vérifier la syntaxe d'un email
\t */
\tfunction IsEmail($email)
\t{
\t\t$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);
\t\treturn (($value === 0) || ($value === false)) ? false : true;
\t}

\t// formulaire envoyé, on récupère tous les champs.
\t$name    = (isset($_POST['name']))    ? Rec($_POST['name'])    : '';
\t$email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
\t$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';

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

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

\t\t// envoyer une copie au visiteur ?
\t\tif ($copie == 'oui')
\t\t{
\t\t\t$cible = $destinataire.','.$email;
\t\t}
\t\telse
\t\t{
\t\t\t$cible = $destinataire;
\t\t};

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

\t\t// Envoi du mail
\t\tif (mail($cible, $message, $headers))
\t\t{
\t\t\techo '<p>'.$message_envoye.'</p>'."
";
\t\t}
\t\telse
\t\t{
\t\t\techo '<p>'.$message_non_envoye.'</p>'."
";
\t\t};
\t}
\telse
\t{
\t\t// une des 3 variables (ou plus) est vide ...
\t\techo '<p>'.$message_formulaire_invalide.' <a href="/contact">Retour au formulaire</a></p>'."
";
\t};
}; // fin du if (!isset($_POST['send']))
?>
Merci d'avance et joyeuse Pâques !
Didier07
Messages : 291
Inscription : 15 mai 2011 à 09:44

Salut

Rien à voir avec ton proibleme mais regarde http://php.net/manual/fr/function.filter-var.php et http://php.net/manual/fr/filter.filters.validate.php pour valider tes mails...

Sinon

Code : Tout sélectionner

\t\t$headers .= 'From:'.$name.' <'.$email.'>' . "\r
" .
\t\t\t\t\t'Reply-To:'.$email. "\r
" .
\t\t\t\t\t'X-Mailer:PHP/'.phpversion() . "\r
" .
\t\t\t\t\t'Message:'.$message;
Il n'y a pas de distinction entre l'objet et le message. A mon avis il faut regarder là. Il manque pas une directive ?
J'utilise Rmail, donc je connais pas la syntaxe précisément.

Didier
Avatar de l’utilisateur
Tilde3
Messages : 461
Inscription : 19 octobre 2011 à 13:11
Contact :

@didier07: je pense aussi que c'est la partie du script à modifier… mais je ne sais pas quoi :(
Merci pour les liens, mais je ne sais pas utiliser ces filtres et je pense que je fais ces vérifications côté client avec html5 (en particulier l'email).
Avatar de l’utilisateur
Elodie
Fondatrice / Responsable
Fondatrice / Responsable
Messages : 7938
Inscription : 2 avril 2010 à 20:14

tilde3 a écrit :je pense que je fais ces vérifications côté client avec html5 (en particulier l'email).
Une règle d'or à noter dans un coin : Ne jamais faire confiance *uniquement* au navigateur :)
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Avatar de l’utilisateur
Tilde3
Messages : 461
Inscription : 19 octobre 2011 à 13:11
Contact :

Avec l'aide d'Élodie, j'ai fait des modifs. Le script fonctionne bien. Néanmoins, même un domaine inexistant peut toujours envoyer des mails.

Code : Tout sélectionner

<?php
/*
\t*************************
\tCONFIGURATION
\t*************************
*/
// destinataire
$destinataire = 'contact@***.eu';

// envoie d'une copie au visiteur
$copie = 'non'; // 'oui' ou 'non'

// Messages de confirmation du mail
$message_envoye = "<b>Votre message a été envoyé. Vous pouvez <a href=\"/\">retourner à la page d'accueil</a>.</b>";
$message_non_envoye = "<b>Désolé, l'envoi a échoué. Merci d'avance de <a href=\"/contact\">réessayer</a>.</b>";

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

/*
\t****************************
\tFIN DE LA CONFIGURATION
\t****************************
*/

// Teste si le formulaire a été soumis
if (!isset($_POST['send']))
{
\t// formulaire non envoyé
\techo '<p>'.$message_erreur_formulaire.'</p>'."
";
}
else
{
\t/*
\t * Nettoie et enregistre un texte
\t */
\tfunction Rec($text)
\t{
\t\t$text = htmlspecialchars(trim($text), ENT_QUOTES);
\t\tif (1 === get_magic_quotes_gpc())
\t\t{
\t\t\t$text = stripslashes($text);
\t\t}

\t\t$text = nl2br($text);
\t\treturn $text;
\t};

\t/*
\t * Vérifie la syntaxe d'un email
\t */
\tfunction isEmail($email)
\t{
\t\t// 50 caractères max
\t\tif( (preg_match('#^[\w.-]+'.chr(64).'[\w.-]+\.[a-zA-Z]{2,5}$#',$email)) && (strlen($email)<=50) )
\t\t{
\t\t\treturn true;
\t\t}
\t\telse
\t\t{
\t\t\treturn false;
\t\t}
\t}

\t/*
\t * Vérifie la validité de l'email
\t */
\tfunction isPossibleExistingMail($mail)
\t{
\t\tif(isEmail($mail))
\t\t{
\t\t\tif(isDomainMX(array_pop(explode("@",$mail))))
\t\t\t{
\t\t\t\treturn true;
\t\t\t}
\t\t\telse
\t\t\t{
\t\t\t\treturn false;
\t\t\t}
\t\t}
\t\telse
\t\t{
\t\t\treturn false;
\t\t}
\t}

\t/*
\t * Vérifie si le domaine de l'email d'envoi peut recevoir des emails
\t */
\tfunction isDomainMX($domain)
\t{
\t\tif(checkdnsrr($domain,"MX"))
\t\t{
\t\t\treturn true;
\t\t}
\t\telse
\t\t{
\t\t\treturn false;
\t\t}
\t}

\t// formulaire envoyé, on récupère tous les champs
\t$name    = (isset($_POST['name']))    ? Rec($_POST['name'])    : '';
\t$email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
\t$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';

\t// Vérifie les variables et l'email
\t$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré

\tif (($name != '') && ($email != '') && ($message != ''))
\t{
\t\t// les 4 variables sont remplies. Génère puis envoie le mail
\t\t$headers  = 'MIME-Version: 1.0' . "\r
";
\t\t$headers .= 'From:'.$name.' <'.$email.'>' . "\r
" .
\t\t\t\t\t'Reply-To:'.$email. "\r
" .
\t\t\t\t\t'X-Mailer:PHP/'.phpversion() . "\r
" .
\t\t\t\t\t'Message:'.$message;

\t\t// envoyer une copie au visiteur ?
\t\tif ($copie == 'oui')
\t\t{
\t\t\t$cible = $destinataire.','.$email;
\t\t}
\t\telse
\t\t{
\t\t\t$cible = $destinataire;
\t\t};

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

\t\t// Envoi du mail
\t\tif (mail($cible, $message, $headers))
\t\t{
\t\t\techo '<p>'.$message_envoye.'</p>'."
";
\t\t}
\t\telse
\t\t{
\t\t\techo '<p>'.$message_non_envoye.'</p>'."
";
\t\t};
\t}
\telse
\t{
\t\t// une des 3 variables (ou plus) est vide
\t\techo '<p>'.$message_formulaire_invalide.' <a href="/contact">Retour au formulaire</a></p>'."
";
\t};
}; // fin du if (!isset($_POST['send']))
?>
Avatar de l’utilisateur
Elodie
Fondatrice / Responsable
Fondatrice / Responsable
Messages : 7938
Inscription : 2 avril 2010 à 20:14

tilde3 a écrit :Néanmoins, même un domaine inexistant peut toujours envoyer des mails.
Oui car la fonction isPossibleExistingMail($mail) n'est pas appelée :)
Vous avez une question ? Posez-la de préférence sur le forum et si ça demande un contact plus instantané, n'hésitez pas à vous rendre sur le t'chat IRC. Si votre question est personnelle, contactez-nous directement.
Avatar de l’utilisateur
Tilde3
Messages : 461
Inscription : 19 octobre 2011 à 13:11
Contact :

Je crois que j'ai réussi \o/ Un mail avec domaine invalide échoue. Voici le script :

Code : Tout sélectionner

<?php
/*
\tSources:
\t\t<http://www.php-astux.info/script-formulaire-contact.php>
\t\tDouglas Lovell <http://www.linuxjournal.com/article/9585?page=0,3>
\t\tMerci à Élodie (@franceserv)
\tDate: 2013-01-04
*/
/*
\t*************************
\tCONFIGURATION
\t*************************
*/
// destinataire
$destinataire = 'contact@***.eu';

// envoie d'une copie au visiteur
$copie = 'non'; // 'oui' ou 'non'

// Messages de confirmation du mail
$message_envoye = "<b>Votre message a été envoyé. Vous pouvez <a href=\"/\">retourner à la page d'accueil</a>.</b>";
$message_non_envoye = "<b>Désolé, l'envoi a échoué. Merci d'avance de <a href=\"/contact\">réessayer</a>.</b>";

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

/*
\t****************************
\tFIN DE LA CONFIGURATION
\t****************************
*/

// Teste si le formulaire a été soumis
if (!isset($_POST['send']))
{
\t// formulaire non envoyé
\techo '<p>'.$message_erreur_formulaire.'</p>'."
";
}
else
{
\t/*
\t * Nettoie et enregistre un texte
\t */
\tfunction Rec($text)
\t{
\t\t$text = htmlspecialchars(trim($text), ENT_QUOTES);
\t\tif (1 === get_magic_quotes_gpc())
\t\t{
\t\t\t$text = stripslashes($text);
\t\t}

\t\t$text = nl2br($text);
\t\treturn $text;
\t};

\t/*
\t * Vérifie la validité de l'email
\t */
\tfunction isEmail($email)
\t{
\t\t$isValid = true;
\t\t$atIndex = strrpos($email, "@");
\t\tif (is_bool($atIndex) && !$atIndex)
\t\t{
\t\t\t$isValid = false;
\t\t}
\t\telse
\t\t{
\t\t\t// travailler avec des domaines et local
\t\t\t$domain = substr($email, $atIndex+1);
\t\t\t$local = substr($email, 0, $atIndex);
\t\t\tif( (!preg_match('#^[\w.-]+'.chr(64).'[\w.-]+\.[a-zA-Z]{2,5}$#',$email)) && (strlen($email)<=99) )
\t\t\t{
\t\t\t\t// si caractères non valides et plus de 99 caractères
\t\t\t\t$isValid = false;
\t\t\t}
\t\t\telse if (preg_match('/\\.\\./', $domain))
\t\t\t{
\t\t\t\t// si domaine a deux points consécutifs
\t\t\t\t$isValid = false;
\t\t\t}
\t\t\telse if (!checkdnsrr($domain,"MX"))
\t\t\t{
\t\t\t\t// si DNS introuvables
\t\t\t\t$isValid = false;
\t\t\t}
\t\t}
\t\treturn $isValid;
\t}

\t// formulaire envoyé, on récupère tous les champs
\t$name    = (isset($_POST['name']))    ? Rec($_POST['name'])    : '';
\t$email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
\t$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';

\t// Vérifie les variables et l'email
\t$email = (isEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré

\tif (($name != '') && ($email != '') && ($message != ''))
\t{
\t\t// les 4 variables sont remplies. Génère puis envoie le mail
\t\t$headers  = 'MIME-Version: 1.0' . "\r
";
\t\t$headers .= 'From:'.$name.' <'.$email.'>' . "\r
" .
\t\t\t\t\t'Reply-To:'.$email. "\r
" .
\t\t\t\t\t'X-Mailer:PHP/'.phpversion() . "\r
" .
\t\t\t\t\t'Message:'.$message;

\t\t// envoyer une copie au visiteur ?
\t\tif ($copie == 'oui')
\t\t{
\t\t\t$cible = $destinataire.','.$email;
\t\t}
\t\telse
\t\t{
\t\t\t$cible = $destinataire;
\t\t};

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

\t\t// Envoi du mail
\t\tif (mail($cible, $message, $headers))
\t\t{
\t\t\techo '<p>'.$message_envoye.'</p>'."
";
\t\t}
\t\telse
\t\t{
\t\t\techo '<p>'.$message_non_envoye.'</p>'."
";
\t\t};
\t}
\telse
\t{
\t\t// une des 3 variables (ou plus) est vide
\t\techo '<p>'.$message_formulaire_invalide.' <a href="/contact">Retour au formulaire</a></p>'."
";
\t};
}; // fin du if (!isset($_POST['send']))
?>
Répondre