sendNews, newsletter / mass mailing en PHP

sendNews est un script sans prétention développé pour l'expédition d'une lettre d'information et l'analyse des « bounces ».

Il n'est bien entendu pas destiné à spammer la planète mais bien à réaliser simplement un mass mailing à vos abonnés via une machine sur laquelle PHP 5 est disponible en version CLI. Il est distribué sous Licence GNU/GPL.

Ce programme est utilisé en production sur plusieurs listes de plus de 25 000 abonnés. Il est en réalité une implémentation libre de deux autres classes PHP (rendons à César...)

J'attire encore une fois votre attention sur le fait que ce script est fourni sans aucune garantie !

Fonctionnalités et intérêts de sendNews

S'adapte à toutes les bases existantes

Il suffit de préciser dans un fichier de configuration la requête SQL d'accès à votre table d'utilisateurs. Les bases de données potentiellement utilisables sont celles disponibles via l'extension PDO de PHP (Oracle, PostgreSQL, Microsoft SQL, SQLite...). Le script n'a actuellement été testé qu'avec Mysql (les retours sur l'utilisation d'un autre type de base sont les bienvenus).

Possibilité de régler précisément la vitesse d'un envoi

On configure le nombre de message par lots, la pause entre chaques lots etc... Ceci afin d'éviter au maximum de surcharger le serveur de mail (testé, pour l'instant, uniquement sur Postfix). La prochaine version - en cours de développement - proposera une option pour adapter le flot de message en fonction de la taille de la queue du MTA.

Gestion des mails invalides (alias « bounces »)

Une fonctionnalité indispensable pour ne pas être considéré comme un spammeur est d'effectuer régulièrement le « nettoyage » de sa base d'utilisateurs. Il est possible, en précisant correctement l'adresse de retour (return-path), de marquer et ensuite supprimer les adresses email qui ne sont plus valides (définition de bounces [en]). Une différenciation entre les hard bounces et les soft bounces est réalisée.

Choix du mode d'expédition

Grâce aux fonctionnalités de la classe Swiftmailer, vous pouvez choisir le mode d'envoi de vos messages ; directement via la commande sendmail (à ne pas confondre avec le MTA sendmail), via la fonction mail() de php, ou encore par le biais d'un serveur SMTP distant.

Un script pour plusieurs listes

Outre le fait que le script s'adapte à votre structure de données, vous pouvez l'utiliser pour une multitude de listes (un fichier de configuration par liste).

Possibilité de lancer l'envoi en mode « silencieux »

(non testé) Il peux être efficace de lancer le script en pleine nuit pour profiter d'un moment où votre serveur de mail n'est pas surchargé par les utilisateurs classiques. Une ligne de plus dans votre crontab et le tour est joué. Le mode silencieux afichera seulement un message de début et de fin de traitement que vous pouvez recevoir par mail (voir la section des exemples).

Et très prochainement...

Ce qui n'est pas dans sendNews

Le point principal étant la simplicité, sendNews ne fait pas le café. De plus :

Comment fonctionne le script

Partie expédition du message

On suppose que notre table d'utilisateurs contient le champ « envoye » (le nom du champ est défini dans le fichier de configuration)

Lorsqu'on lance un envoi (sauf en mode silencieux), le programme demande à l'utilisateur dans quel répertoire se situe le fichier HTML qui compose la lettre d'informations. Si un répertoire par défaut à été précisé dans le fichier de configuration, le script proposera d'utiliser le fichier HTML le plus récent qu'il aura trouvé dans celui ci.

Ensuite, on interroge très logiquement la table des utilisateurs en fonction de la requête SQL préalablement précisée dans le fichier de configuration. Il faut donc, dans cette requête, envisager de mettre au minimum SELECT idutilisateur,email FROM ma_table WHERE envoye=0.

Après l'envoi du mail à un utilisateur, une requête UPDATE place le champ « envoye » à 1. Ceci pour éventuellement reprendre l'envoi en cas de coupure inopinée du script.

Pendant le traitement, le script effectue des pauses en fonction de ce qui a été défini dans le fichier de configuration.

Partie gestion des bounces

