【问题标题】:PHP mail() is not functioningPHP mail() 不起作用
【发布时间】:2015-04-08 13:34:27
【问题描述】:

自从过去两天以来,我一直在尝试在 JavaScript 和 PHP 之间进行通信。在阅读了其他人遇到的类似问题的大量教程、建议和解决方案后,我还无法按预期成功。可以这么说,我是在我的一个域上编程,而不是在本地编程。

目标是:

从我的 JavaScript 中格式正确的对象向我的电子邮件地址发送格式非常正确的字符串。为了做到这一点,我知道需要使用著名的 email() 函数来执行 PHP 脚本。

为实现目标所采取的步骤:

  1. 拥有一个功能正常的 JavaScript(没有错误),可以创建数据并将数据填充到上述 JS 对象(命名为:'person');
  2. 将其格式化为一个好的字符串(因为我希望它以纯文本格式而不是 HTML 格式发送);
  3. 让 jQuery 的 $.ajax() 调用与服务器端进行 CORS 交互,这是一个包含必要标头和代码的 PHP发送一封简单的邮件到指定的目的地(例如我的电子邮件地址)。
  4. (可选)经过 GZIP 压缩,缩小 HTML/CSS/JS 以更快地向客户端加载内容。

问题是什么?

我的 AJAX 代码运行平稳,没有错误,但与预期和预期不符。它没有跳入/进入 SUCCESS,而是立即进入 ERROR 自定义功能,我似乎无法破译可能出现的问题。

我将在 JS(AJAX 调用)和我用来实现上述目标的 PHP 脚本下方发布。

JavaScript(更新):

function submitOnClick() {
    var full_name = "John Doe";
    var profile_person = "--[Name: John, Surname: Doe, Birthday: 25/02/1950]--";    
    var hr = new XMLHttpRequest();
    hr.open("POST", "submit_to_email.php", true);
    hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    hr.send("full_name=" + full_name + "&" + "person=" + profile_person);
    hr.onreadystatechange = function () {
        if (hr.readyState == 4 && hr.status == 200) {
            var data = hr.responseText;
            console.log("PHP responded with: " + data);
        }
    }
}

PHP 脚本(更新):

<?php
    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
    header('Content-Type: application/json');
    $postvars = $_POST['person'];
//var_dump($postvars);

if (isset($postvars)) { 
  $to = 'to@gmail.com';
  $subject = 'Subject Title';
  $email_message = $postvars;
  $headers = 'From: noreply@mydomain.com'."\r\n".
  'Reply-To: noreply@mydomain.com'."\r\n" .
  'X-Mailer: PHP/' . phpversion();
  $checker = @mail($to, $subject, $email_message, $headers);

  if ($checker == true) {
      echo 'Mail was sent to'.$to;
  }
  else {
      echo 'Mail was NOT sent to'.$to;
  }
}
?>

<?php
  die();
?>

更新

$.ajax() 根本没有必要,而是开始使用带有 XMLHttpRequest() 方法的普通 JS。内容已成功发送到我的 PHP 文件,但通过检查 mail() 是否为真/假(已发送/未发送)结果 FALSE。需要一个配置文件来为 PHP 提供我的 SMTP 设置信息。我正在使用 Arvixe 托管,它安装了一个 IIS 服务器。我对网络托管和维护域有点陌生,因此我不知道是否应该在我的项目文件夹中配置 web.config 文件或添加扩展 PHP 配置文件。

【问题讨论】:

  • 我看不到你从哪里得到 $_POST['some'] 数据
  • $postvars = file_get_contents('php://input');类似于使用 $_POST['some]。如果我不得不使用后者,那么我必须在 ajax 的“数据”属性中使用一个对象,而不是数组。
  • 尝试这样做并打印出来进行调试。如果您可以获得适当的数据,那么您解析的方式就有问题。将它用于您的 JSON jsonlint.com 另外,您不会在错误时缺少分号:onFailure }) 吗?
  • 缺少分号:真。现在更新了。如何实现将 php 中的解析值打印到控制台或我的 DOM 元素中的任何位置?
  • 我试过你的确切代码。我不得不注释掉 mail() 函数,因为它在我的 PC 上没有很好地配置,所以它给了我一个错误,但是在这样做之后,我没有出错。您的问题肯定出在mail() 抛出错误,从而发送 500 错误代码或使输出无效 JSON,因此 jQuery 将其视为错误。

