Bonjour,

N'ayant que peu de connaissance en php, j'utilisais un générateur online de formulaire [http://www.ge-net.ch/page/rw-wfco-owb-0.html] qui fonctionnait parfaitement jusqu'à présent.
Après changement de formule d'hébergement chez Oleane, il ne fonctionne plus: pas d'erreur à l'envoi, mais email jamais reçu.

J'ai testé diverses solutions (toujours online): même résultat, puis je suis tombé sur ce tuto [http://www.grafikart.fr/tutoriels/php/formulaire-contact-avance-php-55] que j'ai suivi à la lettre en essayant de comprendre : toujours le même résultat, le mail n'arrive pas! Et sans message d'alarme à l'envoi.

Questions:

1 - Les autres sites étaient sous php 4.3.x, maintenant ils sont sous php 5.3.x. Le tuto étant plutôt ancien, n'y aurait-il pas un problème de syntaxe?

2 - Lors de mes pérégrinations internetistiques, j'ai vu que, par sécurité, certains serveur n'autorisaient pas l'envoi d'email de formulaire vers une adresse autre que celle au nom de domaine. Si site "monsite.com", le destinataire doit être obligatoirement à nom.destinataire@monsite.com (nom.destinataire@autrepart.com ne fonctionnant pas).
Est-il possible de faire une vérification?

Merci par avance si vous pouvez éclairer ma lanterne.

Pour info, mon fichier "contact.php":

<?php
if(!empty($_POST)){
    extract($_POST);
    $valid =true;
    if(empty($nom)){
        $valid=false;
        $erreurnom="Nom: pas rempli";
    }
    if(!preg_match("/^[a-z0-9\-_.]+@[a-z0-9\-_.]+\.[a-z]{2,4}$/i",$email)){
        $valid=false;
        $erreuremail= "Email: non valide";
    }
    if(empty($email)){
        $valid=false;
        $erreuremail="Email: pas rempli";
    }
    if(empty($message)){
        $valid=false;
        $erreurmessage="Message: pas rempli";
    }
    if(valid){
        $to = "moi@free.fr";
        $sujet = $nom. "a contacté le site";
        $header = "From: $nom <$email>";
        if(mail($to,$sujet,$message,$header)){
            $erreur = "Message parvenu";
            unset($nom);
            unset($email);
            unset($message);
        }
        else{
            $erreur = "ERREUR, mail pas parti";
        }
    }
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Formulaire</title>
</head>

<body>
    <div>
<h1>Contact:</h1><hr>

    <?php
    if(isset($erreur)) { echo "<p>$erreur</p>"; }
    ?>
<form method="post" action="contact.php"
      <p><label for="nom">Nom: </label>
     <input type="text" name="nom" id="nom" value="<?php if(isset($nom)) echo $nom; ?>"/>
      <span class="error-message"><?php if(isset($erreurnom)) echo $erreurnom; ?></span>
      </p>

      <p><label for="email">Email: </label>
     <input type="text" name="email" id="email" value="<?php if(isset($email)) echo $email; ?>"/>
      <span class="error-message"><?php if(isset($erreuremail)) echo $erreuremail; ?></span>
      </p>

      <p><label for="message">Votre message: </label>
     <textarea name=message" id="message"><?php if(isset($message)) echo $message; ?></textarea><br/>
      <span class="error-message"><?php if(isset($erreurmessage)) echo $erreurmessage; ?></span>
      </p><br/>

     <input type="submit" value"Envoyer">

 </form>     
</div>
</body>
</html>

17 réponses


Bonjour,
Une fois vos test fini, vous tester s'il y a des erreurs. Mais vous tester une fonction et non la variable $valid
La bonne syntaxe est:

if($valid){
// J'envoi mon mail
} else {
// J'affiche les erreurs
}

Bonjour.
Commences déja par regarder du côté des logs d'Appache par exemple, tu devrais y voir l'erreur, car à mon avis, tu n'as pas l'affichage par défaut de toutes les erreurs liées au serveur.
En regardant dans les logs, tu devrais y trouver l'erreur concernant l'envoi de mail et à partir du moment que nous pourrons la voir, nous pourrons vraiment t'aider et non te proposer des solutions en faisant des suggestions (c'est la plupart du temps, plus une perte de temps qu'autre chose).
La proposition de Carouge10 est plutôt bonne, ce qui m'étonne d'ailleurs, c'est que ton code ait pu fonctionné avant et donc envoyer des emails.

verdigny
Auteur

@ Carouge10 : Merci. Je ne l'avais pas vu celle-ci ;-(. Corrigé mais ça ne resoud pas le problème.
@ Lartak: Comment lire les logs (ou afficher les erreurs)? Je suis sous serveur mutualisé et pense pas être en mesure de modifier le php.ini pour le paramètre error_reporting
NOTE: Le code n'a jamais fonctionné et je ne peux pas vérifier avec une adresse mail du nom de domaine car Oleane m'a créé un espace d'hébergement provisoire pour les tests en attendant d'y installer la version définitive du site.
Merci pour tout.

Alors 3 choses.
1/ La balises ouvrante du <form ..... > n'est pas fermé
2/ Manque un " dans le name de la balise textarea
3/ Il manque un = dans le input d'envoi value="Envoyer".

Hello, ce tutoriel ci est beaucoup plus récent :
http://www.grafikart.fr/tutoriels/php/formulaire-php-21

verdigny
Auteur

Aucun script ne fonctionne.
Probablement un problème coté serveur. Je vais voir avec le support Orange Business Service.
Encore merci.

Je suis vraiment d'accord avec @kewai, je crois que tu dois voir ce tuto

verdigny
Auteur

@kewai : comme indiqué précedement, ça ne fonctionne pas;
Le même code SANS AUCUNE MODIFICATION sur 3 serveurs différents:
1 - Fonctionne parfaitement sur des serveurs en php 4.3.x et 4.4.x
2 - Ne fonctionne pas sur le serveur en 5.3.x

Est-ce qu'un ancien code peut ne pas fonctionner sur une version de php plus récente? (Instructions obsolètes?...)

Bonsoir,

Si vous avez suivi le tutoriel, pouvez-vous nous mettre le code de contact.php et post_contact.php ?

Bonsoir.
Si tu n'as pas accès aux fichiers du système, ça complique les choses, dans ce cas là, fais en sorte de récupérer l'erreur retournée par la fonction mail de php et inscrit là par exemple dans un fichier d'erreurs que tu crées.

Est-ce qu'un ancien code peut ne pas fonctionner sur une version de php plus récente? (Instructions obsolètes?...)

Bien sûr que oui, c'est d'ailleurs plutôt logique.

http://php.net/manual/fr/function.extract.php

il n'y aurait pas un soucis avec ton extract $_POST ? ~ register_global

Après si c'est réellement ton code, tu nous sors un if(valid) ... manquerait un $...
Ajout un débug avec des var_dump/confirmation dans ton script pour savoir ce qui passe et ce qui ne passe pas. si tout est bon et qu'il ne reste plus que l'envoie de l'email, c'est que c'est la fonction mail() ou le serveur sortant qui déconne.

Bonjour,

Il se peut que tout simplement la fonction mail() est désactivé sur le serveur et les hébergeurs ne souhaitent pas l'activer. Si c'est le cas, il faut trouver une alternative afin d'envoyer et/ou de recevoir vos mails.

Cordialement.

verdigny
Auteur

Merci à tous de vous interresser à mon cas.

@ Carouge10:
Pour info, j'utilise Boostrap et le tuto "Décomposer un site en PHP avec obStart" qui fonctionne très bien :-). Merci à l'auteur!.
La page "post_contact.php" qui apparait après l'envoi est vide (sans erreur)

  • fichier: contact.php
    <?php
    $title="<title>Formulaire de contact</title>";
    ?>
    <div class="container">
        <div>
            <form action="../content/post_contact.php" method="POST">
                <div class="row">
                    <div class="col-xs-6">
                        <div class="form-group">
                            <label for="inputname">Votre Nom: </label>
                            <input type="text" name="name" class="form-control" id="inputname">
                        </div>
                    </div> <!-- .col-md-6 -->   
                    <div class="col-xs-6">
                        <div class="form-group">
                            <label for="inputemail">Votre Email: </label>
                            <input type="text" name="email" class="form-control" id="inputemail">
                        </div>
                    </div> <!-- .col-md-6 -->                
                    <div class="col-xs-12">
                        <div class="form-group">
                            <label for="inputmessage">Votre message: </label>
                            <textarea id="inputmessage" name="message" class="form-control"></textarea>
                        </div>
                        <button type="submit" class="btn btn-primary">Envoyer</button>
                    </div> <!-- .col-xs-12 -->     
                </div> <!-- .row -->   
            </form>        
        </div> 
    </div> <!-- .container -->
  • Fichier "post_contact.php:
    $message = $_POST['message'];
    $headers = 'FROM: contact@site.fr';
    mail('xxxxxxxx@free.fr', 'formulaire de contact', $message, $headers);
    ?>
    Je me suis arrêté là car inutile d'aller plus loin si, déjà, la première étape ne fonctionne pas.

    @ kewai & FleuryK
    "var_dump" : me renvoie les bonnes informations (Nom, Email, Message).

Dans "info.php"

Directive                       Local Value                             Master Value
mail.add_x_header:          Off                                         Off
sendmail_from:              no value                                no value
sendmail_path:              /usr/sbin/sendmail -t -i        /usr/sbin/sendmail -t -i 

Est-ce correct?

Bonjour,

Pour ma part (j'ai mon propre serveur), dans mail.add_x_header j'ai On par contre je sais pas si c'est en local ou master :s

Sinon pour le reste, c'est correct.

Cordialement.

Vous êtes sous quel hébergeur ?

verdigny
Auteur

Bonjour,
Hébergeur: Oleane (Orange Business Service)

Je pencherais qyabd meme pour une connerie chez l'hébergeur... Essaye en utilisant le SMTP. Sinon tu a toujours mandrillapp. Ou change d'hébergement si Il s'avere que c'est bien lui qui deconne.