2009-08-27 8 views
1

Comment envoyer un email, pour dire 3000 destinataires - avec un maximum de 500 emails/heures sur mon IP dédié? Jusqu'à présent, ma pensée est d'envoyer chaque email toutes les 9 secondes, cela arriverait à environ 450 emails par heure ... mais comment pourrais-je faire cela?Dormir entre les appels de Mail() en PHP

Mon plan pour l'envoi des e-mails serait la suivante ...

$emails = ARRAY OF EMAILS, MYSQL RESULT 
for($emails){ 
mail($subject,$row[email],$headers); 
} 

Ce ne fonctionnera pas, mauvais genre de déclaration, mais de toute façon ce concept ....

+1

Alternative .. gammadyne mailer - http://www.gammadyne.com/mmail.htm Je me porte garant. – madcolor

Répondre

2

Ce que je voudrais faire est:

  • créer un script PHP qui est lancé par cron une fois par heure
  • ce script envoie seulement 450 e-mails, à sa propre vitesse
  • lorsque le 450 les mails sont envoyés, le script meurt
  • et quelque temps plus tard, il est relancé, par cron, pour envoyer 450 autres mails.

L'astuce est: vous devez savoir quels mails ont déjà été envoyés.
Commande des mails par identifiant dans votre DB, ou quelque chose comme ça, et en utilisant la limite, serait OK, je suppose

Si vous voulez dormir pendant un certain temps entre les mails, utilisez la fonction sleep; quelque chose entre 2 et 5 secondes serait probablement OK, pour être sûr que le script de 450 mails est terminé avant que le script ne soit relancé par cron.


Et, d'y penser:

  • Vous devriez mettre des choses de l'exploitation forestière en place: si quelqu'un se plaint, en disant qu'il a reçu 10 courriels, il pourrait vous aider à trouver pourquoi.
  • Je ne voudrais pas utiliser la fonction mail: il y a beaucoup d'autres possibilités, l'utilisation de bibliothèques qui sont bien testées et offrent beaucoup de fonctionnalités, déjà développèrent: ne pas réinventer la roue ;-)

Voici quelques bibliothèques, je peux penser à:

+0

SwiftMailer est livré avec un plugin appelé "Throttler", consultez sa documentation à http://swiftmailer.org/docs/throttler-plugin-howto – VolkerK

2

Store Vous messages pour envoyer dans une base de données, marquer les messages qui sont envoyés. Dans un travail cron, sélectionnez ceux qui ne sont pas envoyés et traitez-les. La fréquence du travail cron détermine la vitesse d'envoi des emails.

+0

à l'utilisateur demandant: de plus, vous ne pouvez pas laisser le script PHP s'exécuter indéfiniment - la plupart des serveurs limiteront le temps d'exécution du script. – dusoft

0

Vous pouvez utiliser cette classe Timer très pratique pour faire le levage de charges lourdes pour vous (démarrer, arrêter et obtenir le temps écoulé dans la boucle, etc.): PHPClasses: Timer.php.

0

Merci pour toutes les réponses! Le meilleur moyen que j'ai trouvé était en fait de dormir() entre les appels en utilisant le sleep() comme j'ai testé 400 mails, cela a pris 17 secondes :)

Il est peu probable que l'utilisateur envoie plus que la limite 450. .si ils le font j'ai une instruction if avant le while() se termine en vérifiant s'il y a plus de 450 lignes, si c'est le cas il va dormir entre chaque ... cela fonctionne sans bases de données fiddly :)

Merci!