Dans Joomla, la classe JMail est utilisée pour gérer l'envoi des mails. On utilise l'appel $mailer = &JFactory::getMailer(); pour récupérer l'instance de JMail (plus d'informations sur l'utilisation de la méthode JFactory::getMailer()).

Un problème revient régulièrement sur les forums dédiés à Joomla. Il s'agit de la liste des destinataires qui n'est pas réinitialisée si on souhaite envoyer un mail plusieurs fois à différents destinataires. Le besoin peut être d'envoyer un mail personnalisé pour chaque utilisateur ou groupe d'utilisateurs.

Le code posant problème :

$mailer = JFactory::getMailer();
$from = "contact at hostname0.com";
$fromName = "Contact";
$subject = "...";
$body = "...";
$recipients1 = array();
$recipients2 = array();
$recipients1[] = "address1 at hostname1.com";
$recipients1[] = "address2 at hostname1.com";
$recipients2[] = "address1 at hostname2.com";
$recipients2[] = "address2 at hostname2.com"
$ret = $mailer->sendMail($from, $fromName, $recipients1, $subject, $body, false);
$ret = $mailer->sendMail($from, $fromName, $recipients2, $subject, $body, false);

 On s'attend logiquement à ce qu'un mail soit envoyé au premier groupe de destinataire ($recipients1) puis qu'un autre mail soit envoyé au deuxième groupe de destinataires. Ce n'est pas le cas. Lors du deuxième appel à sendMail le premier groupe est ajouté au deuxième groupe de destinataires. Il ne s'agit pas d'un bug de Joomla. JMail hérite de PHPMailer, une librairie très utilisée pour l'envoi de mails en PHP, et il s'agit du fonctionnement normal de cette librairie.

Pour contourner ce désagrément, on peut réinitialiser la liste des destinataires. Entre les deux appels à sendMail(...), il suffit d'ajouter $mailer->ClearAddresses();.

Etant donné que je suis tombé aussi sur ce problème, j'espère que ce post pourra en aider d'autres.

 

That's it!