2016-10-30 2 views
0

Ich arbeite an der Erstellung eines Kontaktformulars für eine Website. Ich benutze jquery, um eine .click() - Funktion für eine HTML-Schaltfläche zu erstellen. dann mit ajax den email.php code aufrufen. Wenn ich auf die Schaltfläche klicke, zeigt die Konsole den folgenden Fehler an:Externe PHP E-Mail-Anfrage mit 500 internen Server Fehler

500 (Interner Serverfehler).

Ich bin neu zu Ajax und PHP zusammen verwendet werden, so habe ich keine Ahnung, was zu diesem Zeitpunkt zu tun ist. Hier

ist das HTML-Formular:

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    <script src = "js/callmail.js"></script> 

</head> 

<body ng-app = ""> 

      <div class = "container"> 

    <form name = "contact"> 

     <label for = "subject" class = "control-label">Subject:</label> 
     <input name = "subject" id = "subject" ng-model = "subject" required/> 
     <span class = "warning" ng-show="contact.subject.$touched && contact.subject.$invalid">You Must Enter a subject!</span> 
     <span class = "success" ng-show="contact.subject.$touched && contact.subject.$valid">Valid!</span> 

     <br/> 

     <label for = "body" class = "control-label">Body:</label> 
     <input name = "body" id = "body" ng-model = "body" required/> 
     <span class = "warning" ng-show="contact.body.$touched && contact.body.$invalid">Your email must have a body!</span> 
     <span class = "success" ng-show="contact.body.$touched && contact.body.$valid">Valid!</span> 

     <br/> 

     <label for = "signature" class = "control-label">Return Email:</label> 
     <input name = "signature" id = "signature" ng-model = "signature" type = "email" required/> 
     <span class = "warning" ng-show="contact.signature.$touched && contact.signature.$invalid">You must enter a valid return email!</span> 
     <span class = "success" ng-show="contact.signature.$touched && contact.signature.$valid">Valid!</span> 

     <br/> 

     <button ng-disabled = "contact.$invalid" id = "sendmail" type = "submit" class = "btn btn-success">Submit</button> 

    </form> 

    </div> 

und hier ist die jQuery/AJAX Aufruf der PHP-Code:

$ (function() {

$("#sendmail").click(function() { 

    var data = { 

     to: "myemail", 
     subject: $("#signature").val() + ": " + $("#subject").val(), 
     message: $("#body").val() 
    } 

    $.ajax({ 

     type: "POST", 
     url: "email.php", 
     data: data, 
     success: function() { 

      alert("Message sent"); 

     } 

    }); 

    console.log(data); 

}); 

});

Und schließlich ist hier der PHP-Code, der für das Senden über die E-Mail verantwortlich ist:

<?php 
    if ($_POST["submit"]) { 

     $subject = $_POST["subject"]; 
     $message = $_POST["message"]; 
     $headers = "From: " . $_POST["name"] . "Reply to: " . $_POST["signature"]; 

     mail("myemail", $subject, $message, $headers)) 

    } 

?> 

Jede Hilfe wäre sehr geschätzt.

+1

Es ist wahrscheinlich nicht der Fehler, aber in Ihrem * data * JS-Objekt haben Sie keinen "submit" -Schlüssel, so dass Sie niemals in Ihre Email in der email.php eintreten werden. Dann versuchen Sie, etwas, das auf eine E-Mail in Mail-Funktion aussieht. Schließlich haben Sie einen SMTP-Server oder haben Sie * sendmail * konfiguriert, um E-Mails senden zu können? Was ist genau dein Fehler? PHP sollte einen Fehler anzeigen, versuchen Sie, Ihre php.ini zu aktualisieren, um sie anzuzeigen – AnthonyB

+0

Ich weiß nicht, ob das wichtig ist, aber ich verwende ECOWEBHOST nicht einen lokalen Server. Wie kann ich den Übergabeschlüssel zu meinem Datenobjekt hinzufügen? –

+0

Was verwenden Sie als SMTP, um Ihre E-Mails zu senden? Von wem kommen deine E-Mails? – Dom

Antwort

0

Das Problem mit Error 500 ist, dass es nicht spezifisch ist. Es bedeutet nur "etwas ist schief gelaufen". Es ist unmöglich, mit nur einem Fehler 500 viel zu diagnostizieren.

Was Sie herausfinden müssen, ist, was den Fehler 500 verursacht hat, der in Ihrem PHP-Fehlerprotokoll wäre, wenn Sie wissen, wo das ist.