Lorsqu'un de vos messages est rejeté par le serveur du destinataire, celui ci répond sur l'adresse spécifique précisée dans l'entête Return-Path.

Quand on lance le script de traitement des bounces, le programme analyse chaque messages présent dans cette boite de retour. Si il trouve un bounce, les informations sur la cause de l'échec pour l'adresse sont enregistrées dans la table « bounces » (dont la structure est fournie dans le répertoire d'installation). Le mail de bounce est ensuite supprimé de la boite uniquement si l'utilisateur l'a expressément demandé à l'exécution du script.

Pour supprimer les utilisateurs non valide de votre table d'abonnés, vous devez ensuite lancer quelques requêtes SQL en mettant en relation votre table et celle des bounces enregistrés

Utilisation

Téléchargez le script et décompressez l'archive. Vérifiez bien que les fichiers sendnews bounces/bounces sont exécutables.

L'application est donc divisée en deux scripts qui peuvent être utilisés de manière totalement autonome :

Configurer

Il est possible de créer plusieurs fichiers de configuration si vous souhaitez gérer différentes lettres d'informations. Il suffit de renommer le fichier conf/exemple.php en conf/maconf.php. Ensuite, précisez les paramètres du fichier de configuration en suivant les indications des commentaires présents dans ce fichier.

Lancer le script

Paramètres disponibles pour le script sendnews

Paramètres disponibles pour le script bounces/bounces

Exemple

Dans les exemples suivants, « exemple » désigne le fichier de configuration exemple.php situé dans le répertoire conf/. Le suffixe .php est automatiquement ajouté.

On part du principe qu'on se trouve dans le répertoire d'installation de sendnews

Expédition

Tester l'envoi d'une newsletter (interactif)

./sendnews -c=exemple -e -t

Lancer l'envoi (interactif)

./sendnews -c=exemple -e

Lancer l'envoi en précisant directement le fichier du répertoire DIR_HTML

./sendnews -c=exemple -e -f=ma_lettre.html

Remettre à zéro le champ « envoyé » de votre table d'utilisateurs

./sendnews -c=exemple -r

Traitement des bounces

Traiter les bounces et supprimer les messages. Supprimer également les bounces non reconnus de la boîte

./bounces/bounces -c=exemple -f -u

Comment supprimer ensuite les adresses invalides ?

Cette partie est en cours d'écriture. Pour l'instant, vous devez faire une requête croisée entre votre table d'utilisateurs et la table des bounces

Automatiser l'analyse des bounces

Aanlyser toutes les nuits la boites des retours

30 4 * * * /path/to/sendnews/bounces/bounces -f -u -c=exemple 2>&1 | mail -s "Traitement des bounces de thnet" moi@exemple.tld

Lancer le script en mode « silencieux »

Le mode silencieux est encore en phase de test. Je ne l'ai testé qu'une fois. Actuellement, je lance le script dans un screen

Via un script

Envoyer directement la newsletter ma_lettre.html. Le fichier ma_lettre.html doit se trouver dans le répertoire précisé dans le fichier de configuration par la constante DIR_HTML.

sendnews -c=exemple -s -e -f=ma_lettre.html

Dans la crontab

Envoyer la newsletter à 1h30 du matin le vendredi et faire parvenir un mail à l'administrateur quand l'envoi est terminé.

30 1 * * 5  /usr/local/sbin/sendnews -c=exemple -s -e -f=ma_lettre.html  2>&1 | mail -s "Rapport d'envoi" moi@domain.tld

Aide et support

Pour toutes vos questions et/ou remarques relatives à ce script, merci de les poster sur le forum de discussion en commentaires de ce post sur mon blog.

Quelques conseils pour ne pas finir dans les spambox

Il devient de plus en plus difficile d'envoyer des messages aux "grands" fournisseurs (Hotmail, Gmail, Yahoo, AOL...) sans risquer de retrouver ses messages dans les spambox des utilisateurs. Il est cependant possible de prendre quelques mesures pour mettre toutes les chances de son côté pour ne pas finir dans le dossier SPAM de vos correspondants. Lire l'article sur mon blog