【问题标题】:cURL failing to exactly simulate HTTP PostcURL 无法准确模拟 HTTP Post
【发布时间】:2016-04-19 22:37:58
【问题描述】:

我是一名老派 COBOL 程序员,我越来越多地研究 PHP 在我的网站/页面上的使用。我学到了很多东西,但是有一个 CURL 应该解决的新挑战。

到目前为止,我还没有设法让我的代码按要求工作,所以我将尝试清楚地解释我想要它做什么并在下面展示示例。

我已经从一家互联网附属企业自己的捕获页面中提取了表单代码,以使其适合我自己的全屏视频捕获页面。基本上我在我的服务器上托管我的视频捕获页面,但表单与附属业务的服务器交互 - 从而使我能够控制前端(我的服务器)的外观,但在后面利用附属业务的功能结束(他们的服务器)。

此设置运行良好,表单通过简单的 HTTP 帖子提交潜在客户详细信息,如下所示..

<form action="http://<?php displayID(""); ?>.affiliate-business.com/index#form" method="post" name="PRE">
<input name="ENROLLER" value="<?php displayID2(""); ?>" type="hidden">
<input name="SOURCE" value="<?php echo $_GET['SOURCE']; ?>" type="hidden">
<input name="ENROLLER_NAME" value="<?php displayID3(""); ?>" type="hidden">
<input name="PAGE" value="11" type="hidden">
<input name="LANGUAGE" value="en" type="hidden">
<input type="hidden" name="STP" value="save">
<input name="FNAME" size="36" maxlength="40" value="" type="text" placeholder="First Name" required><br><br>
<input name="LNAME" size="36" maxlength="40" value="" type="text" placeholder="Last Name" required><br><br>
<input name="EMAIL" size="36" maxlength="60" value="" type="text" placeholder="E-mail" required><br><br>
<input name="PHONE" size="36" maxlength="40" value="" type="text" placeholder="Phone (*Optional)"><br><br>
<input type="image" src="http://example-image.png" alt="Reserve My Position Now!">
</form>

这正确地导致了以下 3 个动作.. -1- 通过电子邮件通知我订阅者(企业服务器) -2- 通过电子邮件欢迎订阅者并执行电子邮件后续系列(业务服务器) -3- 立即将它们重定向到起始页(企业服务器)

好的,现在开始我的聪明尝试。

我不仅想将表单数据提交到联属企业的服务器,还想在单击“提交”按钮时将我自己的个人电子邮件发送给订阅潜在客户。

所以我基本上想要一个提交按钮的两个操作。

我的解决方案是引入一个 PHP 文件来处理使用 PHP 邮件功能发送个人电子邮件和使用 CURL 提交表单字段/数据。

以下是我的视频捕获页面中的 HTTP 表单代码和已执行的 PHP 文件中的后续 PHP 代码..

<form action="sbcmail.php" method="post" name="PRE">
<input name="ENROLLER" value="<?php displayID2(""); ?>" type="hidden">
<input name="SOURCE" value="<?php echo $_GET['SOURCE']; ?>" type="hidden">
<input name="ENROLLER_NAME" value="<?php displayID3(""); ?>" type="hidden">
<input name="PAGE" value="11" type="hidden">
<input name="LANGUAGE" value="en" type="hidden">
<input type="hidden" name="STP" value="save">
<input type="hidden" name="URL" value="http://<?php displayID(""); ?>.affiliate-business.com/index#form">
<input name="FNAME" size="36" maxlength="40" value="" type="text" placeholder="First Name" required><br><br>
<input name="LNAME" size="36" maxlength="40" value="" type="text" placeholder="Last Name" required><br><br>
<input name="EMAIL" size="36" maxlength="60" value="" type="text" placeholder="E-mail" required><br><br>
<input name="PHONE" size="36" maxlength="40" value="" type="text" placeholder="Phone (*Optional)"><br><br>
<input type="image" src="http://payspreesniper.com/sbc/reserve-my-position-now.png" alt="Reserve My Position Now!">
</form>

sbcmail.php:

