4 votes

IPN Paypal et fonction mail()

MISE À JOUR : (29/02/12) J'ai rencontré le même problème pour un autre client sur un serveur et un hébergeur complètement différents.

Encore une fois, avoir un script avec juste mail() envoie l'email correctement sans aucun problème. J'ai ensuite ajouté un code similaire à celui que j'ai ci-dessous et je l'ai relié à paypal IPN. Chaque fois qu'un nouveau paiement est effectué, l'IPN se déclenche, les données sont enregistrées dans la base de données mais la fonction mail() ne fonctionne pas.

Cependant, j'ai rencontré un problème intéressant. J'ai fait un test IPN depuis le bac à sable de Paypal avec le même script et l'email a été envoyé.

S'agit-il d'un problème avec la production IPN de paypals, peut-être la façon dont il envoie les données au script ?

Toute information à ce sujet serait extrêmement utile car ma solution actuelle utilisant des cronjobs est bâclée.

FIN UPDATE

J'ai mon écouteur IPN de Paypal configuré correctement puisqu'il écrit toutes les informations dans la base de données lorsqu'un nouveau paiement est reçu. J'essaie maintenant de configurer une fonction mail() qui m'envoie une alerte par courriel lorsqu'un nouveau paiement est effectué.

Je l'ai déjà fait pour un autre projet, mais je n'arrive pas à comprendre pourquoi cela ne fonctionne pas cette fois-ci. Je ne reçois aucune erreur dans le journal des erreurs et le reste du script s'exécute bien.

J'ai testé pour m'assurer que le serveur envoie effectivement du courrier avec un script autonome mail() script. Je suis vraiment perdu et confus ici.

Voici le code que j'ai :

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

2voto

Nicola Peluchetti Points 38948

Puisque votre fonction mail renvoie vrai et que votre code semble correct, je pense que vous devriez vérifier le journal des mails car le problème pourrait ne pas être lié au code. Essayez d'envoyer un courrier et vérifiez ensuite le journal des courriers sur le serveur... Une fois, j'ai perdu deux jours à essayer de résoudre un problème similaire et, à la fin, le problème était que mon courrier n'était pas accepté par d'autres serveurs.

pour trouver le journal de votre courrier vous pouvez faire (à partir du shell) :

updatedb;
locate mail.log

o

locate maillog

Cela suppose que vous utilisez Linux, mais le problème pourrait aussi bien exister sous Windows.

2voto

Chris Smith Points 544

Le code me semble correct.

Mon conseil :

  1. Créez un nouveau script PHP et testez-y la fonction. Est-ce que cela fonctionne ?
  2. Tentez l'authentification PHP SMTP avec votre serveur de messagerie et envoyez l'e-mail de cette façon. Cela fonctionne-t-il ? (Vous pouvez utiliser le paquet PEAR Mail ou toute autre classe SMTP valide).
  3. Si ce qui précède échoue également, essayez d'utiliser le SMTP script avec un service personnalisé (par exemple GMail) et vérifiez si les e-mails sont envoyés. Voici les résultats du Paramètres SMTP de GMail .

Si toutes les mesures ci-dessus échouent, le problème vient certainement de votre fournisseur d'hébergement.

0voto

Anh Pham Points 4639

Pourquoi ne pas commencer par un appel à mail(), puis ajouter progressivement le code qui traite $_POST pour voir quand il tombe en panne ? Vous devriez faire des tests en bac à sable avec Paypal pour rendre cela plus facile.

Par ailleurs, vous devriez envoyer un message de vérification au serveur Paypal pour vérifier si la demande provient bien de Paypal, juste par sécurité.

0voto

genesis Points 32591

Le problème n'est pas dans votre code PHP, mais du côté du serveur. Il se peut que votre courrier soit plein ou que votre fournisseur/votre serveur ait des problèmes avec le serveur SMTP. Vérifiez la configuration/Contactez le fournisseur.

0voto

Vivek Chaturvedi Points 191

Utiliser phpmailer pour les tâches de messagerie, http://sourceforge.net/projects/phpmailer/ il vous permettra de déboguer facilement les problèmes de courrier électronique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X