7715 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je suis novice, je réalise un site avec un formulaire de contact, je veux envoyer les données saisies vers le mail du propriétaire, j'ai fait l'essai en ligne, ça ne fonctionne pas.
Voici les codes php du formulaire et de la récupération des données :

formulaire.php :


<form method="post" action="envoi.php" name="submit" id="messageForm" data-toggle="validator"> <!-- action="http://38volts.fr/cible.php" method="post"> -->
    
    <div class="row">

        <!-- Nom -->
        <div class="col-12">
            <input type="text" id="nom" class="form-control" name="nom" placeholder="Nom" aria-label="Nom" aria-describedby="basic-addon1" required>
        </div>

        <!-- Prénom -->
        <div class="col-12">
            <input type="text" id="prenom" class="form-control" name="prenom" placeholder="Prénom" aria-label="Prénom" aria-describedby="basic-addon2" required>
        </div>

        <!-- Email -->
        <div class="col-sm-6 col-12">
            <div class="input-group">
                <div class="input-group-prepend">
                    <span class="input-group-text" id="basic-addon3">@</span>
                </div>
                <input type="email" id="email" class="form-control email" name="email" placeholder="Email" aria-label="Username" aria-describedby="basic-addon3" required>
            </div>
        </div>

        <!-- Téléphone -->
        <div class="col-sm-6 col-12">
            <input type="text" id="tel" class="form-control tel" name="tel" placeholder="Tél (Ex. 0123456789)" aria-label="tel" pattern="^0\d(?:\d{2}){4}$" title="format: 0123456789" required/>
        </div>

        <!-- Sujet -->
        <div class="col-12">
            <input type="text" id="sujet" class="form-control" name="sujet" placeholder="Sujet" aria-label="Sujet" aria-describedby="basic-addon5" required>
        </div>

        <!-- Message -->
        <div class="col-12">
            <textarea id="message" id="message" class="form-control" name="message" rows="8" placeholder="Message" required></textarea>           
        </div>

        <!-- Bouton d'Envoi -->
        <div class="col-12">
            <button type="submit" class="btn btn-primary envoyer" name="envoi" value="J'envoie">Envoyer</button>
        </div>

    </div>  <!-- fin class row -->     

</form> <!-- fin formulaire -->


envoi.php :

<?php
error_reporting(E_ALL);

$EmailFrom = $_POST['email']; 
$EmailTo = "contact@38volts.fr";
$Prenom = $_POST['prenom'];
$Nom = $_POST['nom']; 
$Email = $_POST['email'];
$Subject = "sujet";
$Message = $_POST['message']; 
 
// validation
$validationOK=true;
if (!$validationOK) {
  echo "Error";
  exit;
}
 
// mise en form mail
$Body = "";
$Body .= "Prenom: ";
$Body .= $Prenom;
$Body .= "\n";
$Body .= "Nom: ";
$Body .= $Nom;
$Body .= "\n";
$Body .= "Email: ";
$Body .= $Email;
$Body .= "\n";
$Body .= "Sujet: ";
$Body .= $Sujet;
$Body .= "\n";
$Body .= "Message: ";
$Body .= $Message;
$Body .= "\n";
 
// envoi email 
$success = mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");
	
// message success-error
if ($success){
  echo "Votre message à bien été envoyé.";
}
else{
  echo "Une erreur s'est produite à l'envoi de votre message.";
}

?>


Merci beaucoup pour votre aide !
Modifié par A2L (09 Oct 2018 - 11:23)
Bonjour,

Tu peux y aller par étape, pour déterminer où est-ce que ça coince:

1/ Est-ce que si tu envoi un mail sans passer par un formulaire, en inscrivant juste des informations en dur dans ton code, ça fonctionne?

2/ Est-ce que ton utilisation de la fonction mail est correcte, erreur de syntaxe ou autre?

3/ Est-ce que ton mail est arrivé en spam?
Je pense qu'il doit manquer des champs Reply-to, Content-Type et Mime-Version dans ton header (4ème paramètre de mail()).

Regarde les exemples avec le lien ci-dessous :
http://php.net/manual/fr/function.mail.php

Sinon que disent les fichiers de logs ?

HereDoc c'est beau quand même !
$Body = <<< BODY
Prénom   : $Prenom
Nom        : $Nom
Courriel   : $Email
Sujet        : $Sujet
Message :
$Message
------\n
BODY;