$to = "to@email.com";
$subject = "SBC Opt-in";
$msg = "This is my message" . " " . $_POST["URL"];
$headers = "From: from@email.com" . "\r\n";
/* ."CC: cc@email.com";*/
mail($to,$subject,$msg,$headers);

$url = $_POST["URL"];
$ch = curl_init();
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$params = array(
    "ENROLLER"=>$_POST["ENROLLER"],
    "SOURCE"=>$_POST["SOURCE"],
    "ENROLLER_NAME"=>$_POST["ENROLLER_NAME"],
    "PAGE"=>$_POST["PAGE"],
    "LANGUAGE"=>$_POST["LANGUAGE"],
    "STP"=>$_POST["STP"],
    "FNAME"=>$_POST["FNAME"],
    "LNAME"=>$_POST["LNAME"],
    "EMAIL"=>$_POST["EMAIL"],
    "PHONE"=>$_POST["_POST"],
);
curl_setopt($ch,CURLOPT_URL,"$url");
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($curl, CURLOPT_POSTREDIR, 3);
curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($params));
var_dump($returned_content);
$result = curl_exec($ch);
echo $result;
print_r($result);
echo "returned content: " . $returned_content;
curl_close($ch);

这是我网页 sbcmail.php 上的结果:

302 找到:

找到

文档已移至此处。

找到

文档已移至此处。

返回内容:


发生(或未发生)的操作如下。 -1- 通过电子邮件通知我订阅者(企业服务器) -2- 无法通过电子邮件欢迎订阅者(企业服务器) -3- 无法重定向到起始页(企业服务器) -4- 正确发送我的个人电子邮件(我的服务器)

因此订阅的潜在客户不会自动重定向到起始页面,也没有收到欢迎电子邮件或任何一系列后续电子邮件。

现在我可以使用 PHP 重定向处理到起始页的重定向(本示例除外),因为我已经将 URL 存储在 $URL 中。

但是,我不知道为什么标准的 HTTP 帖子会设法调用欢迎电子邮件并跟进订阅者系列,而我来自 sbcmail.php 的 CURL 版本却没有?

显然,通过标准 from 代码和我的 PHP 代码传递到服务器的信息存在差异。我将不胜感激任何关于这可能是什么的帮助或建议。这是完成我的难题所需的最后一块。

为什么会显示 NULL?为什么我会得到 302?为什么企业的服务器没有将预期的电子邮件发送到订阅潜在客户的电子邮件地址?

好的,我会停止胡扯,祈祷你们中的一个非常聪明的人可以告诉我我做错了什么。

提前致谢,

凯文


根据你们中的一位好人的建议改变策略。

我现在从 Javascript 调用我的 sbcmail.php 文件,它解决了直接发送 HTML 表单并在单击表单上的提交按钮时执行我的 PHP 代码。

但这又带来了另一个问题。

这是来自捕获页面的 JS 调用..

<script type='text/javascript'>
function submit(clicked)
{
load('sbcmail.php');
}
</script>

这是 sbcmail.php 中的 PHP 代码...

<?php 
$to = "to@email.com"; 
$subject = "SBC Opt-in"; 
$msg = "This is my message" . " " . $_POST["URL"]; 
$headers = "From: from@email.com" . "\r\n" ."CC: cc@email.com"; mail($to,$subject,$msg,$headers); 

$redirect = "affiliate-business.com/login?EMAIL="; . $_POST["EMAIL"] . "&LOGIN=1"; header("Location: $redirect"); 
die(); 
?>

新的问题是我在抓包页面提交表单时PHP邮件不起作用,但是重定向确实起作用,所以我知道JS正在成功调用sbcmail.php。

当我直接访问 sbcmail.php 时,PHP 邮件确实像重定向一样工作。

那么,有人有什么想法吗? JS 调用是否遗漏了什么?

很抱歉,我很痛苦,但我已经非常接近我打算实现的结果了。

