Le Blog Web & Mobile

Le Blog by tellibus » Tutoriel Yii : Intercepter les rapports de non remise d’e-mail (NDR) pour exécuter une commande spécifique

5 mai 2013

Tutoriel Yii : Intercepter les rapports de non remise d’e-mail (NDR) pour exécuter une commande spécifique

A. Bennouna 198952 vues 1 commentaire
tutoriel, Yii, email, NDR, bounce, cPanel

Dans le cas où vous ne demandez pas aux utilisateurs de votre application Web de valider leur adresse e-mail, sachez détecter les adresses e-mail erronées et prenez les actions nécessaires.

Pourquoi se compliquer la vie ?

Afin d’éviter les e-mails non remis et les inscriptions non sollicitées, la plupart des webapps créent les comptes utilisateurs avec un statut désactivé ou en attente, tout en envoyant un e-mail d’activation à l’utilisateur. Ainsi, le compte de l’utilisateur reste inactif tant qu’il ne suit pas les instructions du mail d’activation (en général, un lien d’activation que l’utilisateur doit cliquer). Par ailleurs, les comptes qui n’ont pas été activés de la sorte sont généralement supprimés après une certaine durée.

Toutefois, il est possible que le fonctionnement de votre application Web ne soit pas compatible avec cette logique, auquel cas vous créez les comptes utilisateurs avec un statut actif par défaut, et vous risquez alors de vous retrouver avec des adresses e-mail erronées et de nombreux rapports de non-remise.

Bien entendu, vous pouvez éviter au moins les noms de domaine erronés en utilisant la propriété checkMX de la classe CEmailValidator dans les règles de votre modèle, mais :

  1. elle fonctionne uniquement si la fonction checkdnsrr est activée dans votre configuration PHP, ce qui n’est probablement pas le cas dans un hébergement mutualisé ;
  2. ladite fonction PHP n’est pas infaillible puisqu’elle ne peut pas vérifier l’existance d’une adresse e-mail en particulier dans un nom de domaine vérifié.

Cela étant dit, voyons ce qu’on peut faire dans ce cas précis.

Pré-requis

  • cPanel 11.30+
  • Accès au filtrage d’e-mail dans cPanel
  • Yii 1.1.10+

L’idée de base

Ce tutoriel est fortement inspiré (et librement adapté) de l’article suivant : Piping Incoming Mail with PHP.

Filtrer les e-mails au niveau de l’utilisateur à travers cPanel

  1. Dans votre interface cPanel, allez au module « Courrier » et cliquez sur « Filtrage défini au niveau de l’utilisateur » (« User Level Filtering » en anglais).cPanel - Filtrage défini au niveau de l’utilisateur
  2. Puis cliquez sur « Gérer les filtres » (« Manage Filters » en anglais) pour le compte désiré (généralement le compte par défaut, ou bien le compte spécifique avec lequel votre webapp envoie les e-mails à destination des utilisateurs).cPanel - Gérer les filtres
  3. Ensuite cliquez sur « Créer un nouveau filtre » (« Create a New Filter » en anglais), nommez votre filtre, sélectionnez « est un message d’erreur » (« is an error message » en anglais) dans les « Règles ».cPanel - Filtrage défini au niveau de l’utilisateurcPanel - Filtrage défini au niveau de l’utilisateur
  4. Dans les « Actions », sélectionnez « Redirection des sorties vers un programme » (« Pipe to a program » en anglais) et dans le champ à côté, tapez ce qui suit :

    handleBounceMessage étant la commande de console Yii qui gérera les rapports de non remise d’e-mails.

    Par mesure de sécurité, et au moins en environnement de tests, ajoutez une action supplémentaire : « Rediriger vers une adresse courriel » (« Redirect to email » en anglais) et spécifiez votre adresse pour recevoir une copie des rapports de non remise. En effet, une fois que vous utilisez ce filtrage pour les rapports de non remise, les e-mails d’erreur ne seront plus envoyés à la boîte aux lettres correspondante.

Structure de la table des utilisateurs

Nous allons utiliser la structure de table User suivante :

La commande Yii handleBounceMessage gérant les rapports de non remise d’e-mails

Une fois que nous aurons paramétré le routage des rapports de non remise vers notre commande Yii, nous pouvons traiter ces rapports comme des textes que nous allons analyser.

Dans notre tutoriel, nous nous limiterons à deux motifs d’erreurs qui se caractériseront par des chaînes de caractères spécifiques dans les rapports de non remise :

  • un motif correspondant à un nom de domaine erroné
  • un motif correspondant à une adresse erronée et un nom de domaine valide

Vous remarquerez qu’il est plus simple (et plus fiable) de chercher un motif d’expression régulière correspondant à une chaîne de caractères spécifiques que votre application Web a inclus dans le message non remis.

Voici notre exemple de commande Yii, que nous allons enregistrer sous le nom HandleBounceMessageCommand.php dans le dossier protected/commands :

Pour aller plus loin dans la gestion de rapports d’erreurs d’e-mails

Vous pouvez aussi tester ces deux autres implémentations gérant les NDR :

Pour en savoir plus sur les commandes de console Yii

Vous pouvez consulter les liens ci-dessous pour plus de détails sur les commandes de console Yii :

Ce tutoriel a été publié pour la première fois en anglais par l’auteur le 14 septembre 2012 en tant que Wiki sur le site communautaire de Yii : Catching bounce messages (NDR) and piping them to a Yii command.