Paypal IPN и функция mail () - PullRequest
4 голосов
/ 21 июля 2011

ОБНОВЛЕНИЕ: (29.02.12) Итак, я снова столкнулся с этой же проблемой для другого клиента на совершенно другом сервере и хостинговой компании.

Снова, имея скрипт только с mail (), отправляет письмо правильно, без проблем.Затем я добавил код, похожий на тот, что был у меня ниже, и подключил его к PayPal IPN.Каждый раз, когда приходит новый платеж, запускается IPN, данные сохраняются в БД, но функция mail () просто не работает.

Однако я столкнулся с интересной проблемой.Я выполнил тестовый запуск IPN из песочницы paypal с тем же сценарием, и электронное письмо было отправлено.

Это проблема с IPN производства paypals, возможно, из-за способа передачи данных в сценарий?

Любая информация здесь была бы чрезвычайно полезна, поскольку мое текущее решение, использующее cronjobs, небрежно.

END UPDATE

У меня правильно настроен прослушиватель IPN PayPal, поскольку он записывает всеинформация в БД при поступлении нового платежа. Теперь я пытаюсь настроить функцию 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 ]

2 голосов
/ 29 июля 2011

Код кажется мне правильным.

Мой совет:

  1. Создайте новый скрипт PHP и протестируйте функцию там.Это работает?
  2. Попытка аутентификации PHP SMTP на вашем почтовом сервере и отправка электронной почты таким способом.Это работает?(Вы можете использовать Почтовый пакет PEAR или любой другой допустимый класс SMTP.)
  3. Если вышеприведенное также не удается, попробуйте использовать сценарий SMTP с пользовательской службой (например, GMail) и проверьте, отправляются ли электронные письма.Вот SMTP-параметры GMail .

Если все вышеперечисленное не помогло, проблема определенно связана с вашим хостинг-провайдером.

2 голосов
/ 25 июля 2011

Поскольку ваша функция mail возвращает true и ваш код выглядит правильно, я думаю, вам следует проверить почтовый журнал, поскольку проблема может быть не связана с кодом.Попробуйте отправить письмо, а затем проверьте почтовый журнал на сервере ... как только я потерял два дня, пытаясь выяснить аналогичную проблему, в конце концов проблема заключалась в том, что моя почта не была принята другими серверами.

, чтобы найти свой почтовый журнал, который вы можете сделать (из оболочки):

updatedb;
locate mail.log

или

locate maillog

это предполагает, что вы используете Linux, но проблема также может существовать.на окнах

0 голосов
/ 31 июля 2011

Если вы уже протестировали функцию 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. Если ничего не помогает, обратитесь к своему хостинг-провайдеру и опишите им свои проблемы с почтой - это может быть проблема сервера. Если вы запускаете его на localhost, то это совсем другое дело (довольно сложно настроить mail () на сервере localhost).

0 голосов
/ 30 июля 2011

используйте phpmailer для почтовых задач, http://sourceforge.net/projects/phpmailer/, что позволит вам легко отлаживать проблемы с электронной почтой.

0 голосов
/ 29 июля 2011

Проблема не в вашем PHP-коде, а на стороне сервера. Возможно, у вас есть полная почта или у вашего провайдера / вашего сервера проблемы с SMTP-сервером. Проверьте конфигурацию / свяжитесь с поставщиком.

0 голосов
/ 25 июля 2011

как начать с вызова mail (), а затем постепенно добавлять код, который обрабатывает $ _POST, чтобы увидеть, когда он сломается?Чтобы сделать это проще, вам нужно пройти тестирование в песочнице с PayPal.

В дополнение к этому вы должны отправить сообщение проверки на сервер Paypal, чтобы проверить, действительно ли запрос был получен от Paypal, просто для безопасности.

0 голосов
/ 25 июля 2011

Вы используете этот код в Windows или в Linux?

Должна выполняться функция mail. Вы должны связать ipn с дублирующимся php-файлом ipn-handler, иначе вы не сохранили изменения на сервере должным образом.

В противном случае просто не имеет смысла, чтобы ваш код был четким, и если вы отправляете почту прямо сверху, он должен работать.

Теперь, если вы используете Windows, mail () обычно не лучший выбор, так как в Windows отсутствует стандартный sendmail.

...