Se débarrasser des adresses jetables avec Laravel


Introduction
Laravel Disposable Email est un package qui permet de détecter et bloquer les adresses email jetables (aussi appelées temporaires ou "disposable") dans vos applications Laravel. C'est un outil essentiel pour conserver une base saine d'utilisateurs.
L'utilisation de ce package étant relativement simple, je profiterai de cet article pour mettre en avant la manière dont il a été pensé et construit. Cela sera l'occasion de comprendre comment les autres développeurs produisent les librairies que l'on utilise tous les jours avec Laravel !
Fonctionnalités principales
L'utilisation de cette librairie repose sur 2 points essentiels qui sont :
- La vérification d'une adresse email contenant un domaine jetable
- Appliquer cette règle dans le système de validation de Laravel
Pour exécuter cette vérification, la librairie s'appuie sur une base de données de domaines jetables dont vous pouvez automatiser la mise à jour.
Il important de noter que la librairie utilise un système de Cache pour optimiser ses performances.
Tutoriel
Installation
Exécutez la commande Composer require
pour installer le package. Le Service Provider est découvert automatiquement.
1composer require propaganistas/laravel-disposable-email
Publiez le fichier de configuration et adaptez la configuration selon vos besoins :
1php artisan vendor:publish --tag=laravel-disposable-email
Exécutez la commande artisan suivante pour récupérer une liste à jour des domaines jetables :
1php artisan disposable:update
Ajout de la ligne de langue pour le validateur (optionnel)
Dans votre répertoire de langues, ajoutez pour chaque langue une ligne supplémentaire pour le validateur :
1'indisposable' => 'Les adresses e-mail jetables ne sont pas autorisées.',
Mise à jour régulière de la liste des domaines jetables (optionnel)
Il est fortement recommandé de mettre régulièrement à jour la liste des domaines jetables. Vous pouvez soit exécuter la commande manuellement de temps en temps, soit, si vous utilisez le planificateur de tâches de Laravel, enregistrer la commande disposable:update
:
Dans routes/console.php
:
1use Illuminate\Support\Facades\Schedule;2 3Schedule::command('disposable:update')->weekly();
Ou si vous utilisez Laravel 10 ou une version inférieure, rendez-vous dans le kernel Console :
1protected function schedule(Schedule $schedule)2{3 $schedule->command('disposable:update')->weekly();4}
Utilisation
Utilisez la règle indisposable
pour s'assurer qu'un champ donné ne contient pas une adresse e-mail jetable. Il est recommandé de l'ajouter après la règle email
pour garantir qu'une adresse valide est transmise :
1'field' => 'email|indisposable',
Récupération personnalisée
Par défaut, le package synchronise la liste des domaines en utilisant file_get_contents()
. Si votre application a des besoins différents (par exemple, si elle est derrière un proxy), vous devrez personnaliser la valeur disposable-email.fetcher
.
Analyse technique du code 🔧
Structure du package
1src/ 2├── Consoles/ 3│ └── UpdateDisposableDomainsCommand.php 4├── Contracts/ 5│ └── Fetcher.php 6├── Facades/ 7│ └── DisposableDomains.php 8├── Fetcher/ 9│ └── DefaultFetcher.php10└── Validation/11 └── Indisposable.php12├── DisposableDomains.php13├── DisposableEmailServiceProvider.php
Analyse des composants 📦
Le Service Provider - DisposableEmailServiceProvider.php
C'est le point d'entrée du package qui gère :
- L'enregistrement des commandes console (
UpdateDisposableDomainsCommand
) - La publication de la configuration
- L'enregistrement de la règle de validation personnalisée
indisposable
- L'enregistrement du singleton
disposable_email.domains
Points clés :
1$this->app->singleton('disposable_email.domains', function ($app) { 2 3 // Gestion intelligente du cache 4 if ($app['config']['disposable-email.cache.enabled']) { 5 $store = $app['config']['disposable-email.cache.store']; 6 $cache = $app['cache']->store($store == 'default' ? 7 $app['config']['cache.default'] : $store); 8 } 9 10 $instance = new DisposableDomains($cache ?? null);11 12 // Configuration de l'instance...13 return $instance->bootstrap();14});
La classe principale - DisposableDomains.php
Le cœur du package qui gère :
- Le chargement et la mise en cache des domaines
- La vérification des emails
- La gestion de la liste blanche
- Le support des sous-domaines
Méthode clé de vérification :
1public function isDisposable($email) 2{ 3 $domain = Str::lower(Arr::get(explode('@', $email, 2), 1)); 4 5 if (in_array($domain, $this->domains)) { 6 return true; 7 } 8 9 if ($this->getIncludeSubdomains()) {10 foreach ($this->domains as $root) {11 if (str_ends_with($domain, '.'.$root)) {12 return true;13 }14 }15 }16 17 return false;18}
La commande de mise à jour - UpdateDisposableDomainsCommand.php
Permet de mettre à jour la liste des domaines depuis les sources configurées :
- Utilise un "Fetcher" configurable
- Supporte plusieurs sources de données
- Met à jour le stockage local
- Vide le cache après la mise à jour
Le Fetcher par défaut - DefaultFetcher.php
- Personnalisation possible via l'interface "Fetcher" dans le dossier /Contracts.
Responsable du téléchargement des données :
1public function handle($url): array 2{ 3 $content = file_get_contents($url); 4 5 if (!$this->isValidJson($content)) { 6 throw new UnexpectedValueException('Invalid JSON'); 7 } 8 9 return json_decode($content);10}
La règle de validation - Indisposable.php
Intègre le package avec le système de validation de Laravel :
1public function validate($attribute, $value, $parameters, $validator)2{3 return DisposableDomains::isNotDisposable($value);4}
La Facade - DisposableDomains.php
Fournit un accès statique pratique aux fonctionnalités "à la Laravel" :
1protected static function getFacadeAccessor()2{3 return 'disposable_email.domains';4}
Architecture et mot de fin 🏗️
On peut conclure que ce package est construit autour d'une architecture élégante et efficace.
Au cœur du système, un Service Provider gère une instance unique (Singleton) pour la validation des emails, optimisant ainsi l'utilisation de la mémoire.
Une Facade offre une interface fluide pour les développeurs, permettant des appels simples comme DisposableDomains::isNotDisposable($email)
.
L'aspect modulaire de son système de Fetcher permet de placer sa propre logique. Grâce à ce pattern, les développeurs peuvent facilement personnaliser la manière dont les domaines sont récupérés - que ce soit depuis un fichier JSON, une API ou toute autre source.
Le package respecte parfaitement les conventions Laravel : configuration publiable via php artisan vendor:publish
, utilisation native du cache et du système de validation, et code organisé selon les standards du framework. Cette intégration soignée "embrasse le framework" en fait un outil vraiment flexible.
Source : https://github.com/Propaganistas/Laravel-Disposable-Email
A lire
Autres articles de la même catégorie

Connexion rapide en env de développement
Cet outil pratique de développement vous permet de vous identifier rapidement à un compte.

William Suppo

Artisan Benchmark
Découvrez artisan-benchmark, un package efficace pour mesurer le temps d'exécution, la mémoire consommée et les requêtes exécutées par vos commandes !

Mathieu De Gracia

Découverte de NativePHP
Transformez votre Laravel en application desktop !

Mathieu De Gracia