PHP mail()无法正常运行

时间:2015-04-08 13:34:27

标签: javascript php email smtp cors

我从最近两天开始尝试在JavaScript和PHP之间进行通信。在阅读了许多其他人遇到的类似问题的教程,建议和解决方案后,我无法按预期成功。可以这么说,我是在我的一个领域进行编程,而不是在本地编程。

目标是:

向我的电子邮件地址发送一个格式良好的字符串,该字符串来自JavaScript中格式正确的对象。为了做到这一点,我确实理解需要用它着名的email()函数执行PHP脚本。

为目标采取的步骤:

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

    我的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()根本没有必要,而是开始使用普通的vanilla JS和XMLHttpRequest()方法。内容通过检查mail()成功发送到我的PHP文件,如果它的真/假(发送/不发送)导致 FALSE 。需要配置文件来为PHP提供SMTP设置的信息。我使用的是Arvixe托管,它安装了IIS服务器。我对网络托管和维护域有点新意,因此我不知道是否应该在项目文件夹中配置web.config文件或添加扩展的PHP配置文件。

2 个答案:

答案 0 :(得分:0)

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

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

检查标头php功能:

Header Function PHP

告诉我是否有效。

答案 1 :(得分:0)

经过数天的研究,我终于找到了一种可行且非常有效的解决方案。问题在于我的域名设置为在带有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';
        }
    } 
?>