L'usage veut qu'on réserve les noms de variables commençant par une majuscule à des bons de classes. C'est commun à beaucoup de langages informatiques.
Merci.
@ Raphi
1/ Oui la fonction mail dans le site fonctionne.
2/ ? plus compliqué qu'une erreur de syntaxe visiblement...
3/ Non n'arrive pas en spam.

@ bazooka07
Je ne comprends pas grand chose aux champs qu'il doit manquer, fichiers de logs ? ...
PS : j'ai fait ça en récupérant sur des exercices, exemples... mais ne maîtrise pas grand chose surtout Smiley confus !
Je pense que ton "From" va bloquer au serveur de mail. Laisse le serveur web le remplir
Essaie ceci :
error_reporting(E_ALL);

/**
 * On vérifie que les données postées avec le formulaire sont correctes
 * */
function antispam($nom_champ, $type_email=false) {
	$value = input_filter(
		INPUT_POST,
		$nom_champ, 
		($type_email) ? FILTER_SANITIZE_EMAIL : FILTER_SANITIZE_STRING
	);
	if($value === false) {
		exit("Champ $nom_champ non valide");
		// On se casse !
	}
	return $value;
}

$emailFrom = antispam('email', true);
$email = $emailFrom;
$prenom = antispam('prenom');
$nom = antispam('nom');
$message = antispam('message');
 
$emailTo = 'contact@38volts.fr';
 
// mise en forme du corps du mail
$body = <<< BODY
Prénom   : $Prenom
Nom        : $Nom
Courriel   : $Email
Sujet        : $Sujet
Message :
$Message
------\n
BODY;

$headers = 	array(
	'MIME-Version: 1.0',
	'Reply-To: '.$emailFrom,
	'Content-Type: text/plain; charset=UTF-8'
);

// envoi email 
if(mail(
	$emailTo,
	'Sujet kivabien', 
	$body,
	implode("\r\n", $headers)
)) {
	echo "Super ! le mail est parti";
} else {
	echo "Echec à l'envoi du mail";
}
merci bien... Mais idem ... "Votre message a bien été envoyé !"
Et rien dans la boîte et pas plus de message d'erreur en console... Smiley ohwell
Je pense que ton message voit se retrouver coincé au niveau du serveur SMTP, celui qui distribue les mails et qui est indépendant du serveur HTTP (Apache).

Il faudrait regarder les fichiers de logs de Apache
Envoie un mail pour tester à contact@38volts.fr avec un vrai logiciel de mails comme Thunderbird ou autre pour vérifier que l'adresse fonctionne.

