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

Hamza

Membre
Bonjour,

Avec un formulaire construit en HTML et PHP quelle est la méthode pour recevoir les données renseignées dans le formulaire par mail ?
J'ai trouvé ce petit tuto pour utiliser la classe phpmailer mais il semble obsolète avec PHP 7, sauriez-vous l'adapter sinon quelle autre méthode je peux envisager ?

Merci !
 

Nicolas

Membre
phpmailer n'est pas obsolète et permet toujours l'envoi de mail via PHP.
Le code PHP semble le même depuis le tutoriel que tu présentes (il y en a d'autres plus récents)
PHP
function sendmail($objet, $contenu, $destinataire) { 
// on crée une nouvelle instance de la classe
$mail = new PHPMailer(true);
  // puis on l’exécute avec un 'try/catch' qui teste les erreurs d'envoi
  try {
    /* DONNEES SERVEUR */
    #####################
    $mail->setLanguage('fr', '../PHPMailer/language/');   // pour avoir les messages d'erreur en FR
    $mail->SMTPDebug = 0;            // en production (sinon "2")
    // $mail->SMTPDebug = 2;            // décommenter en mode débug
    $mail->isSMTP();                                                            // envoi avec le SMTP du serveur
    $mail->Host       = 'smtp du serveur';                            // serveur SMTP
    $mail->SMTPAuth   = true;                                            // le serveur SMTP nécessite une authentification ("false" sinon)
    $mail->Username   = 'ne-pas-repondre@mon_domaine.fr';     // login SMTP
    $mail->Password   = '**********';                                                // Mot de passe SMTP
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;     // encodage des données TLS (ou juste 'tls') > "Aucun chiffrement des données"; sinon PHPMailer::ENCRYPTION_SMTPS (ou juste 'ssl')
    $mail->Port       = 587;                                                               // port TCP (ou 25, ou 465...)

    /* DONNEES DESTINATAIRES */
    ##########################
    $mail->setFrom('ne-pas-repondre@mon_domaine.fr', 'No-Reply');  //adresse de l'expéditeur (pas d'accents)
    $mail->addAddress($destinataire, 'Clients de Mon_Domaine');        // Adresse du destinataire (le nom est facultatif)
    // $mail->addReplyTo('moi@mon_domaine.fr', 'son nom');     // réponse à un autre que l'expéditeur (le nom est facultatif)
    // $mail->addCC('cc@example.com');            // Cc (copie) : autant d'adresse que souhaité = Cc (le nom est facultatif)
    // $mail->addBCC('bcc@example.com');          // Cci (Copie cachée) :  : autant d'adresse que souhaité = Cci (le nom est facultatif)

    /* PIECES JOINTES */
    ##########################
    // $mail->addAttachment('../dossier/fichier.zip');         // Pièces jointes en gardant le nom du fichier sur le serveur
    // $mail->addAttachment('../dossier/fichier.zip', 'nouveau_nom.zip');    // Ou : pièce jointe + nouveau nom

    /* CONTENU DE L'EMAIL*/
    ##########################
    $mail->isHTML(true);                                      // email au format HTML
    $mail->Subject = utf8_decode($objet);      // Objet du message (éviter les accents là, sauf si utf8_encode)
    $mail->Body    = $contenu;          // corps du message en HTML - Mettre des slashes si apostrophes
    $mail->AltBody = 'Contenu au format texte pour les clients e-mails qiui ne le supportent pas'; // ajout facultatif de texte sans balises HTML (format texte)

    $mail->send();
    echo 'Message envoyé.';
 
  }
  // si le try ne marche pas > exception ici
  catch (Exception $e) {
    echo "Le Message n'a pas été envoyé. Mailer Error: {$mail->ErrorInfo}"; // Affiche l'erreur concernée le cas échéant
  } 
} // fin de la fonction sendmail

Est-ce que tu as testé la fonction ?
Tu as bien installé la librairie phpmailer ?
 

yule

Membre
Hello,

Sinon il y a la fonction mail() qui devrait également faire l'affaire, un truc de ce genre (c'est plus basic que l'exemple de Nicolas)

PHP
    if ($choix =="valider")
    {         
    // +-------- Si le nom est vide, ou le mail de celui qui écrit  ---------+ 

        if ($name =="" or $from=="")
        {                   
            echo" <p>Oups !! Petite inadvertance...</p>";
        }
        else
            {
                $date = date("d-m-Y");
                $heure = date("H:i");
                                        
                $to = "contact@monsite.com"; // "ici normalement ton mail
                $subject2 = "$subject"; //  la variable $subject qui concerne le sujet du mail

                $headers  = "MIME-Version: 1.0\n";
                $headers .= "Content-type: text/plain; charset=utf-8\n"; // l'en-tete Content-type pour le format HTML
                $headers .= "Content-Transfer-Encoding: 8bit\n"; // code de transportage
                $headers .= "From:" . $from; // Le mail de celui ou celle qui souhaite te contacter (variable $from)
                                        
                $message = "\r\nMessage de : $name\r\n Envoyé le $date à $heure\r\n Email : $from\r\n Sujet : $subject2\r\n  Url: $website\r\n\n $contenu\n"; //C'est selon ce que tu demandes sur ton formulaire.. ici il y a la date, l'heure, de qui, le sujet, l'url et le texte du message ($contenu)
                                         
                if (mail($to, $subject2, $message, $headers)) // Envoi du message
                {
                    echo "<p>Votre message a bien été envoyé, nous y répondrons dans un bref délai ! </p>";
                }
                else // Non envoyé
                {
                echo "<p>Votre message n'a pas pu être envoyé, merci d'essayer à nouveau...</p>";
                }
            }
    }

J'utilise cette méthode mais phpmailer (que je n'ai jamais utilisé) devrait aussi faire l'affaire
Bonne bonne
Yule
 
