Paypal IPN和mail()函数

时间:2011-07-21 19:22:49

标签: paypal-ipn php

更新:(2/29/12)好的,所以我再次针对完全不同的服务器和托管公司的不同客户端遇到同样的问题。

同样,拥有一个只包含mail()的脚本可以正确发送电子邮件,没有任何问题。然后我添加了类似于我下面的代码并将其与paypal IPN连接起来。每次收到新的付款时,IPN都会触发,数据会保存到数据库,但mail()函数不起作用。

然而,我遇到了一个有趣的问题。我使用相同的脚本从paypal的沙盒中测试了IPN,并发送了电子邮件。

这是paypals生产IPN的问题,也许是它将数据发布到脚本的方式?

这里的任何信息都非常有用,因为我目前使用cronjobs的解决方案很草率。

END UPDATE

我正确配置了我的paypal IPN侦听器,因为它在新付款时将所有信息写入数据库。现在我正在尝试设置mail()函数,向我发送新付款的电子邮件警报。

我之前已经为另一个项目做了这个,但我不知道为什么这次不工作的生活。我没有在error_log中收到任何错误,其余的脚本运行正常。

我已经过测试,以确保服务器确实使用独立的mail()脚本发送邮件。我真的很迷茫和迷茫。

这是我的代码:

mail('test@email.com', 'New Order', 'New Order', 'From: support@website.com');

define("_VALID_PHP", true);
require_once('../php/init.php');

$item_number = $_POST['item_number'];
$payment_gross = $_POST['payment_gross'];
$payment_status = $_POST['payment_status'];
$payer_email = $_POST['payer_email'];
$txn_id = $_POST['txn_id'];

if ($payment_status == 'Completed') {
    $query = $db->query("SELECT price, id, uid FROM invoice WHERE md5='$item_number'");
    $row = $db->fetch($query);
    $iid = $row['id'];
    $uid = $row['uid'];

    if ($row['price'] == $payment_gross){
        $invoiceUpdate['paid'] = 1;
        $update = $db->update('invoice', $invoiceUpdate, "md5='$item_number'");
    }
}    

$data['iid'] = $iid;
$data['uid'] = $uid;
$data['payment_status'] = $payment_status;
$data['payer_email'] = $payer_email;
$data['payment_gross'] = $payment_gross;
$data['txn_id'] = $txn_id;

$db->insert('payment', $data);

7 个答案:

答案 0 :(得分:2)

由于您的邮件功能返回true并且您的代码看起来正确,我认为您应该检查邮件日志,因为问题可能与代码无关。尝试发送邮件,然后检查服务器上的邮件日志...一旦我失去了两天试图找出类似的问题,最后问题是我的邮件没有被其他服务器接受。

找到你可以做的邮件日志(来自shell):

updatedb;
locate mail.log

locate maillog

这假设你使用的是linux,但问题也可能存在于windows

答案 1 :(得分:2)

代码对我来说似乎是正确的。

我的建议:

  1. 创建一个新的PHP脚本并在那里测试该功能。它有用吗?
  2. 尝试使用您的邮件服务器进行PHP SMTP身份验证,并以此方式发送电子邮件。它有用吗? (您可以使用PEAR邮件包或任何其他有效的SMTP类。)
  3. 如果上述操作也失败,则尝试将SMTP脚本与自定义服务(例如GMail)一起使用,并检查是否正在发送电子邮件。以下是GMail SMTP parameters
  4. 如果上述所有方法都失败了,问题肯定是您的托管服务提供商。

答案 2 :(得分:0)

如何开始调用mail(),然后逐步添加处理$ _POST的代码以查看它何时崩溃?您应该使用paypal进行沙盒测试,以便更轻松。

另一方面,您应向Paypal服务器发送验证邮件,以检查该请求是否实际来自Paypal,仅为了安全起见。

答案 3 :(得分:0)

问题不在您的PHP代码中,而是在服务器端。您可能有完整邮件或您的提供商/您的服务器有SMTP服务器问题。检查配置/联系提供商。

答案 4 :(得分:0)

使用phpmailer进行邮件任务,  http://sourceforge.net/projects/phpmailer/ 它可以让您轻松调试电子邮件问题。

答案 5 :(得分:0)

如果您已经测试了mail()函数并且它已发送,那么我认为它与您的邮件设置无关。但是,有一点建议是,您需要小心放入mail()函数的电子邮件地址。如今许多托管服务提供商都禁止您从未正式注册的域发送电子邮件(因此test@email.com不起作用 - 它需要来自您的域,并且需要是有效的电子邮件地址你已经设置好了 - 它不能是你真实域名中的虚假地址。)

如果仍然无效,请尝试手动更新php.ini设置:

<?php ini_set ( sendmail_from, "my_email@my_server.com" ); ?>

完成此操作后,尝试将邮件()放在脚本底部并将一个变量提供给它。所以一个例子可能是:

mail('test@email.com', 'New Order', $iid, 'From: support@website.com');

如果没有发送任何内容,我建议您重新评估您的代码,看看变量是否通过if语句进行过滤。如果所有其他方法都失败了,请联系您的托管服务提供商并向他们描述您的邮件问题 - 毕竟这可能是服务器问题。如果你在localhost上运行它,那么这完全是另一回事(在localhost服务器上设置mail()非常棘手)。

答案 6 :(得分:-1)

您是在Windows上还是在Linux上使用此代码?

邮件功能应该执行你必须将ipn链接到重复的ipn-handler php文件,否则你没有正确地将更改保存到服务器。

否则它只是没有意义你的代码清晰明了,如果你发送邮件在顶部它应该工作。

现在,如果您使用的是Windows邮件()通常不是最佳选择,因为Windows缺少默认的“sendmail”。