Aller au contenu

Envois d'emails en double


Sujets conseillés

Posté

Bonjour,

Je travaille sur un script qui envoie en moyenne 60'000 emails par jour. Le problème c'est que ce script envoie actuellement des emails en doublon, voire en "triplon", voire en plus !

Je ne trouve pas de solution pour qu'un seul email soit envoyé à chaque fois.

Le script php est appelé par un cron, chaque jour. Le script va voir dans la BDD ce qui doit être envoyé et à qui et envoie un email en utilisant la fonction tep_mail() de OsCommerce. Si je fais un debug (pas d'envoi d'email mais sortie écran de la liste d'emails à envoyer), la liste d'emails à envoyer est propre : aucun doublon.

En revanche si je remets en production, l'envoi des emails commence normalement sans aucun doublon, puis à un moment donné (random évidemment), tous les emails partent en double, voire en triple...

Donc en gros :

- ma requête de sélection est bonne et ne retourne aucun doublon

- le traitement PHP pré-envoi de l'email ne génère pas non plus de doublon

- l'appel à la fonction tep_mail() génère des doublons

Cela pourrait-il venir de la fonction tep_mail elle-même ? Je ne vois pas du tout là je suis bien perdu. Si vous avez des idées je suis preneur !

Le serveur utilise Centos 4.6, Qmail.

Posté

Je ne connais pas du tout tep_mail, mais petite question qui pourrait permettre de cerner un peu mieux le problème: quand les mails sont envoyés en doublon, c'est d'affilée, ou espacés dans le temps? Genre il envoie le mail à X à l'instant T1, puis il en renvoie un autre à X à T2, avec plein d'autres mails entre les deux? Ou alors les doublons sont vraiment d'affilée? Pour ceux qui sont envoyés en double, tu pourrais nous donner les headers complets des messages reçus? Parmi ceux qui sont vraiment intéressants: To, Cc, Date, Message-Id et Received, il y en a peut-être quelques autres qui pourraient être utiles.

Tu as pensé à ajouter un petit log juste avant l'appel à tep_mail (avec le destinataire) pour voir ce que tu lui envoies?

Un coup d'oeil rapide à la fonction tep_mail me fait penser qu'il y a peu de chances qu'il envoie quoi que ce soit en double...

Et tu n'aurais pas une "race condition" quelque part? Genre le script est en cron tous les jours, mais ça lui prend plus de 24 heures pour envoyer tous les mails, et à l'exécution suivante du cron il pense que le mail n'a pas encore été envoyé (parce que tu mets à jour l'info comme quoi il a été envoyé une fois que tu as tout fini), donc il renvoie le même mail à tout le monde?

Jacques.

Posté

Hello,

Merci de ta réponse !

En fait les mails sont envoyés en doublon à moins de 1 seconde d'intervalle. J'ai bien sûr posé un espion juste après la fonction de mail où je logue l'heure exacte, le sujet du mail, l'adresse, un compteur simple.

En fait après avoir posé des logs de partout, j'ai remarqué que au bout d'un certain temps (environ 15 minutes), un deuxième thread venait se coller au premier, et tout part en 2 exemplaires. 15 minutes plus tard on se retrouve à 3... Après avoir fait quelques recherches j'ai trouvé que c'est un timeout sur wget qui fait que le cron réessaye. J'ai donc juste spécifié wget --read-timeout=0 et comme par magie, plus aucun doublon !

Problem solved ;)

Posté

Euh... Tu n'as pas un accès ssh sur la machine? Tu serais plus tranquille si tu lançais le processus directement comme ça (ou via un cron, si approprié). Même si wget ne fait pas de timeout, il peut y en avoir au niveau Apache et/ou php.

Tu devrais aussi d'une façon ou d'une autre "noter" quels mails ont été envoyés ou pas. Ca te permettra de d'arrêter puis de reprendre un envoi, de reprendre un envoi qui s'est arrêté par erreur, de découper l'envoi en bouts, et évidemment ça éviterait le genre de problème que tu avais...

Jacques.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...