IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

envoi de formulaire par mail en php


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    association
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut envoi de formulaire par mail en php
    hello,

    J'essaye depuis plusieurs heures d'envoyer un formulaire de contact par mail sue ma page web

    J'utilise le script d'Adrien pellegrini et apparemment, losque j'envoie mon formulaire, je revient à ma page web ce qui signifie qu'il n'a pas été envoyé

    Sauriez vous d'ou cela peut il provenir

    je joins les codes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <form action="send_email.php" method="post">
        <p>
            <label for="civilite">Civilité :</label>
            <select id="civilite" name="civilite">
                <option value="mr" selected="selected">Monsieur</option>
                <option value="mme">Madame</option>
                <option value="mlle">Mademoiselle</option>
            </select>
        </p>
        <p>
            <label for="nom">Nom/Prénom :</label>
            <input type="text" id="nom" name="nom" />  
        </p>  
        <p>  
            <label for="email">E-mail :</label>  
            <input type="text" id="email" name="email" />  
        </p>
        <p>  
            <label for="sujet">Sujet :</label>  
            <input type="text" id="sujet" name="sujet" />  
        </p>  
        <p>  
            <label for="message">Message :</label>  
            <textarea id="message" name="message" cols="40" rows="4"></textarea>  
        </p>
        <p>
            <input type="submit" name="envoye" value="Envoyer" />
        </p> 
    </form>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    <?php
    /* Si le formulaire est envoyé alors on fait les traitements */
    if (isset($_POST['envoye']))
    {
        /* Récupération des valeurs des champs du formulaire */
        if (get_magic_quotes_gpc())
        {
          $civilite		= stripslashes(trim($_POST['civilite']));
          $nom	     	= stripslashes(trim($_POST['nom']));
          $expediteur	= stripslashes(trim($_POST['email']));
          $sujet		= stripslashes(trim($_POST['sujet']));
          $message		= stripslashes(trim($_POST['message']));
        }
        else
        {
          $civilite		= trim($_POST['civilite']);
          $nom		    = trim($_POST['nom']);
          $expediteur	= trim($_POST['email']);
          $sujet		= trim($_POST['sujet']);
          $message		= trim($_POST['message']);
        }
     
        /* Expression régulière permettant de vérifier si le 
        * format d'une adresse e-mail est correct */
        $regex_mail = '/^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$/i';
     
        /* Expression régulière permettant de vérifier qu'aucun 
        * en-tête n'est inséré dans nos champs */
        $regex_head = '/[\n\r]/';
     
        /* Si le formulaire n'est pas posté de notre site on renvoie 
        * vers la page d'accueil */
        if($_SERVER['HTTP_REFERER'] != 'http://www.o65.fr/ctopo/send_email.php')
        {
          header('Location: http://www.o65.fr/');
        }
        /* On vérifie que tous les champs sont remplis */
        elseif (empty($civilite) 
               || empty($nom) 
               || empty($expediteur) 
               || empty($sujet) 
               || empty($message))
        {
          $alert = 'Tous les champs doivent être renseignés';
        }
        /* On vérifie que le format de l'e-mail est correct */
        elseif (!preg_match($regex_mail, $expediteur))
        {
          $alert = 'L\'adresse '.$expediteur.' n\'est pas valide';
        }
        /* On vérifie qu'il n'y a aucun header dans les champs */
        elseif (preg_match($regex_head, $expediteur) 
                || preg_match($regex_head, $nom) 
                || preg_match($regex_head, $sujet))
        {
            $alert = 'En-têtes interdites dans les champs du formulaire';
        }
        /* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'e-mail */
        elseif (!isset($_COOKIE['sent']))
        {
            /* Destinataire (votre adresse e-mail) */
            $to = 'aaaaaa@o65.fr';
     
            /* Construction du message */
            $msg  = 'Bonjour,'."\r\n\r\n";
            $msg .= 'Ce mail a été envoyé depuis monsite.com par '.$civilite.' '.$nom."\r\n\r\n";
            $msg .= 'Voici le message qui vous est adressé :'."\r\n";
            $msg .= '***************************'."\r\n";
            $msg .= $message."\r\n";
            $msg .= '***************************'."\r\n";
     
            /* En-têtes de l'e-mail */
            $headers = 'From: '.$nom.' <'.$expediteur.'>'."\r\n\r\n";
     
            /* Envoi de l'e-mail */
            if (mail($to, $sujet, $msg, $headers))
            {
                $alert = 'E-mail envoyé avec succès';
     
                /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de 
                * renvoyer un mail en rafraichissant la page */
                setcookie("sent", "1", time() + 120);
     
                /* On détruit la variable $_POST */
                unset($_POST);
            }
            else
            {
                $alert = 'Erreur d\'envoi de l\'e-mail';
            }
     
        }
        /* Cas où le cookie est créé et que la page est rafraichie, on détruit la variable $_POST */
        else
        {
            unset($_POST);
        }
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html lang="fr">
    <head>
        <title>Contactez moi</title>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    </head>
    <body>
     
    <?php
    if (!empty($alert))
    {
        echo '<p style="color:red">'.$alert.'</p>';
    }
    ?>
     
     
     
    </body>

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 117
    Points
    117
    Par défaut
    ton code formulaire est il sur la même page que ton code php d'envoi de email?

    Si c'est sur deux pages différentes, genre le formulaire est sur la page test.php
    ta ligne 33 :
    le referrer doit être la page qui contient le formulaire donc
    http://www.o65.fr/ctopo/test.php

  3. #3
    Candidat au Club
    Homme Profil pro
    association
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci,

    j'ai sur mon ecran message envoyé avec succès

    Mais je n'ai pas reçu le message dans ma boite

    j'ai essayé avec un autre mail, idem

    Je suppose que maintenant, je dois voir avec mon FAI

    Je te remercie, tu m'enlèves une épine du pied

    Si tu as une autre idée que le FAI, merci de me la soumettre

    A+

  4. #4
    Candidat au Club
    Homme Profil pro
    association
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci, tout est bon

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Si je devine bien tu es hébergé chez Nuxit, j'ai bon ? Ils ont un lien vers le tuto d'Adrien Pellegrini dans leur pages d'aide.
    En fait je n'ai pas deviné, j'ai triché j'ai utilisé Whois…

    Si tu as lu attentivement ce tuto, tu te souviens du message d'avertissement au chapitre 3 :
    Citation Envoyé par Adrien Pellegrini
    Normalement la norme spécifie qu'il faut séparer les entêtes par un CRLF (\r\n). Cependant, certaines boîtes mail utilisent seulement un LF (\n). Donc si vous ne recevez pas votre mail essayez avec un LF.
    Plusieurs indices (ici, (2e note : « Si le message n'est pas reçu […] ») et ) me laissent penser que c'est effectivement la solution à ton problème.

    Attention c'est pas tout. La page mail du manuel PHP indique que les lignes du message ne doivent pas dépasser 70 caractères. Un choix malheureux de la part des concepteurs à mon avis, car la spécification indique que les lignes peuvent aller jusqu'à 998 caractères (même s'il est conseillé de s'arrêter à 78). C'est une erreur vicieuse car elle n'est pas signalée. Tout le monde se fait avoir…

    Si après avoir essayé ces deux trucs ton code ne marche toujours pas, va voir dans les commentaires de la page mail, ils sont en anglais mais ils contiennent des indications qui pourraient t'être utiles. Note que d'après le phpinfo public de Nuxit, ton serveur tourne sous Linux a priori, donc tu n'es pas concerné par les problèmes d'envoi de mails avec Windows.




    Attention avec le referer :
    Citation Envoyé par Manuel PHP
    'HTTP_REFERER'
    L'adresse de la page (si elle existe) qui a conduit le client à la page courante. Cette valeur est affectée par le client, et tous les clients ne le font pas. Certains navigateurs permettent même de modifier la valeur de HTTP_REFERER, sous forme de fonctionnalité. En bref, ce n'est pas une valeur de confiance.

    Je ne remets pas en question la qualité du tuto d'Adrien Pellegrini, mais il date de 2007 et les pratiques ont un peu évolué depuis.

    Le referer est facilement falsifiable, et donc on ne peut pas sérieusement l'utiliser pour sécuriser son application. Pire, en l'utilisant, tu rends ton site difficile d'accès aux utilisateurs qui n'envoient (volontairement ou non) pas de referer.

    Tu peux vérifier si ton propre navigateur envoie un referer ou pas en ouvrant la console F12 et en allant sur l'onglet réseau. Quand tu soumets le formulaire, un ligne POST apparaît ; clique dessus et consulte « en-têtes de la requête ».

    Comme solution alternative je te propose d'utiliser une variable de session. Les sessions reposent sur les cookies, mais je pense qu'il est plus correct de demander à l'utilisateur d'accepter un cookie plutôt que l'obliger à envoyer un referer.
    Concrètement, sur la page de ton formulaire tu définis une variable de session, par exemple $_SESSION['formVisite'] = true, puis tu vérifies cette variable dans ta page send_email.php à la ligne 33, au lieu de vérifier $_SERVER['HTTP_REFERER']. De cette manière tu es sûr que l'utilisateur est passé par la page du formulaire au moins une fois pendant sa session, ce qui limite les attaques depuis un site extérieur.

    Pour renforcer encore la sécurité, tu peux supprimer cette variable après l'avoir vérifiée, comme ça l'utilisateur ne peut pas re-soumettre de données sans passer à nouveau par le formulaire.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] Envoi de formulaire par mail
    Par IXORA dans le forum Langage
    Réponses: 4
    Dernier message: 06/02/2010, 23h32
  2. envoi de formulaire par mail qui redirige vers servlet
    Par erox44 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 09/07/2009, 15h58
  3. Envoie données formulaire par mail
    Par ju3979 dans le forum Langage
    Réponses: 3
    Dernier message: 31/03/2008, 14h10
  4. [Mail] envoi resultat formulaire par mail
    Par Salia-finance dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2007, 09h06
  5. [Mail] problème d'envoi de formulaire par mail
    Par alpking dans le forum Langage
    Réponses: 2
    Dernier message: 13/07/2006, 19h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo