Paypal IPN 和 mail() 函数

4

更新:(2/29/12)好吧,所以我在完全不同的服务器和托管公司上为另一个客户遇到了相同的问题。

同样,只有mail()脚本可以正确发送电子邮件,没有问题。然后,我添加了类似于下面代码的代码,并将其与PayPal IPN连接。每次收到新的付款时,IPN会触发,数据会保存到数据库中,但mail()函数却无法工作。

然而,我遇到了一个有趣的问题。我使用相同的脚本在PayPal沙箱中进行了测试IPN,邮件就被发送了。

这是PayPal生产IPN的问题吗?也许是它向脚本发布数据的方式有问题?

任何相关信息都会非常有帮助,因为我目前使用cronjobs的解决方案很糟糕。

更新完毕

我的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);

你尝试过不使用额外的头参数吗?你尝试记录mail()命令的返回值了吗? - Andy
是的,我已经尝试过不带标题行,它总是返回TRUE。 - Vitaliy Isikov
1
无法工作:它没有发送邮件。然而,mail() 函数返回 true,这意味着邮件必定已经发送到 SMTP 服务器。 - Vitaliy Isikov
7个回答

2

由于您的邮件函数返回 true 并且代码看起来正确,我认为您应该检查邮件日志,因为问题可能与代码无关。尝试发送一封邮件,然后检查服务器上的邮件日志……有一次我花了两天时间来解决类似的问题,最终发现问题是其他服务器不接受我的邮件。

要查找您的邮件日志,可以执行以下操作(从 shell):

updatedb;
locate mail.log

或者
locate maillog

这假设你正在使用Linux,但这个问题也可能存在于Windows上。

maillog 只显示了大量的 spamassassin(spamd)日志和少量的黑客攻击尝试。 - Vitaliy Isikov
那么您在尝试发送邮件时日志中没有任何标记吗? - Nicola Peluchetti
即使发送了新邮件,也没有任何显示出现。 - Vitaliy Isikov

2

我认为这段代码是正确的。

我的建议:

  1. 创建一个新的PHP脚本并在那里测试该函数。它能正常工作吗?
  2. 尝试使用你的邮件服务器进行PHP SMTP身份验证并通过此方式发送电子邮件。它能正常工作吗?(你可以使用PEAR Mail包或任何其他有效的SMTP类。)
  3. 如果以上方法也失败了,则尝试使用自定义服务(例如Gmail)的SMTP脚本,并检查是否正在发送电子邮件。这里是Gmail SMTP参数

如果所有上述方法都失败了,则问题肯定出在你的托管提供商那里。


0
如果您已经测试了mail()函数并且成功发送,则我认为与您的邮件设置无关。然而,有一个建议,您需要小心地处理放入mail()函数中的电子邮件地址。现在许多托管提供商禁止从未正式注册的域发送电子邮件(例如test@email.com不起作用-它需要来自您的域并且是您设置的有效电子邮件地址-不能是您真实域名上的虚假地址)。
如果仍然无法运行,请尝试手动更新php.ini设置:
<?php ini_set ( sendmail_from, "my_email@my_server.com" ); ?>

完成后,请尝试将您的mail()放在脚本底部并向其提供一个变量。例如:

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

如果没有任何东西被发送,我建议您重新评估您的代码,看看变量是否通过您的if语句进行了过滤。如果一切都失败了,请联系您的托管提供商,并向他们描述您的邮件问题 - 这可能是服务器问题。如果您正在本地主机上运行它,那么这就是完全不同的问题(在本地主机服务器上设置mail()非常棘手)。

0

先从调用mail()函数开始,逐步添加处理$_POST的代码,以查看何时出现错误?你应该使用Paypal进行沙盒测试,使此过程更加容易。

另外,为了安全起见,你应该向Paypal服务器发送验证消息以检查请求是否真的来自Paypal。


我已经进行了一个仅包含mail()调用的测试。当我从浏览器访问页面时,它可以工作,但当PayPal IPN触发时则无法工作。 - Vitaliy Isikov
是的,因为它将值记录到MySQL中。 - Vitaliy Isikov

0

0

问题不在你的PHP代码中,而是在服务器端。你可能已经拥有了完整的邮件或者你的提供者/你的服务器在SMTP服务器方面存在问题。检查配置/联系提供者。


-1
你是在Windows还是Linux上使用这段代码?
邮件功能应该执行,你必须将ipn链接到一个重复的ipn-handler php文件,或者你没有正确保存更改到服务器。
否则,如果你在邮件的最上面发送邮件,你的代码就很清晰明了,如果它不能正常工作,那就没有意义。
现在,如果你在Windows上,mail()通常不是最好的选择,因为Windows缺少默认的“sendmail”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接