【问题标题】:External PHP Email Request Responding with 500 Internal Server Error外部 PHP 电子邮件请求响应 500 内部服务器错误
【发布时间】:2017-03-12 19:24:18
【问题描述】:

我正在为一个网站创建一个联系我们的表单。我正在使用 jquery 为 html 按钮创建一个 .click() 函数。然后使用 ajax 调用 email.php 代码。当我单击按钮时,控制台显示以下错误:

500(内部服务器错误)。

我是 ajax 和 php 一起使用的新手,所以我现在不知道该怎么做。

这是 HTML 表单:

    <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>

这里是对 php 代码的 jQuery/AJAX 调用:

$(函数() {

$("#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);

});

});

最后,这是负责发送电子邮件的 php 代码:

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

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

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

    }

?>

任何帮助将不胜感激。

【问题讨论】:

  • 这可能不是错误,但在你的 data JS 对象中你没有任何“提交”键,所以你永远不会在电子邮件中输入你的 if .php。然后,尝试在邮件功能中添加一些看起来像电子邮件的东西。最后,您是否有 SMTP 服务器或者您是否配置了 sendmail 以便能够发送电子邮件?你的错误到底是什么? PHP 应该显示错误,尝试更新您的 php.ini 以显示它们
  • 我不知道这是否重要,但我使用的是 ECOWEBHOST 而不是本地服务器。另外,如何将提交键添加到我的数据对象?
  • 您使用什么作为 smtp 发送电子邮件?您的电子邮件将来自谁?

标签: php jquery ajax email internal-server-error


【解决方案1】:

首先,您的 JavaScript 代码中应该有一个“提交”键。

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

    var data = {
        to: "youremail@gmail.com",
        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");

        }
    });
});

我刚刚在数据变量中添加了一些行。不要忘记 PHP 中 $_POST 数组中收到的数据与您在 ajax 方法中发送的数据相同 在您发布的代码中,$_POST['name'] 未定义。

<?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)) 

}

?>

然后,正如另一个答案中所说,您应该尝试在自己的 PC 上进行开发,并且仅在您的网站完成后将其部署到您的服务器上。

例如,在基于 Debian 的操作系统上,您可以使用它:

$ sudo apt-get install apache2 mysql-server php5

此命令将在您的 PC 上安装 Apache 网络服务器、MySQL 服务器和 PHP 5。或者,正如另一个答案中所说,您可以使用 XAMP 做同样的事情。

网站运行后,您可以配置服务器以发送电子邮件。 This post 解释如何配置 php.ini 以使用您自己的邮件地址。当然,如果您愿意,您可以使用 Gmail 以外的其他服务。

如果您从自己的服务器收到一封邮件,这意味着您的代码是正确的。你 可以将其部署到服务器上,并在必要时以相同的方式进行配置。

【讨论】:

    【解决方案2】:

    错误 500 的问题在于它并不具体。它只是意味着“出了点问题”。仅凭错误 500 是不可能诊断出很多问题的。

    您需要找出导致错误 500 的原因,如果您知道错误 500 的位置,它将在您的 PHP 错误日志中。

    我要问你的第一个问题是——你在什么环境中运行 PHP?它是在您的计算机上还是在具有互联网服务提供商的网络服务器上?如果您不在 PC 上运行开发环境,我强烈建议您安装一些简单的东西,例如 XAMPP 并在那里进行开发。它对于高级开发人员来说并不理想,但对于学习 PHP 来说,这很好。尤其是因为它会写出正确的错误日志,您可以实际访问和阅读:)

    另一件事是查看 PHP 文档,该文档提供了一些关于邮件功能的方便信息:

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

    如您所见 - mail() 期望在可以访问 sendmail 命令的系统上运行。如果您正在运行 php 的系统没有 sendmail 或可能没有 sendmail,这可能是您的问题。但是,如果没有错误日志可以查看,我只能猜测。

    所以我的建议是先尝试本地安装 PHP。并且对于本地运行的 PHP(例如使用 xampp),您还必须设置 SMTP 服务器详细信息 - 用于发送邮件的服务器、用户名和密码以及安全详细信息。但是您可以访问更全面的日志和错误信息。

    【讨论】:

    • 我实际上首先在 XAMPP 上尝试过,它运行良好,没有错误,但由于它是在 localhost 上运行的,它实际上并没有发送电子邮件。现在我在 ECOWEBHOST 上运行它,我得到内部服务器错误
    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多