Die erste Frage, die ich Ihnen stellen möchte, ist - in welcher Umgebung betreiben Sie PHP? Ist es auf Ihrem Computer oder auf einem Webserver mit einem Internetdienstanbieter? Wenn Sie keine Entwicklungsumgebung auf Ihrem PC betreiben, rate ich Ihnen dringend, etwas Einfaches wie XAMPP zu installieren und dort zu entwickeln. Es ist nicht ideal für fortgeschrittene Entwickler, aber um PHP zu lernen, ist es gut. Nicht zuletzt deshalb, weil es die richtige Fehlerprotokolle schreibt können Sie tatsächlich zugreifen und lesen :)

Die andere Sache, an der PHP-Dokumentation zu sehen ist, die einige nützliche Informationen über die Mail-Funktion bietet:

http://php.net/manual/en/mail.requirements.php

Wie Sie sehen können - erwartet mail() auf einem System mit Zugriff auf einen Sendmail-Befehl ausgeführt werden. Wenn das System, auf dem Sie php ausführen, kein sendmail besitzt oder sendmail nicht hat, könnte das Ihr Problem sein. Aber ohne ein Fehlerprotokoll zu betrachten, mache ich Vermutungen.

Also mein Rat wäre, eine lokale Installation von PHP zuerst zu versuchen. Und auch mit lokal laufendem PHP (zB mit xampp) müssen Sie die SMTP-Serverdetails einrichten - den Server, den Benutzernamen und das Passwort sowie die Sicherheitsdetails, die Sie zum Senden von E-Mails verwenden. Aber Sie erhalten Zugriff auf viel umfassendere Protokolle und Fehlerinformationen.

+0

Ich habe es tatsächlich zuerst auf XAMPP versucht und es hat gut funktioniert, kein Fehler, aber da es auf localhost ausgeführt wurde, hat es die E-Mail nicht wirklich gesendet. Jetzt starte ich es auf ECOWEBHOST und ich bekomme den Internal Server Error –

0

Zuerst sollten Sie einen "Submit" -Schlüssel in Ihrem JavaScript-Code haben.

$("#sendmail").click(function() { 

    var data = { 
     to: "[email protected]", 
     subject: $("#signature").val() + ": " + $("#subject").val(), 
     message: $("#body").val(), 
     signature: $('#signature').val(), 
     name: "Your name", 
     submit: true //You'll receive $_POST['submit'] in email.php 
    } 

    $.ajax({ 
     type: "POST", 
     url: "email.php", 
     data: data, 
     success: function() { 
      alert("Message sent"); 

     } 
    }); 
}); 

Ich habe gerade einige Zeilen in der Datenvariablen hinzugefügt. Vergessen Sie nicht Die in $ _POST Array in PHP empfangenen Daten sind die gleichen, die Sie in Ihrer Ajax-Methode gesendet haben In dem Code, den Sie gepostet hatten, war $ _POST ['name'] undefiniert.

<?php 
if ($_POST["submit"]) { 
    $subject = $_POST["subject"]; 
    $message = $_POST["message"]; 
    $headers = "From: " . $_POST["name"] . "Reply to: " . $_POST["signature"]; 
    //Use the receiver email you've set in your JS 
    $to = $_POST['to']; 

    mail($to, $subject, $message, $headers)) 

} 

?> 

Dann sagte wie in einer anderen Antwort, sollten Sie zu entwickeln versuchen, auf Ihrem PC besitzen und nur dann, wenn Ihre Website fertig ist es auf Ihren Server bereitstellen.

Auf einem Debian-basiertes Betriebssystem zum Beispiel können Sie es verwenden:

$ sudo apt-get install apache2 mysql-server php5

Dieser Befehl wird einen Apache Webserver, MySQL-Server und PHP 5 auf Ihrem PC installieren. Oder, wie in einer anderen Antwort gesagt, können Sie XAMP verwenden, die die gleichen Dinge tun.

Sobald Sie eine Website ausgeführt haben, können Sie Ihren Server zum Senden von E-Mails konfigurieren. This post erklären, wie Sie die php.ini konfigurieren, um Ihre eigene Mailadresse zu verwenden. Natürlich können Sie auch andere als Google Mail verwenden, wenn Sie möchten.

Wenn Sie eine E-Mail von Ihrem eigenen Server erhalten, bedeutet dies, dass Ihr Code richtig ist. Sie können auf dem Server bereitstellen und bei Bedarf auf die gleiche Weise konfigurieren.

Verwandte Themen