La fonction mail() dans une boucle
Par Méthylbro le vendredi 3 juillet 2009, 08:00 - Développement - Lien permanent
Utiliser la fonction mail() au sein d'une boucle (for, foreach, while, etc) est une mauvaise pratique que l'on trouve encore trop régulièrement. Si la fonction mail() est une interface très agréable à utiliser pour négocier avec serveur SMTP dans le cadre de l'envoi d'un mail ; elle est un très mauvais choix pour un envoi de masse.
La fonction négocie directement avec le serveur SMTP. Elle permet au développeur de résoudre un impératif technique courant : l'envoi de courrier électronique.
Comme le montre la figure suivante ; la fonction mail propose une interface entre le développeur et le serveur d'envoi de messagerie. Ainsi donc le développeur peut s'affranchir du dialogue avec le serveur SMTP.

Cependant ; comme vous pouvez le voir sur le diagramme à chaque appel de la fonction mail() cette dernière var ouvrir un nouveau socket vers le serveur SMTP, envoyer son mail avant de refermer ce même socket.
Imaginez alors ce qu'il se passe lorsque vous envoyer comme beaucoup de monde votre newsletter de la façon suivante :
$sql = "SELECT email FROM abonnes;";
$res = mysql_query($sql);
while($row=mysql_fetch_assoc($res)){
mail($row['email'], $subject, $message);
}
Lors de chaque itération de votre boucle while, la fonction mail() va ouvrir un socket, envoyer son message, refermer le socket . Si vous avez 10 000 abonnés ; le script va renégocier 10 000 fois une nouvelle connexion. Alors que celle-ci pourrait très bien rester ouverte !
Lorsque vous souhaitez donc envoyer de gros volumes de courrier électronique, la fonction mail() est un très mauvais choix. Pour pallier ce problème il existe d'excellents paquets PEAR :
Commentaires
Dailleurs si on regarde le manuel php
http://php.net/manual/en/function.m...
La deuxième note nous dit bien : "Note: It is worth noting that the mail() function is not suitable for larger volumes of email in a loop. This function opens and closes an SMTP socket for each email, which is not very efficient.
For the sending of large amounts of email, see the » PEAR::Mail, and » PEAR::Mail_Queue packages. "
Pas besoin de chercher bien loin !!! En revanche, tu as bien expliqué le problème je pense. Tu vas montrer comment utiliser PEAR ?
Non, si tu veux apprendre à te servir des paquets Pear ; va sur pear.php.net. Moi je vais donner des pistes pour réaliser soit même une alternative à la fonction mail()