使用 jquery 发送电子邮件不起作用:PHP

Posted

技术标签:

【中文标题】使用 jquery 发送电子邮件不起作用:PHP【英文标题】:Email sending using jquery not working :PHP 【发布时间】:2011-06-06 14:14:27 【问题描述】:

据我所知,这个脚本在 Chrome 和 IE 中运行良好。它在 Firefox 中无法正常工作。 (不是保证一切正常——有时一封电子邮件没有通过,但我们无法重现该错误。)

编辑: 现在看来,在 Chrome 和 Firefox 中,电子邮件不是在 first 尝试时发送的,但是如果我从 PayPal 点击返回按钮并提交再次发送。

我认为问题可能是 AdBlock Plus 以某种方式禁用了脚本。在页面上禁用了ABP,它发送了......但是在刷新页面并尝试再次发送之后,它又回到了不工作。

此注册表单应该发送包含大量表单数据的电子邮件,更改适当的输入以准备将用户注册的内容提交给 PayPal,然后将用户重定向到 PayPal 以单独处理付款。重定向到 PayPal 总是很完美,购物车中有适当的物品。

此代码位于 html 文件的头部。 (它曾经使用我自己的一个缩小的 jQuery 文件,所以在搜索错误时我尝试链接到这个文件——没有解决问题。)

<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js"></script>
<script type="text/javascript" src="[myscripts].js"></script>

表格开始:

<form id="[myformname]" name="[myformname]" method="post" action="">

[myscripts].js 包含以下内容:

$(function()   
  $('.error').hide();  
  $(".button").click(function() 

    // many lines pulling input from form, generally of the type:
    var firstname = $("input#firstname").val();
    // as well as 
    var subscribe = $("input#subscribe").is(':checked');

    // simple validation code for now, here is a generalized version
    if (firstname == '')
       $('p#errors').html("Error: First name is required.");
       $("p#errors").show();
       return false;
    
    else if (lastname == '')
       $('p#errors').html("Error: Last name is required.");
       $("p#errors").show();
       return false;    
    
    else 
       $("p#errors").hide();
    


    fixFields();   // this does the adjustment for PayPal
                   // checked checkboxes -> item_name_1, amount_1, etc.

    // in the real code, submitString is very long
    var submitString = 'firstname='+firstname+'&lastname='+lastname+'&email='+email+'&subscribe='+subscribe; // etc.

    $.ajax(  
      type: "POST",  
      url: "register.php",  
      data: submitString,  
      success: function() 
        return false;
        
    );

    submitForm(); // resets action to PayPal link, resubmits

  );  
);  

如果相关,这里是 submitForm 方法,之前在 [myscripts].js 中定义:

function submitForm()
  var form_url = $("#[myformname]").attr("action"); 
  //changing the action
  $("#[myformname]").attr("action","https://www.paypal.com/cgi-bin/webscr");
  //submit the form
  $("#[myformname]").submit();
  return true;

这里是 register.php:

<?php
 $to = "[example1]@gmail.com,[example2]@gmail.com";
 $subject = "New Registration";
 $headers = "From: webmaster@[mysite.com]";

 // shortened for readability's sake
 $name = $_POST['firstname']." ".$_POST['lastname'];

 $body = "INFORMATION\n".$name."\n".$_POST['email'].", Subscribe: ".$_POST['subscribe'];

 $body = $body."\nSELECTIONS\n";
 if ( $_POST['option1']=="true" ) 
    $body = $body."Option 1 Name\n     Details Line 1\n     Details Line 2\n";
 
 if ( $_POST['option2']=="true" ) 
    $body = $body."Option 2 Name\n     Details Line 1\n     Details Line 2\n";
 

 mail($to, $subject, $body, $headers);

?>

对不起,如果这是一个荒谬的长帖子。我是一名编程爱好者,对我在这里使用的许多语言都非常陌生,所以我想尽可能清楚。提前感谢您的任何建议。

【问题讨论】:

首先,如果它在某些浏览器中工作,那不可能是 php 问题 - 所以你的问题有点误导,因为 PHP 的 email() 不是这里的问题。 编辑标题以反映问题不再仅限于 Firefox。 如果我注释掉 submitForm();行,电子邮件在第一次加载时发送,在 Chrome 和 Firefox 中。呃……? 请看我的解决方案,这是不等待 ajax 完成的问题。 【参考方案1】:

在将表单提交到 paypal 之前,您可能没有足够的机会通过 AJAX 发送表单,请尝试将 submitForm() 函数移到 success AJAX 函数中。

【讨论】:

在 Chrome 和 Firefox 中试过这个,表单根本不起作用——只是刷新并显示一个空白表单。没有发送电子邮件,没有重定向到 PayPal。 +1 这听起来很合理......这意味着Firefox 毕竟是最快的浏览器。 ;-) 还要确保您单击的按钮本身不是提交按钮,否则您需要返回 false 以阻止实际表单提交。 很好,已更正。但 Chrome 提交仅在第二次尝试时有效(浏览器返回按钮,再次提交),而 Firefox 似乎根本不起作用。返回按钮,刷新,再次提交也不起作用。如果您的警告适用,我需要在哪里返回 false? 这对我有用 - jsfiddle.net/9xR4Z(我删除了用于测试的验证位)【参考方案2】:

这是一个 JavaScript 错误。不是 PHP 错误。在 Firefox 上安装 firebug,启用控制台,保留所有错误并尝试运行脚本。你会看到问题。

此外,JavaScript 的条件与 PHP 略有不同。 if(blah == '') 编码不好。

如果你想要长度,它应该是:if(blah.length >= 1)。我会看看你的javascript,看看有没有什么突出的..

但是,答案是在您的 Firefox 控制台中进行调试。

好的,这是你的问题... 您正在提交表单,在收到 jquery ajax 方法中的响应之前尝试继续。您需要单击按钮,它会触发 ajax 调用,然后在完成之前什么都不做。我会为你写一个脚本并很快发布。

解决方案:

$.ajax(  
      type: "POST",  
      url: "register.php",  
      data: submitString,  
      success: function() 
        submitForm();
      , error: function() 
         //something went wrong, use console.log here if you know what that is.
        
 );

    //submitForm(); // this was firing before ajax was done.

【讨论】:

【参考方案3】:

尝试检查if(isset($_POST["whatever"]) AND $_POST["whatever"])。发送字符串“true”是浏览器约定。

【讨论】:

抱歉,我觉得自己是世界上最菜鸟,但我不知道该怎么做。我应该把这个测试放在我的 PHP 文件中吗? 用我的替换你现有的if ( $_POST['option1']=="true" ) 测试。 好的。将您的测试放在适当的位置,注释掉 submitForm(),清除 Chrome 缓存,发送电子邮件。取消注释 submitForm(),清除 Chrome 缓存,电子邮件未发送但重定向到 PayPal。返回浏览器,再次单击按钮,电子邮件发送和重定向。返回浏览器,刷新页面,再次单击按钮,电子邮件发送和重定向。

以上是关于使用 jquery 发送电子邮件不起作用:PHP的主要内容,如果未能解决你的问题,请参考以下文章

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

在xampp localhost中发送的php邮件不起作用[重复]

Pear PHP Mail 发送 CC 似乎不起作用

使用 PHP 和 AJAX 发送电子邮件表单

laravel - 发送邮件不起作用

PHP邮件程序不起作用