En supposant que ton site Internet tourne sur https://38volts.fr, et qu'il existe une adtesse mail du genre webmaster@38volts.fr, modifie les headers comme suit :
$headers = 	array(
	'MIME-Version: 1.0',
	'From: webmaster@38volts.fr',
	'Reply-To: webmaster@38volts.fr',
	'Content-Type: text/plain; charset=UTF-8'
);
En fait, à la place de "contact@38volts.fr" (société de mon frère, et adresse courante qui fonctionne et où l'on communique..) je mets mon adresse "poubelle" (a2line8@yahoo.fr) dans le code (contrairement à mes lignes ci-dessus) pour faire les essais et pouvoir vérifier instantanément, et elle marche bien sans pbl...
Et il n'y a pas d'autre adresse...
Et il tourne effectivement bien la : https://38volts.fr
Certains serveurs de mails sont plus tolérants que d'autres.
Le site de ton frère est hébergé chez OVH. Il doit y avoir un filtrage anti-spam qui n'accepte d'envoyer que des mails qui ont une adresse retour en @38volts.fr. Tu as peut-être la possibilité de créer une autre adresse en @38volts.fr ( L'offre Kimsufi en prpose 2 )
jpierre@bpi-berry:~$ resolveip 38volts.fr
IP address of 38volts.fr is 213.186.33.87
jpierre@bpi-berry:~$ resolveip 213.186.33.87
Host name of 213.186.33.87 is cluster014.ovh.net
jpierre@bpi-berry:~$ 

Si tu as eu une adresse chez Google en @gmail.com, elle devrait passer aussi.

Evite de laisser ton adresse mail en clair sur ton site. Un robot spammeur va finir par la récupérer et adieu ta boite mails pleine de spams.
Soit tu colles une image à la place, soit tu mets un formulaire de contact.
Merci bien,
Tu veux dire qu'il faudrait créer une autre adresse spécialement pour envoyer les données saisies en formulaire ? Je ne pense pas lui changer d'OVH, l'abonnement est en cours (un ancien site existait déjà)...
Je vais essayer de comprendre tout cela de près.... merci.
C'est plus facile pour trier les mails et tu peux garder ton adresse poubelle
Merci
... alors touche F12 ... je suis sur Mac... donc c'est la touche pour faire quoi ?
A2L a écrit :
Merci.
@ Raphi
1/ Oui la fonction mail dans le site fonctionne.

Vu ta réponse, ton envoi de mail n'est pas en cause. Donc le problème vient des valeurs que tu récupères.
Peux-tu faire un var_dump($_POST) pour voir ce que tu récupères stp?
Alors je ne suis pas bien douée, j'ai collé ça :
<?php
var_dump($_POST)
?>
à la fin du formulaire.php ... je ne vois rien s'afficher après avoir rechargé pg et renvoyé un formulaire rempli...
En fait le var_dump te sert à connaître ce qu'il y a dans tes variables que tu lui passent en paramètres. Donc dans ton cas un var_dump($_POST) te permet de savoir ce que ton formulaire renvoi une fois que tu as renseigné les champs et soumis ton formulaire.
Ce qui signifie que tu peux mettre ce code au début de ta page envoi.php:
<?php
error_reporting(E_ALL);

var_dump($_POST);
...
?>

Modifié par Raphi (10 Oct 2018 - 14:15)
Je rajouterais même que le var_dump est très souvent accompagner des balises html <pre> pour une meilleur visiblité, et d'un die(); php pour stoper la suite du script. exemple :


echo "<pre>"; // va m'aider à afficher et surtout à indenter si c'est une variable conséquente 
var_dump("ce que je veux, si ça ce trouve c'est un multi tableau large de ouf");
echo "</pre>";
die;
//au moins la suite n'est pas exécuter... ça peut aider [smile]

Modifié par JENCAL (10 Oct 2018 - 14:24)
@jencal: Ah tient j'avais pas pensé à utiliser les balises pre, merci de l'info !
Moi je configure mon serveur avec xdebug pour avoir un affichage correct du résultat.
Merci,
Oui j'ai utllisé var_dump et <pre> dans des exercices simples, et voici ce qu'il me retourne quand je teste en local :
array(7) {
["nom"]=>
string(5) "clrrr"
["prenom"]=>
string(5) "adddd"
["email"]=>
string(16) "a2line8@yahoo.fr"
["tel"]=>
string(10) "0225533665"
["sujet"]=>
string(7) "essai 1"
["message"]=>
string(7) "essai 1"
["envoi"]=>
string(8) "J'envoie"
}

La récup des données fonctionne donc ?!

ma pg envoi.php :
<?php
error_reporting(E_ALL);

echo "<pre>"; // va m'aider à afficher et surtout à indenter si c'est une variable conséquente 
var_dump($_POST);
echo "</pre>";
die;

$emailFrom = $_POST['email']; 
$emailTo = "contact@38volts.fr";
$prenom = $_POST['prenom'];
$nom = $_POST['nom']; 
$email = $_POST['email'];
$subject = "sujet";
$message = $_POST['message']; 
 
// validation
$validationOK=true;
if (!$validationOK) {
  echo "Error";
  exit;
}
 
// mise en form mail
$body = "";
$body .= "Prenom: ";
$body .= $prenom;
$body .= "\n";
$body .= "Nom: ";
$body .= $nom;
$body .= "\n";
$body .= "Email: ";
$body .= $email;
$body .= "\n";
$body .= "Sujet: ";
$body .= $sujet;
$body .= "\n";
$body .= "Message: ";
$body .= $message;
$body .= "\n";
 
// envoi email 
$success = mail($emailTo, $subject, $body, "From: <$emailFrom>");

// message success-error
if ($success){
  echo "Votre message à bien été envoyé.";
}
else{
  echo "Une erreur s'est produite à l'envoi de votre message.";
}

 ?>

Modifié par A2L (10 Oct 2018 - 20:32)
Salut,
après un var_dump(), mets un die();
comme ça il arrêtera le script