L'envoi automatique de mail est souvent utilisé par les entreprises dans leur système d'information.
Ce procédé permet à l'ensemble des acteurs d'accéder plus rapidement aux données. Pour ce faire, un serveur de messagerie est en général installé. Dans le cas contraire, comment envoyer un email en PHP (cas d'un intranet) à partir d'un serveur GNU/Linux ?
La fonction mail de PHP utilise l'accès à sendmail pour parvenir à son objectif. Afin de pouvoir envoyer malgrè tout un message, il est possible de passer par un smtp distant (pour Windows uniquement).
La solution pour GNU/Linux est donc de recourir à l'excellente classe Open Source PHPMailer et d'adopter la méthode d'envoie SMTP proposée.
Un bon article explique justement son fonctionnement.
Pour aller plus loin, l'usage de cette classe est tout de même plus lente en temps d'exécution que la chère fonction mail native à PHP. Imaginons que l'on veuille envoyer un email automatiquement à partir d'un simple clic sur un lien hypertexte. La page web chargée d'envoyer le mail sera donc plus longue à se charger dans le navigateur. Il faut considérer 5 à 10 secondes (cela peu varier selon la connexion réseau) l'envoie d'un email avec PHPMailer via la méthode SMTP. Il n'est pas concevable pour un application Web de faire autant attendre l'intranaute surtout si l'action est ammenée à se répéter souvent.
En vue d'améliorer les temps de réponses, il est possible de simuler un quasi temps réel pour l'envoie des mails. Le principe est simple :
- créer le mail de toute pièce - instanciation de la classe PHPMailer - lors de l'action demandée par l'utilisateur
- sérialiser l'objet PHPMailer dans une table SQL
- configurer un cron exécutant un script PHP toutes les X minutes
Bien que cela puisse paraître lourd, c'est en fait très simple. Il suffit donc de créer un script (appelé par le cron) chargé de lire la table SQL contenant les objets sérialisés, de les désérialiser et d'appler la méthode Send.
Le script devrait ressembler à celà :
<?php
// connexion à la base de données...
// séléction des messages en attente & envoie
$handler = mysql_query("SELECT objetMail FROM table");
while($mail = mysql_fetch_object($handler)) {
$objetMail = unserialize(stripslashes($mail->objetMail));
if (!$objetMail->Send()) {
// traiter l'erreur de l'envoi
}
}
// suppréssion des messages envoyés
mysql_query("DELETE FROM table");
?>
Cette technique est simple et permet surtout d'éviter d'installer un serveur mail tel Sendmail. Des exemples de code sont disponibles sur le site de PHPMailer, c'est TRES accessible et ça fonctionne bien (testé en entreprise).