收到ajax POST请求时PHP mail()不起作用

Posted

技术标签:

【中文标题】收到ajax POST请求时PHP mail()不起作用【英文标题】:PHP mail() not working when receiving an ajax POST request 【发布时间】:2015-04-23 00:40:34 【问题描述】:

我已经设置了一个表单,它使用 jQuery ajax 向外部 php 文件发送 POST 请求,然后发送电子邮件。我收到 200 状态码,但没有收到电子邮件。

这里是 jQuery:

var ajaxSend = function(dataObj) 
        $.ajax(
            type: 'POST',
            url: 'send.php',
            data: dataObj,
            success: function() console.log('Ajax Success!');, 
            error: function() console.log('Ajax Error!');,
            statusCode: 
                200: function() console.log('200 Everything ok!');,
                400: function() console.log('400 Bad request');,
                403: function() console.log('403 Forbidden');,
                500: function() console.log('500  Server error');
            
        );



    $('.contact-form input[type="submit"]').click(function(e) 

        if($('form')[0].checkValidity())  //checks if insetred value meets the html5 required attribute
            e.preventDefault();
            var dataObj = 
                name:  $.trim($('.contact-form input[type="text"]').val()),
                email:  $.trim($('.contact-form input[type="email"]').val()),
                message:  $.trim($('.contact-form textarea').val())
            ;

            ajaxSend(dataObj);

         else  console.log("Invalid form"); 
    );

这里是php文件:

if ($_SERVER["REQUEST_METHOD"] == "POST") 

    $to_email = "myemail@gmail.com";
    $data = json_decode($_POST['dataObj']);    

    $subject = 'Email subject';
    $headers = 'From: '.$data['email'];
    $message  = 'Name: '.$data['name'].' \n';
    $message .= 'Email: '.$data['email'].' \n\n';
    $message .= 'Message:\n'.$data['message'].' \n';
    if (mail($to_email, $subject, $message, $headers)) 
        http_response_code(200);
     else 
        http_response_code(500);
    

 else 
    http_response_code(403);

虚拟主机是 windows,我尝试过使用 POST 请求,但它工作得很好,我收到了电子邮件。我觉得不是php.ini的问题?

【问题讨论】:

【参考方案1】:

您的第一个问题是您在服务器端使用$_POST['dataObj'],而数据仅在$_POST 中可用(dataObj 是一个不会传递到服务器的javascript 变量名)。例如,您可以通过阅读$_POST['email'] 来获取电子邮件。尝试将您的 send.php 更改为:

if ($_SERVER["REQUEST_METHOD"] == "POST") 
  $to_email = "myemail@gmail.com"; 

  $subject = 'Email subject';
  $headers = 'From: '.$_POST['email'];
  $message  = 'Name: '.$_POST['name'].' \n';
  $message .= 'Email: '.$_POST['email'].' \n\n';
  $message .= 'Message:\n'.$_POST['message'].' \n';
  if (mail($to_email, $subject, $message, $headers)) 
    http_response_code(200);
   else 
    http_response_code(500);
  

 else 
  http_response_code(403);

注意:直接在 $headers 变量中使用 $_POST 而不进行某种转义是不安全的。如果你这样离开,攻击者可以设置额外的参数。在将其用于生产之前,请先 Google 一下。

如果您收到 200,发送过程中的某些东西可能比您的 linux 设置更容易阻止带有格式错误的标头的邮件。 但是,您应该收到一封格式错误的电子邮件,其中包含您提供的 php 代码,对吗?回答这个帖子,以防之后仍然出现错误。

【讨论】:

是的!这是 $data 和 json_decode() 函数的错误,不知道您可以以正常方式访问帖子数据。 我会的,你能详细说明一下你所说的逃避是什么意思吗?我注意到 \n 没有渲染,也没有按预期进入下一行 尝试使用 $message .= 'some text'.PHP_EOL 来使用换行符。我通常在我的邮件中使用 \r\n 但 PHP_EOL 常量应该做得更好。您可以在mattgeri.com/2012/01/escaping-input-to-the-php-mail-function 阅读有关逃逸的东西

以上是关于收到ajax POST请求时PHP mail()不起作用的主要内容,如果未能解决你的问题,请参考以下文章

“POST /mail.php”错误(404):“未找到”

使用 jQuery AJAX 向所需的 PHP POST 请求处理程序提交表单不起作用

Drupal 中的 Ajax 请求给出 403

Ajax Post请求失败[重复]

发出 ajax Post 请求时出现 403 禁止错误

从 SQL 选择到 PDO