0 votes

ERREUR ! Message lors de la soumission d'un simple formulaire de courrier électronique. (PHP)

Je viens d'acheter un modèle de site Web de DreamTemplate.com, et j'ai essayé d'envoyer un e-mail d'essai à partir de celui-ci en ligne et au lieu d'envoyer l'e-mail, il vient juste avec un texte rouge disant : "ERREUR !".

Je ne suis pas très familier avec PHP, mais je peux comprendre la syntaxe. Le code est ci-dessous :


Contact.html

<script type="text/javascript">
    // <![CDATA[
    jQuery(document).ready(function () {
        $('#contactform').submit(function () {
            var action = $(this).attr('action');
            $.post(action, {
                name: $('#name').val(),
                email: $('#email').val(),
                company: $('#company').val(),
                subject: $('#subject').val(),
                message: $('#message').val()
            }, function (data) {
                $('#contactform #submit').attr('disabled', '');
                $('.response').remove();
                $('#contactform').before('<p class="response">' + data + '</p>');
                $('.response').slideDown();
                if (data == 'Message sent!') $('#contactform').slideUp();
            });
            return false;
        });
    });
    // ]]>
</script>

Contact.PHP

<?php

if(!$_POST) exit;

$email = $_POST['email'];

//$error[] = preg_match('/\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i', $_POST['email']) ? '' : 'INVALID EMAIL ADDRESS';
if(!eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."@"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$email )){
    $error.="You've entered an invalid e-mail address.";
    $errors=1;
}
if($errors==1) echo $error;
else{
    $values = array ('name','email','message');
    $required = array('name','email','message');

    $your_email = "enquiries@ourdomain.com";
    $email_subject = "New Message: ".$_POST['subject'];
    $email_content = "new message:\n";

    foreach($values as $key => $value){
      if(in_array($value,$required)){
        if ($key != 'subject' && $key != 'company') {
          if( empty($_POST[$value]) ) { echo 'PLEASE FILL IN REQUIRED FIELDS'; exit; }
        }
        $email_content .= $value.': '.$_POST[$value]."\n";
      }
    }

    if(@mail($your_email,$email_subject,$email_content)) {
        echo 'Message sent!'; 
    } else {
        echo 'ERROR!';
    }
}
?>

Quelqu'un peut-il m'aider ? Je ne sais pas pourquoi ça ne marche pas. Toute aide est la bienvenue.

Merci.


Mise à jour : Comme conseillé, j'ai supprimé le symbole @ avant 'mail'. Il affiche maintenant des messages d'erreur utiles :

"Avertissement : mail() [function.mail] : Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in E:\web\autoopti\contact.php sur la ligne 31 ERREUR !"

1voto

Jason B Points 447

Votre code ne parvient pas à envoyer le message électronique. Vous devez déboguer les informations qu'il reçoit, afin d'avoir une chance de comprendre ce qui se passe.

Tout d'abord, supprimez le '@' avant mail(...). Le '@' supprime (lentement) toutes les erreurs que la fonction mail() émet, ce qui signifie que vous n'obtenez pas les informations dont vous avez besoin pour corriger le problème. Idéalement, si cette fonction reçoit des données correctement formées, vous n'aurez pas d'erreur. Le pire qui puisse arriver dans ce cas est que l'adresse électronique fournie soit mal formée.

Ensuite, je commencerais à déboguer les données transmises. Utilisez la fonction echo() pour imprimer les valeurs de $your_email, $email_subject et $email_content afin de vérifier qu'elles sont correctement formées. La fonction echo() s'utilise comme suit :

echo($your_email);
echo($email_subject);
echo($email_content);

Vous voyez l'idée.

Si cela ne vous aide pas, ou si la suppression du '@' vous donne des problèmes, envoyez un message avec le résultat de l'erreur. Cela nous aidera à mieux vous aider.

1voto

Jason B Points 447

Je poste une autre réponse basée sur l'édition de l'OP.

L'exécutez-vous sur votre machine locale ou sur un autre serveur Windows ? Vous devez avoir un serveur SMTP qui fonctionne sur la machine à partir de laquelle vous essayez d'exécuter mail(). Veuillez consulter ces articles : Un Deux pour des instructions de base sur la configuration d'un serveur SMTP, ou Google a les réponses.

Explication rapide de ce qu'est et fait un serveur SMTP : c'est le relais du courrier. Le serveur SMTP met en œuvre les protocoles de messagerie pour acheminer les e-mails vers leur(s) destination(s) appropriée(s).

EDITAR: Si vous avez envie de plonger tête baissée dans PHP, et que vous ne voulez pas vous embêter à mettre en place un serveur SMTP local, vous pouvez utiliser la méthode suivante PHPMailer pour utiliser le serveur SMTP de votre FAI ou un autre serveur SMTP distant, où il est déjà configuré pour vous. Il existe de nombreux exemples de code.

J'espère que cela vous aidera !

1voto

madhatter Points 11

J'ai le même code et il fonctionne très bien sur un hôte linux par hostmonster sans aucun problème ; je l'ai déplacé sur web.com et la frustration boom me conduit ici. Je dirais qu'il faut le déplacer d'un serveur basé sur Windows et vous n'aurez pas de problème.

0voto

Sylverdrag Points 3373

D'après l'erreur, il semble que votre configuration php.ini pour le serveur smtp soit incorrecte.

Vous pouvez le tester en essayant d'exécuter un simple script PHP :

<?php
mail("your_email", "Test", "test message")
?>

Cela lève tout doute sur les données qui sont transmises à votre fonction de messagerie.

Maintenant, à part ça, il y a quelques bizarreries dans votre code :

En regardant votre jQuery, je peux voir que vous obtenez le message par "val()". Cela ne fonctionne pas avec un TextArea, si je me souviens bien, donc cela pourrait être un problème si vous utilisez une zone de texte pour obtenir le message.

Dans le code PHP, je pense que cette partie ne fonctionne pas comme vous l'attendez :

$values = array ('name','email','message');
...
foreach($values as $key => $value){
      if(in_array($value,$required)){
        if ($key != 'subject' && $key != 'company') {
...

Votre tableau ne spécifie aucune clé, donc en interne, votre tableau ressemble à :

[0]=>name;
[1]=>email...

Donc vous vous retrouvez avec if ( 0 != 'subject' && 0 != 'company') {...

Cependant, ce test est en fait inutile, car la ligne précédente s'assure déjà que votre valeur est dans le tableau requis, et puisque "subject" et "company" ne sont pas dans le tableau requis, cette ligne ne sera jamais vraie.

Pour l'instant, votre contact.php n'utilise pas les données envoyées par le jQuery. Je suppose que c'est volontaire car vous ne faites que des tests, non ?

Un autre problème est que vous ne validez pas du tout vos données. Votre formulaire pourrait être utilisé pour envoyer du spam partout en utilisant votre compte. Est-ce parce que votre fonction est encore en phase de test ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X