标签: javascript php email smtp


【解决方案1】:

我认为您唯一需要将带有相关代码 200 的成功标题放在您的答案中。

如果您的回答是 json 格式,则 jquery 读取该代码以重定向到成功或错误处理程序。

检查头php函数:

Header Function PHP

告诉我是否有效。

【讨论】:

  • 我也调查过。但问题是,如果它在没有 OK 响应标题的情况下工作,它将在第一行发送一封电子邮件。所以我想问题不在那里。据我所知,问题在于 ajax 中的 contentType/dataType 不适合 PHP 中提到的标头。
  • 尝试检查失败或成功处理程序中的数据变量,并在 json 答案中查找问题;记得检查邮件功能是否成功发送响应(php.net/manual/es/function.mail.php)。
【解决方案2】:

经过几天的研究,我终于找到了一种可能且非常有效的解决方案。问题在于我的域设置为在具有 IIS 托管的 Windows Server 2008+ 上运行,因此 PHP 的 mail() 函数不完整,无法执行邮件。

解决方案过去和现在都是:PHPMailer 是一个非常常见且最常用的 php 库,专门设计用于向开发人员提供自信且简单的代码。我已经从 GitHub 源下载了它作为 zip,然后解压缩。之后创建一个空白的新 php 文件并复制/粘贴有关如何发送邮件的演示脚本并将其更改为我的需要。最后将 PHPMailer 文件夹和新创建的脚本上传到我的域。手动执行脚本后,我在收件箱中收到了邮件,而不是垃圾邮件。这个tutorial 也救了我一条命。 脚本如下:

<? php
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
    header('Content-Type: application/json');

    $postvars = $_POST['person'];
    if (isset($postvars)) {
        $to = 'recipient@gmail.com';
        $subject = 'Some Title';
        $email_message = $postvars;

        require 'PHPMailerAutoload.php'; // The script needed to be called in order to executed
        // further commands below

        $mail = new PHPMailer;

        $mail - > isSMTP(); // Set mailer to use SMTP
        $mail - > Host = 'smtp.mydomain.com'; // Specify main and backup SMTP servers
        $mail - > SMTPAuth = true; // Enable SMTP authentication
        $mail - > Username = 'mymail@mydomain.com'; // SMTP username
        $mail - > Password = 'password_here'; // SMTP password
        $mail - > SMTPSecure = 'ssl'; // Enable TLS encryption, `ssl` also accepted
        $mail - > Port = 465; // TCP port to connect to

        $mail - > CharSet = 'UTF-8'; // Character set specified because I use "ë" and other ones
        $mail - > From = 'mymail@mydomain.com'; // The same email address as specified above for authentication
        $mail - > FromName = 'Myself'; // The name of the sender (optional)
        $mail - > addAddress($to, 'recipients_name'); // Add a recipient & name (optional)
        $mail - > addReplyTo('mymail@mydomain.com', 'Some text'); // To who to reply
        $mail - > WordWrap = 70; // Wrapping words
        $mail - > isHTML(true); // if TRUE , format is HTML or FALSE, format is Plain Text

        $mail - > Subject = $subject;
        $mail - > Body = $email_message; //Plain or HTML formatted string
        $mail - > AltBody = $email_message; //The same as Body BUT it has to be Plain text always

        if (!$mail - > send()) {
            echo 'Message could not be sent.';
            echo 'Mailer Error: '.$mail - > ErrorInfo;
        } else {
            echo 'Message has been sent';
        }
    } 
?>

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2012-07-06
    • 2011-08-15
    • 2012-07-22
    相关资源
    最近更新 更多