2010-04-14 4 views
9

mail() php Note: Il convient de noter que la fonction mail() ne convient pas à plus grands volumes de courrier électronique dans une boucle. Cette fonction ouvre et ferme une prise SMTP pour chaque e-mail, ce qui n'est pas très efficace. Source: manuel PHP+ -200 courriels en utilisant la fonction dans une boucle

Quels sont plus grands volumes? A 100 ou 1000? Puis-je faire en toute sécurité faire une boucle 200 fois sans trop de problèmes? (Je ne peux pas installer pear)

+0

Wow, 5 réponses, 4 d'entre elles sont plutôt bonnes (la 5e est aussi utile, juste controversée), et aucune upvotes? (à part celui que j'ai donné). Aie. Je vais aller et répandre un peu d'amour .. –

Répondre

6

Vous pouvez le boucler 200 fois avec quelques problèmes que j'imagine, même si Le résultat final dépend de plusieurs facteurs, mais vous devez vous assurer que vous utilisez set_time_limit() pour donner le script. Le déchargement du travail dans une sorte de file d'attente desservie par un script cron peut vous faciliter la vie, car si vous gardez les scripts PHP ouverts pendant longtemps, d'autres problèmes de ressources apparaîtront

À l'époque, j'avais l'habitude d'envoyer environ 50 000 courriels à un bulletin d'abonnés en utilisant la fonction de messagerie de PHP et un serveur RedHat avec Exim installé. Cela prendrait 4-6 heures avec le script personnalisé que j'avais en cours d'exécution. Il n'y avait rien d'efficace à ce sujet, mais il a fait le travail.

2

Plus le lot est petit, mieux c'est, mais cela dépend de votre configuration (vitesse du serveur, réseau, etc.). J'utiliserais probablement un travail de cron et ferais de petits lots. Vous devez supposer qu'un mail() peut se bloquer et arrêter le traitement, ce qui fait qu'il est important de marquer chaque ligne de votre liste comme un email envoyé. Par exemple, si vous pouvez faire 1 email par seconde ou un peu plus vite, alors je ferais un lot de 50, dans un travail cron qui s'exécute toutes les minutes. Utilisez votre requête SQL pour obtenir les 50 premiers résultats qui n'ont pas encore été envoyés, car vous ne pouvez pas être sûr de l'endroit où vous commencez.

+1

+1 pour la requête SQL pour éviter de re-traiter les mêmes 50 encore et encore, chaque minute! –

0

Vous devez d'abord consulter vos Conditions d'utilisation (TOS) avec votre hébergeur ou fournisseur en amont. Si vous leur causez des problèmes et que vous violez les conditions d'utilisation, ils vous laisseront tomber comme une cuillère chaude. Ensuite, vous pourrez peut-être éviter de submerger le système de messagerie et rester en-deçà du radar des "robots Reaper" en ajoutant simplement un appel sleep() tous les 10 messages environ. Rendez-le réglable de sorte que vous puissiez limiter à la fois le nombre d'itérations et le délai de sommeil. Eitehr en tant que paramètres, ou via un fichier de configuration (ce dernier pourrait être interrogé en haut de la boucle, pour faire des ajustements à la volée.)

3

Il y a environ 5 ou 6 ans (la dernière fois que j'ai regardé ce genre de chose), j'ai vu un logiciel de liste de diffusion en PHP utilisant la fonction mail() qui envoyait des centaines de messages chaque fois que la fonction "envoyer à la liste de diffusion" invoqué. Au fur et à mesure que le client ajoutait de plus en plus de noms (en plusieurs milliers, la dernière fois que j'ai vérifié), le système devenait plutôt lent. À la fin, ils ont acheté des logiciels tiers pour gérer les envois de gros volumes et hébergés sur un serveur distinct de leur serveur Web pour éviter de ralentir leur site Web. Comme d'autres l'ont fait remarquer, vous devriez le vérifier auprès de votre fournisseur d'hébergement avant de commencer à envoyer des lots de plus de quelques dizaines à la fois - chaque société d'hébergement aura ses propres politiques, et si cela viole les TOS, ils peut vous déconnecter/couper votre hébergement. Idéalement, la transmission du courrier à grand volume devrait être effectuée à partir d'un serveur uniquement à cette fin.De cette façon, s'il se bloque ou se fige, vous n'aurez pas à vous soucier d'affecter d'autres applications. Si vous envoyez vraiment de très grandes quantités de courrier, il y a des paquets commerciaux qui géreront aussi la liste de diffusion, ils géreront les opt-outs et les opt-ins, les versions des emails, ils feront du texte vs HTML mail, etc ... recherche certains d'entre eux si vous êtes sérieux.

Je sais que cela ne répond pas à la question principale de "alternatives à la fonction mail()?" mais c'est le mieux que je puisse faire - je n'en ai vu aucun! La seule chose que je peux penser est de gérer manuellement les connexions SMTP en PHP (pas sûr de savoir comment c'est possible) ou en utilisant une bibliothèque externe pour le faire.

1

Si vous voulez envoyer des mails jusqu'à 1000 utilisateurs, il suffit de les passer dans un tableau et de mettre le mail() en boucle. La seule chose à retenir est de simplement mettre set_time_limit(0) sur la première ligne et mettre flush() sur la dernière ligne, et vous pouvez envoyer autant de mails que vous le souhaitez.

Questions connexes