【问题标题】:What's wrong with my AJAX contact form? (php mail())我的 AJAX 联系表有什么问题? (PHP邮件())
【发布时间】:2011-05-14 17:05:28
【问题描述】:

我已经使用 jQuery 和 PHP 表单创建了我的第一个 ajax 联系人,但它似乎不起作用。

我的 jQuery 代码:

var dataString = 'address=' + address + '&title=' + title + '&name=' + name + '&mail=' + mail + '&message=' + message;
jQuery.ajax({
    type: "POST",
    url: "sendmail.php",
    data: dataString,
    success: function () {
        alert(dataString);
        jQuery('#ok').html("<h2>Contact Form Submitted!</h2>")
    }
});
return false;

评论 - 我正在使用警报来显示数据字符串,它准确地显示了我的字符串,此外,此脚本始终成功并显示“已提交联系表单”。

现在是 sendmail.php 部分(我相信这里有问题):

// getting variables from form

$emailTo = trim($_POST['address']);
$subject = trim($_POST['title']);;
$name = trim($_POST['name']);
$emailFrom = trim($_POST['mail']);
$message = $_POST['message'];

// prepare email body text

$Body = "You have a message from: ";
$Body .= $name;
$Body .= "\n";
$Body .= "\n";
$Body .= $message;

// send prepared message

$sent = mail($emailTo, $subject, $Body);

//callback for jQuery AJAX

if ($sent){
  echo '';
}
else{}

有什么想法吗?我知道我不会删减我的 $message,我会的,但我只会发送一个单词的测试邮件。

所有变量都来自 HTML 表单,并以这种方式在 jQuery 脚本中注册 - var address = $("#cmail-address").val(); .无论如何,这与我的问题无关,因为我得到了很好的回调。

顺便说一句,我的服务器允许发送消息和其他脚本工作正常。

【问题讨论】:

  • 第一行的变量来自哪里?
  • 从 HTML 表单中,正如我上面提到的,我会收到类似 ?address=something&?title=something&(...) 这样的字符串的警报,所以我认为这不是重点?
  • 这不是问题,但使用像 { address: address, title: title } 这样的对象文字列出数据可能更清楚。
  • 你在没有启用 AJAX 的情况下测试过它吗?是这样的吗?
  • 您需要准确解释“似乎不起作用”的含义。您的电子邮件不会发送?顺便说一句,您可以使用 $('#form-id').serialize(); 将表单的所有值转换为字符串,而不是手动构建 dataString

标签: php jquery ajax email


【解决方案1】:

您使用 $_POST 变量,但使用 GET 方法发送它们..

【讨论】:

  • 将 $_POST 更改为 $_GET 没有帮助。
  • 数据在 $_POST 中,如问题中的jQuery.ajax 调用所示
【解决方案2】:

您的回调函数应该与 PHP 文件的输出有关。您只是在您的 javascript 范围内警告相同的字符串。

    success: function(dataOut) {  
        alert(dataOut);    
        jQuery('#ok').html("<h2>Contact Form Submitted!</h2>")
}  

当然,您需要 PHP 来回显某些内容。可以像“已发送”或“未发送”一样简单,直到您稍后改进内容,或者它可能正是您想要显示的消息。在您尝试发送邮件之前,还要回显 SOMETHING。它可以帮助确定问题在于实际发送邮件而不是您使用 ajax。

正如一位评论者所提到的 - 像 "?a=1&b=2&c=3" 这样的字符串可能适用于 POST,但名称/值对 {a: "cat", b: "dog"} 可能是更好的方法.像这样的字符串是 GET 的风格,这可能是其他人混淆他们的答案的原因。

我还推荐 jQuery 的 post 函数。 $.post 和 $.get 更简单,涵盖了 90% 的典型 ajax 使用(包括你的!)。 $.ajax 非常适合奇怪的特殊情况

$.post("sendmail.php", 
       {address: address, title: title, name: name...}, 
       function(d) {alert(d); $("#ok").html("<h2>" + d + "</h2>");});

最后几件事是建议,它们不太可能导致您的问题,但可能更容易找到原因。

什么是不工作的?您的 PHP 已到达,但电子邮件根本没有发送?

【讨论】:

  • 如果您可以确认我的建议,那么您已经确定问题出在发送邮件而不是您使用 ajax 上。那么也许你应该阅读 PHP 的邮件功能,如果需要的话,问一个关于 PHP 邮件的问题(不是关于 ajax)。
  • 正在处理它。此时我已切换到 $.post 并仍在战斗。
  • Af,我不知道为什么,但使用你的方法,我总是收到空警报。所以没有数据发送到 PHP 脚本。 AF。
  • 你有没有在你的回声中放任何东西或者它仍然只是一个空白?
  • 据我所知,我们没有确认您没有发送任何内容。我们确认您只输出了一个空格。将 echo_r($_POST) 放入后数组的完整视图
【解决方案3】:

这可能有点摸不着头脑 - 但是您是否尝试过发送到其他电子邮件地址? PHP 发送邮件使用发送消息的服务器的标头(例如 apache)。因此,当您单击“发送”时,mail() 函数会附加一条“x-sender: apache”消息。

某些邮件服务器不接受来自未经身份验证的服务器的邮件。

当我在本地开发时 - 我尝试将邮件发送到我的 gmail 并且它工作正常,使用我们公司的电子邮件被发送到一个黑洞。

编辑 - 哦,对不起 - 你已经说过了。尝试回显 $_REQUEST 以确保您正确发送所有变量。放一个 print_r($_REQUEST);死();然后在 send_mail.php 中观察结果。

哦!顺便一提。切换你的

$_POST

$_REQUEST

我以前也遇到过这个问题。就像下面投反对票的答案一样,您实际上可能没有发送 POST 变量,因为您使用 GET 格式传递参数。

 $emailTo = trim($_REQUEST['address']);
 $subject = trim($_REQUEST['title']);;
 $name = trim($_REQUEST['name']);
 $emailFrom = trim($_REQUEST['mail']);
 $message = $_REQUEST['message'];

也试试

 print_r($_REQUEST); die();

查看它是否被传入。

编辑2:

根据您的评论,请参阅此图片了解如何使用 firebug

【讨论】:

  • 这个文件如何用 ajax 打印 antyhing?我的意思是在提交我的表单后,我没有被重定向到这个文件,所以我没有得到任何输出,我猜我看不到“print_R($_REQUEST)。
  • 你有 FireBug 插件吗?我强烈建议您安装它。打开 FB,切换到 NET 选项卡并单击您的按钮。从那里您将能够阅读您的请求的帖子和响应标头。您将能够看到发生了什么。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2014-09-10
  • 1970-01-01
相关资源
最近更新 更多