【问题讨论】:

  • cURL 代码大部分看起来都不错。显示 NULL 是因为变量 $returned_content 你是 var_dump'ing 不存在。 $result 是 cURL 返回的内容。向第三方提交表单将失败,因为$_POST 是一个关联数组,所以像$_POST-"FNAME"-, 这样的所有行都没有达到您的预期。相反,您需要使用$_POST['FNAME']$_POST['ENROLLER'] 等。希望对您有所帮助。
  • 你在 2000 年在哪里?我可以猜一猜,说佛罗里达吗?呵呵:p
  • 我的 KISS 建议是在表单提交时调用一个 JS 函数,该函数会触发您自己的“发送个人电子邮件”脚本,仅此而已。同时保持表单 POST 直接到业务服务器。所以流程是:用户提交表单。您的发送个人电子邮件脚本开始执行。表单已发布到业务服务器。
  • @Empathy,非常感谢您的回复。有一瞬间我没有意识到你在做什么。您指出 $_POST-"FNAME"- 是正确的,只是您只在我的问题中看到了这一点,因为我对“[”和“]”进行了全局编辑以发布问题但没有意识到。所以实际上我的代码是这样的 ...$_POST['FNAME'] 。
  • @Empathy,很抱歉让事情变得混乱。我知道详细信息正在到达服务器,因为我可以登录并在我的后台联系人管理器中查看信息,但主要问题是,订阅者没有收到欢迎电子邮件或跟进,我认为这与接收服务器未获取特定格式的信息,甚至可能缺少一条信息。根据您的经验,我通过我的 PHP 页面发布的帖子是否直接反映了我的 HTML 中的帖子?还有你的JS函数ID(我对JS一无所知),这不是我现在在做什么,而是通过PHP?

标签: php email http post curl


【解决方案1】:

作为 JS 实现的后续,下面是使用 jQuery 的代码应该是什么样子。请注意,要使用 jQuery,您只需将其包含在 HTML 头中:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>

代码:

// Listen For Form Submit:
$('form').submit(function(event) {
  event.preventDefault();                     //Stop the form from submitting temporarily. 
  $.post('sbcmail.php', $(this).serialize()); //Load data from the form and POST to php script.
  $(this).submit();                           //Now submit the form normally. 
});

这会对 PHP 脚本和表单数据执行一个实际的 POST。我们不关心来自 PHP 脚本的响应数据(很可能),我们只想触发它,然后继续使用默认的表单提交。

【讨论】:

  • 感谢@love 的建议,但除非我直接访问该页面,否则 PHP 邮件功能仍然无法正常工作。我什至尝试过 window.location.href=*.sbcmail.php,但仍然没有邮件。所以我倾向于认为这与 JS 调用有关。几乎就像它实际上并没有调用 sbcmail.php 文件一样。
  • @Kevin 您需要对您的 sbcmail 脚本执行 POST,因为这就是加载数据的方式。我认为 POST 参数也可能区分大小写。如果您使用硬编码值从 CLI 手动运行邮件脚本,它是否有效?另外,sbcmail 是否与您的表单位于同一目录中?您体验到的“重定向”实际上应该是重定向到表单发布到的任何位置。
  • @爱,谢谢,是的,捕获页面和 sbcmail.php 在同一个目录中。我实际上认为不需要重定向,因为 JS 正在通过 HTML POST 正常提交表单方面做它应该做的事情 - 我通过从 sbcmail.php 中删除重定向来证明这一点(仍然没有邮件,但仍然是起始页加载。这就是为什么我认为 sbcmail 没有被 JS 调用调用。
  • @Kevin 不需要 PHP 重定向是正确的。这个 JS 方法所做的是基本上只是执行 PHP 脚本,然后继续正常提交表单,遵循表单指定执行的任何操作。在这个 JS 中,注释掉 $(this).submit();,这样我们就不会提交表单。现在您应该打开浏览器开发人员工具,然后转到“网络”选项卡。 (在 Chrome 中:右键单击 -> 检查 -> 网络)。现在提交表单,并在“网络”选项卡中查找该请求。在这里您可以查看是否收到 200 成功代码。
  • @Kevin 我很高兴通过实时聊天帮助您完成此过程。当您再次处理此问题时,请在此处发表评论,我们会协调讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多