Dernière édition:

Hamza

Membre
Merci à tout les deux, je vais me pencher sur l’une ou l’autre des méthodes. Concernant l’envoi des données vers le mail comment relie t-on la fonction PHP au bouton de soumission du formulaire ?

<div class="button">function(mail)</div> quelque chose comme ça ?
 

yule

Membre
Ton formulaire tu l'envois à une adresse, de cette adresse genre monformulaire.php?choix=valider tu vas contrôler ce qui a été envoyé puis et après ce contrôle, tu fais "tourner" ta fonction

Pour phmailer
Il te faudra un appel à la fonction de ce genre $mafonction = sendmail($objet, $contenu, $destinataire);

Et pour le second, elle se fait ici if (mail($to, $subject2, $message, $headers)) // Envoi du message

Sinon , fait pas par pas cet exemple : envoyer email php - Tutowebdesign

ou essaye juste ça

PHP
<?php
$to = "hamza@monemail.com";
$subject = "Premier test";
$message = "Hello, je m'amuse a tester la fonction mail avec PHP...";
$from = "email@visiteur.com";

// Envoi d'email ou pas..
if(mail($to, $subject, $message)){
    echo "OKKKKKK ce message a été envoyé avec succès!";
} else{
    echo "Impossible d'envoyer ce mail. Il faut retenter.";
}
?>
 
Dernière modification par un modérateur:

CandyShop

Membre
Concernant l’envoi des données vers le mail comment relie t-on la fonction PHP au bouton de soumission du formulaire ?
Ouais ça m'intéresse aussi, lorsque l'on clique sur le bouton submit comment cela déclenche l'envoi par mail ?
Dans le tuto présenté plus haut on à ça en HTML
HTML
<form action="" method="post">
    <label for="nom"> Nom : </label>
    <input type="text" placeholder="--" id="nom" name="nom">
    <label for="email"> Email : </label>
    <input type="text" placeholder="---@---.--" id="email" name="email">
    <label for="sujet"> Sujet : </label>
    <input type="text" placeholder="------" id="sujet" name="sujet">
    <label for="message"> Message : </label>
    <textarea id="message" name="message"></textarea>
    <input type="submit" id="envoi" name="envoi" value="ok">
</form>

et en PHP on à ça
PHP
<?php
    $sujet = '=?UTF-8?B?'.base64_encode($sujet).'?=';
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
    $headers .='Content-Transfer-Encoding: 8bit'."\r\n" ;
    $headers .= "From: $email" . "\r\n" . "Reply-To:$email" . "\r\n";
    $message =  "Voici le méssage de $nom : <br>   $message ";
    if(!mail("webmaster@tutovisuel.com", $sujet, $message, $headers)){
        echo "erreur";
    }else{
        header("location:confirm.php");
    }
?>

Désolé je suis une buse en PHP et donc comment HTML et PHP sont reliés ? Avec ce code ? <form action="" method="post">
Il n'y a pas d'include quelque part à définir ?

Merci !
 

yule

Membre
Désolé je suis une buse en PHP et donc comment HTML et PHP sont reliés ? Avec ce code ? <form action="" method="post">
Il n'y a pas d'include quelque part à définir ?

Merci !
Oui
L'include, c'est si tu dois appeler un fichier, genre un fichier de connexion pour te connecter à ta BDD ou un pied de page etc.. mais dans cet exemple, il n' y en a pas besoin

Rapidement , un mini formulaire php sur une page qui se nomme verif.php

PHP
<form method="post" action="verif.php"> // l'adresse ou ton formulaire va être envoyé
Nom : <input type="text" name="nom" size="12"><br>// name="nom" => ta variable sera "nom"
Prénom : <input type="text" name="prenom" size="12">// name="prenom" => ta variable sera "prenom"
<input type="submit" value="OK">
</form>

SI ta page ou il y a le formulaire s'appelle verif.php tu peux écrire de 3 façons
<form method="post" action="verif.php"> va être envoyé sur la page verif.php
<form method="post" action=""> va être envoyé sur cette même page, soit verif.php (vide = la page actuelle)
<form method="post" action=verif2.php""> va être envoyé vers une deuxième page, verif2.php

