Pages :
Bonjour,

Etant nouvelle sur le forum j'ai préféré poster ce sujet ici.
Tout d'abord je suis (très très) débutante en php et j'ai donc un problème concernant mon formulaire.
Formulaire qui m'a été donné et où j'arrive à peu près à comprendre 2/3 trucs et que je veux insérer sur mon site.
Je suis hébérgée sous 1and1.
Problème : il m'affiche le message d'erreur encodé dans le php (Une erreur est survenue lors de l'envoi du formulaire par email) et donc n'envoi pas de mail.
Mais pour info j'ai testé d'autres formulaires récupéré sur le net, et certain marque message envoyé mais je ne reçois toujours rien. Donc je me demande si c'est mon code (sachant que j'ai fait vérifié par celui qui me l'a filé) et sachant que ce même code marche ailleurs (en essai local).
Et donc je me demande si ça ne serait pas au niveau de l'hébergeur aussi, mais donc je me renseigne et ne trouve rien pour l'instant.
Je vous mets le code pour voir si vraiment ça ne serait pas lui qui déconne Smiley sweatdrop :

Le html :


<!DOCTYPE html>
<html lang="fr">
	<head>
		<meta charset="UTF-8" >
		<title></title>
		<link rel="icon" href="images/favicon.ico" />
		<link rel="stylesheet" type="text/css" href="css/reset.css">
		<link rel="stylesheet" type="text/css" href="css/style.css" />
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">           </script> 
	</head>
	
	<body  id="fond-contact">
		<?php $nav_en_cours = 'contact'; ?>
		<?php include "_header.php" ?>
     
       <article class="formulaire right">

                
                <h2>CONTACTEZ MOI et/ou SUIVEZ MOI !</h2>
                
                <div class="reseau">
                <a href="#">                              
                <img src="images/linkedin-logo.png"></a>
                <a href="#">
                    <img src="images/pinterest-logo.png">
                </a>
                </div>

            <form action="cible.php#contact" method="post">
                <p>
                    <label for="nom">Nom*</label>
                    <input type="text" name="nom">
                </p>
                
                <p>
                    <label for="prenom">Prénom</label>
                    <input type="text" name="prenom">
                </p>
                
                <p>
                    <label for="email">Email*</label>
                    <input type="email" name="email" id="email" placeholder="exemple@nom.com" required>
                </p>
                    
                    <label for="message">Message*</label>
                    <textarea name="message" id="message" cols="50" rows="5"></textarea>
                </p>
                <p>
                    <input type="submit" value="Envoyer" class="right">
              
                </p>
            </form>

        </article>

       <?php include "_footer.php" ?>
</body>
</html>


Le php à part dans un fichier cible.php :


<?php
	

if(isset($_POST) && isset($_POST['nom']) && isset($_POST['email']) && isset($_POST['message']) && isset($_POST['prenom'])){
	if(!empty($_POST['nom']) && !empty($_POST['email']) && !empty($_POST['message']) && !empty($_POST['prenom'])){
		$destinataire = "monadress@gmail.com";
		$sujet = "Demande de contact";
		$message = "Nom : ".$_POST['nom']."\r\n";
		$message = "Prenom : ".$_POST['prenom']."\r\n";
		$message = "Adresse email : ".$_POST['email']."\r\n";
		$message = "Message : ".$_POST['message']."\r\n";
		$entete = 'From: '.$_POST['email']."\r\n".
        	'Reply-To: '.$_POST['email']."\r\n".
		'X-Mailer: PHP/'.phpversion();
		if (mail($destinataire,$sujet,$message,$entete)){
			echo 'Message envoyé';
		} else {
 			echo "Une erreur est survenue lors de l'envoi du formulaire par email";
		}
	}
}
?>


Voilà il faut absolument que je trouve la solution cette semaine, j'espère que quelqu'un pourra m'aider !
Merci d'avance !
Modérateur
Bonjour,

Essaie déjà sans le paramètre $entete (a priori, ça pourrait marcher sur un serveur 1 and 1) .
Et mets une trace de ce que tu penses envoyer dans le message d'erreur.

C'est à dire :


if (mail($destinataire,$sujet,$message))
{
    echo 'Message envoyé';
} else
{
    echo "Une erreur est survenue lors de l'envoi du formulaire par email";
    echo " (".$destinataire.",".$sujet.",".$message.")";
}


Amicalement,
Ouahou merci beaucoup ça marche !!!!
Je galérais tellement !!!

J'ai une autre petite question par contre, est ce possible que ça marque bien message envoyée et que ça revienne à ma page contact?

Je pensais que le #contact (action="cible.php#contact") servais à ça ?

Encore une question ça me marque Message envoyé, pourquoi il ne prend pas les caractères spéciaux ?

Et si possible, j'ai simplement copier coller ton code, mais au fond, je n'ai pas vraiment compris ce qu'il c'est passé..c'est possible de me l'expliquer, comment dire.. "en français" si tu vois ce que je veux dire Smiley biggrin ?

En tout cas MERCI BEAUCOUP ! Gros soulagement !
Bon j'ai peut-être répondu trop vite, ça marche sur 2 pc et pas sur 2 autres... (j'ai demandé à des gens de m'envoyé un mail), j'ai pas 10 pc chez moi Smiley biggrin !

Et donc pour eux ça ne marque aucun message... et je ne reçois rien. Je ne sais pas si ça peut-être des configurations de l'ordinateur, ou le code du coup...
Modérateur
Bonjour,

En ce qui concerne le message "Une erreur est survenue lors de l'envoi du formulaire par email", je pense que le serveur 1 and 1 n'a pas aimé ce qu'il y avait dans la variable $entete.

En ce qui concerne le fait que certains ont une page blanche, la question est : ont-ils bien rempli tous les champs du formulaire. Car dans ton php, on teste si les champs sont vides ou pas, et si l'un d'eux est vide, on ne fait rien.

En ce qui concerne les caractères bizarres dans ""Message envoyé"", c'est parce que tu as probablement enregistré ton fichier php en UTF-8 (ce qui est bien), mais que le navigateur qui reçoit le message n'a pas assez d'informations pour savoir que c'est de l'UTF-8. Pour régler ce problème, rajoute sur la deuxième ligne de ton fichier php (juste après le <?php) :


header('Content-Type:text/html;charset=UTF-8');


Dis-moi déjà si tout ça règle tes problèmes et on verra ensuite pour la question de réafficher le formulaire de contact.

Amicalement,
Modifié par parsimonhi (04 Jan 2015 - 17:16)
En effet, c'est bien parce que tous les champs n'étaient pas rempli. En fait je sais que je peux rajouter "required" dans mon html sur les champs que je veux pour permettre à l'utilisateur d'être obligé de remplir un champs. En revanche je ne sais pas comment écrire ça en php. En fait j'aimerais seulement que le prénom ne soit pas obligatoire par exemple. Le champ peut rester vide et ça envoi quand même le mail. Je suis entrain de rechercher comment faire, pour l'instant je ne sais pas.

Génial pour les caractères, ça marche ! Smiley lol
Modérateur
Bonjour,

Pour ne pas tester le prénom, il suffit dans le script php qui envoie l'email de retirer "&& !empty($_POST['prenom'])" dans la ligne qui teste si les champs sont vides ou pas.

Maintenant que ça marche, il serait peut-être pas mal de rajouter la variable $entete en n'y mettant que l'adresse email de l'expéditeur.


$from = $_POST['email'];
$entete = 'From: '.$from;
if (mail($destinataire,$sujet,$message,$entete))
{
    ...
}


Normalement, il faudrait tester s'il s'agit d'un email valide.

Par exemple :

header('Content-Type:text/html;charset=UTF-8');
$s = "";
function verifieEmail($mail) 
{
	if (preg_match('/^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]/i',$mail)) return false;
	list ($nom,$domaine) = explode ('@',$mail);
	if (getmxrr($domaine,$mxhosts)) return true;
	else return false;
} 
$destinataire = "ton-email@xxx.com";
$sujet = "Demande de contact";
$from = $_POST['email'];
if (verifieEmail($from))
{
    $entete = 'From: '.$from;
    if (mail($destinataire,$sujet,$message,$entete))
    {
        $s = "Votre demande a été envoyée.";
    }
    else
    {
        $s = "Une erreur s'est produite. Votre demande n'a pas été envoyée.";
    }
}
else
{
    $s = "Votre email est invalide. Votre demande n'a pas été envoyée.";
}
if ($s) echo $s;


EDIT: il manquait une accolade. je l'ai rajoutée.

En ce qui concerne le retour à la page de contact, il faut en fait l'inclure à la fin de ton fichier php, en l'adaptant un peu pour traiter les messages d'erreurs. As-tu besoin d'aide ou vois-tu comment faire maintenant ?

Amicalement,
Modifié par parsimonhi (04 Jan 2015 - 18:35)
Modérateur
Bonjour,

J'ai oublié le test sur les champs vides. Voilà la correction :

EDIT : et j'avais oublié aussi la variable $message Smiley cligne Pfff !


header('Content-Type:text/html;charset=UTF-8');
$s = "";
function verifieEmail($mail) 
{
	if (preg_match('/^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]/i',$mail)) return false;
	list ($nom,$domaine) = explode ('@',$mail);
	if (getmxrr($domaine,$mxhosts)) return true;
	else return false;
} 
if (!empty($_POST['nom']) && !empty($_POST['email']) && !empty($_POST['message']))
{
    $destinataire = "ton-email@xxx.com";
    $sujet = "Demande de contact";
    $message = "Nom : ".$_POST['nom']."\r\n";
    $message = "Prenom : ".$_POST['prenom']."\r\n";
    $message = "Adresse email : ".$_POST['email']."\r\n";
    $message = "Message : ".$_POST['message']."\r\n";
    $from = $_POST['email'];
    if (verifieEmail($from))
    {
        $entete = 'From: '.$from;
        if (mail($destinataire,$sujet,$message,$entete))
        {
            $s = "Votre demande a été envoyée.";
        }
        else
        {
            $s = "Une erreur s'est produite. Votre demande n'a pas été envoyée.";
        }
    }
    else
    {
        $s = "Votre email est invalide. Votre demande n'a pas été envoyée.";
    }
}
else
{
    $s = "Vous n'avez pas rempli tous les champs. Votre demande n'a pas été envoyée.";
}
if ($s) echo $s;


Amicalement
Modifié par parsimonhi (04 Jan 2015 - 18:28)
Alors lorsque j'enlève "&& !empty($_POST['prenom'])" et que je laisse mon code , je reçois bien le mail mais je ne reçois plus que le nom, il ne me mets plus ce qui est après c'est à dire l'adresse mail et le message.

En ce qui concerne le code que tu m'a fourni.. dois je le remplacement entièrement par mon code précédent? J'ai testé et ça me met :"Votre demande a été envoyée." mais je ne reçois rien..peut-être n'aime t-il vraiment pas l'entête!?

Désolé je suis bien nul en php, je n'y comprend vraiment pas grand chose, je compte reprendre tout du début mais la malheureusement c'est une question de temps et heureusement qu'il existe des gens comme vous !!! encore merci de votre aide
Modérateur
Uria a écrit :
Rectification : en fait si je reçois ! mais dans les spams ce coup ci


Haha ! Il fallait s'y attendre Smiley cligne

Il va falloir que tu dises à ton logiciel de messagerie que ce n'est pas des spams.

Amicalement,
rererectification Smiley biggrin je ne reçois que le message et pas les autres infos

Ah oui ok pour la messagerie pas de soucis pour ça
Modifié par Uria (04 Jan 2015 - 18:54)
Modérateur
Bonjour,

Ha, en effet, j'ai laissé passer une erreur de ton script initial.

Il faut rajouter un "." devant les "=" à partir du deuxième . Un ".=" dit à php d'ajouter le contenu à la variable $message, alors qu'un "=" tout seul a pour effet de remplacer le contenu de la variable $message.


    $message = "Nom : ".$_POST['nom']."\r\n";
    $message .= "Prenom : ".$_POST['prenom']."\r\n";
    $message .= "Adresse email : ".$_POST['email']."\r\n";
    $message .= "Message : ".$_POST['message']."\r\n";


Amicalement,
Ah oui ok, on me l'avait déjà dit en plus, quelque chose que j'aurais pu retenir, mais ma mémoire a du dire non Smiley sweatdrop

Peux tu m'aider également pour que ça revienne à la page contact?

En tout cas ça marche niquel ! Smiley lol

Je vais explorer tout ça plus en détails, et je serais moins stréssée au moins Smiley biggol
Modérateur
Bonjour,

Pour la page contact, ça dépend un peu de ce qu'elle est.

Question 1 : elle est en quoi ? (c'est quoi l'extension du fichier ? .htm ? .php ?)
Question 2 : y a quoi comme premières lignes dans ce fichiers (ce qu'il y a avant la balise <head>) ?

Amicalement,
C'est une page .php
avant le <head> il y a :

<!DOCTYPE html>
<html lang="fr">


N'est ce pas une histoire de : header('Location: contact.php');
Bon ça ne marche pas ...mais un truc du genre peut-être..
Modérateur
Bonjour,

Du coup, ça va être assez simple.

Tu vas simplement inclure le code php qui envoie l'email quelque part dans ta page (disons par exemple pour l'instant juste au dessus de ton formulaire de contact).

Si on suppose que le fichier php est dans le même répertoire que le fichier de la page contact,

tu vas mettre dans la page contact (juste avant le formulaire donc) :


<?php
if (isset($_POST) && isset($_POST['nom']) && isset($_POST['email']) && isset($_POST['message']) && isset($_POST['prenom']))
{
    include("cible.php");
}
?>


Et ensuite, en supposant que la page contact s'appelle "contact.php" (mais ça peut être n'importe quel autre nom), tu vas remplacer <form action="cible.php#contact" method="post"> par :

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



Et ça devrait tomber en marche.

Le principe est le suivant : lorsque l'internaute arrive sur la page contact, et qu'il vient d'une autre page, les variables $_POST['nom'], $_POST['prenom'], ... sont indéfinies. php teste ça et n'inclut pas "cible.php" dans la page.

L'internaute remplie le formulaire et clique sur le bouton qui va bien. Ça a pour effet de re-afficher la page "contact.php", mais cette fois-ci, les variables $_POST['nom'], $_POST['prenom'], ... sont définies, Php inclut donc "cible.php", et "cible.php" envoie l'email ou bien en cas d'échec affiche le message d'erreur juste au dessus du formulaire.

Voilà, voilà !

Amicalement,
Modifié par parsimonhi (04 Jan 2015 - 19:33)
Modérateur
Bonjour,

J'ai oublié de préciser que tu peux du coup très probablement supprimer dans "cible.php" la ligne :

header('Content-Type:text/html;charset=UTF-8');

Amicalement,
Pages :