PHP邮件()不起作用

PHP mail() is not functioning

本文关键字:不起作用 邮件 PHP      更新时间:2023-09-26

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

目标是:

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

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

  1. 有一个正常工作的JavaScript(没有错误),它可以创建并向上述JS对象填充数据(名称为:'person')
  2. 将它格式化为一个好的字符串(因为我希望它以纯文本格式发送,而不是HTML格式)
  3. 让jQuery的$.ajax()调用与服务器端进行CORS交互,服务器端是一个PHP,包含必要的Header和将简单邮件发送到指定目的地(例如我的电子邮件地址)的代码
  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配置文件。

我认为你唯一需要把成功的标题和相关的代码200放在你的答案中。

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

check header php函数:

标题函数PHP

告诉我是否有效。

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

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

<? 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';
        }
    } 
?>