Maintenant et une fois que tu cliques OK, il va chercher le code php

PHP
$prenom = $_POST['prenom']; // tu récupères la variable prénom de l'input ci-dessus
$nom = $_POST['nom'];// tu récupère la variable $nom de l'input ci-dessus
echo "bonjour $prenom $nom";  // tu affiches ce que tu as récupéré

Après et depuis cette base, il faut compliqué la chose, mettre des conditions, contrôler la valeur d'un champs etc..

Voili voilou mais plus simple, je peux pas ( j'ai réduit un max)
Courage
A+++++++++
 

DaCode

Membre
<form method="post" action="verif.php"> va être envoyé sur la page verif.php
<form method="post" action=""> va être envoyé sur cette même page, soit verif.php (vide = la page actuelle)
<form method="post" action=verif2.php""> va être envoyé vers une deuxième page, verif2.php
Donc les deux premières méthodes sont les mêmes mais écrites différemment c'est ça ?
 

Hamza

Membre
D'accord je crois que j'ai compris le principe, je code mon formulaire et je vous poste le résultat ici.
(je sais pas si je vais maitriser assez la méthode mais si quelqu'un se sent ça ferait un beau tutoriel PHP, j'dis ça j'dis rien...)

A+
 

yule

Membre
Voilà, c'est fait et ça se trouve ici
 

Hamza

Membre
J'ai un de ces pouvoir moi ! 🤩

Merci beaucoup yule pour le tuto et surtout pour le fichier prêt à l'emploi ! C'est plus que ce que je pouvais attendre, il n'y a plus qu'à mettre un peu de CSS pour l'enjoliver.
A ce propos, connais-tu la méthode pour élargir de base la zone de commentaire ?
Dans l'HTML je vais rajouter des required pour avoir des rappels en temps réel des champs non renseignés, du coup est-ce que la vérification PHP reste nécessaire ou bien elle devient inutile dans ce cas ?
 

Cascadeur

Membre
A priori si tu as des required sur chaque <input> tu ne devrais pas avoir besoin de la vérification PHP. Par contre la vérification du nombre de caractères minimum pour le sujet et le champ message ne peut pas être géré par HTML donc à voir selon tes besoins.
 

yule

Membre
Holà,

Cascadeur a répondu à ta première question (y) pour la seconde , je ne suis pas certain de saisir
tu veux parler de ce genre de spécificité

<input type="text" rows="5" size="30" maxlength="1000"> (5 colonnes et max 1000 caractères)
<input type="text" size="30" style="height:25px;" /> (hauteur de 25)

Normalement tout se règle depuis ton css ou rapidement dans ton input style="width: 600px; height: 400px;"
 

CandyShop

Membre
Ah je n'avais pas compris que les codes HTML et PHP étaient sur la même page, donc dans le cas on a un form.html et un form.php comment on appelle le PHP dans l'HTML ?
Genre juste ce code suffit dans le fichier .html ?
PHP
<?php
    include("form.php");
?>
 

HenriK

Membre
Bonsoir,

Est-ce qu'il est possible d'envoyer les données du formulaire à plusieurs adresses emails voire une mailling-list ?
Autre chose, comment l'utilisateur du formulaire peut-il recevoir une copie du mail ?

Merci !

edit: j'ai trouvé pour plusieurs mails
PHP
$to = "somebody@example.com, somebodyelse@example.com";
 

HenriK

Membre
ok, j'ai trouvé ça
PHP
$headers[] = 'Cc: anniversaire_archive@example.com';
$headers[] = 'Bcc: anniversaire_verif@example.com';
Donc si dans mon formulaire j'écris un truc du genre
HTML
<input type="mail" id="email_user" name="email_user">

comment j'écris le PHP ?
PHP
$to = "somebody@example.com, somebodyelse@example.com, $email_user";
ou bien
PHP
$headers[] = 'Cc: $email_user';
Je suis franchement perdu entre l'HTML et le PHP
 
Dernière modification par un modérateur:

Ces discussions pourraient vous intéresser...

Bonsoir, j'ai fait une recherche sur le forum et je crois que personne n'en a encore parlé, j'ai trouvé un site pas mal lorsque j'ai installé easyPHP (qui est maintenant Webserver) : KodeShot. Cela permet de créer des captures d'écrans d'extrait de code. Vous tapez votre code, vous...
Hello, J'ai créé un formulaire avec Bootstrap mais j'ai un problème de mise en forme. Les <input> prennent chacun leur propre ligne alors que j'aimerais que certains soit côte à côte. Je ne parviens pas du tout à faire ce que je veux et je ne trouve rien dans la documentation...
Yo ! J'ai une div sans bordure remplie de cellules horizontales auxquelles j'applique une bordure sur le bord bas pour les séparer entre elles. Le problème c'est que la dernière je ne veux pas de bordure basse puisqu'il n'y a plus de cellule sous elle. Je n'ai pas la main sur le HTML...
Haut