Aller au contenu principal
Making DigitalMaking Digital
Note technique

Mailtrap "too many emails per second" : tester les e-mails en local avec Mailpit

En bref

L'erreur "550 5.7.0 Requested action not taken: too many emails per second" vient de la limite d'envoi de la boîte de test Mailtrap, calculée par tranche de 10 secondes selon l'abonnement. Pour le développement local, Mailpit capture les e-mails sur le poste : SMTP sur le port 1025, interface sur 8025. Il remplace MailHog, qui n'est plus maintenu, et Laravel Sail l'installe par défaut. Côté Laravel, il faut MAIL_MAILER=smtp (MAIL_DRIVER est ignorée depuis Laravel 7), MAIL_HOST et MAIL_PORT.

En local, une commande qui envoie une série d'e-mails (relances, confirmations de commande) s'arrête net avec Mailtrap : 550 5.7.0 Requested action not taken: too many emails per second. Laravel n'y est pour rien : c'est la limite d'envoi de la boîte de test Mailtrap. Pour le développement sur votre poste, le plus simple est de capturer les e-mails localement avec Mailpit, sans compte ni limite d'abonnement. Nous avons envoyé de vrais e-mails Laravel vers Mailpit dans Docker pour vérifier chaque réglage.

D'où vient l'erreur 550 de Mailtrap ?

La documentation de Mailtrap (Email Sandbox, "Features and limits") décrit une limite de débit : "The number of emails you can send to each of your Sandboxes every 10 seconds. The exact number depends on your billing plan." Une fois cette limite atteinte, les messages en trop ne sont pas mis en attente : ils sont refusés avec l'erreur 550 5.7.0 Requested action not taken: too many emails per second. La valeur exacte dépend de l'abonnement et n'est pas donnée sur cette page.

Deux solutions : espacer les envois (par exemple en les passant par une file d'attente), ou ne plus dépendre d'un service en ligne pour le développement local.

Pourquoi Mailpit plutôt que MailHog ?

L'ancienne version de cette note conseillait MailHog. Le dépôt de Mailpit l'indique clairement : "Mailpit was originally inspired by MailHog which is no longer maintained". Mailpit fait la même chose : un serveur SMTP qui garde les messages et une interface web pour les lire.

C'est aussi l'outil retenu par Laravel : la documentation indique qu'avec Laravel Sail, l'interface Mailpit est disponible sur http://localhost:8025. Dans le code de Sail, Mailpit fait partie des services installés par défaut, et l'installation règle MAIL_MAILER=smtp, MAIL_HOST=mailpit et MAIL_PORT=1025.

Comment lancer Mailpit ?

La commande donnée par la documentation de Mailpit pour Docker :

Terminal
docker run -d \
--restart unless-stopped \
--name=mailpit \
-p 8025:8025 \
-p 1025:1025 \
axllent/mailpit

Le port 1025 reçoit les e-mails en SMTP, le port 8025 sert l'interface web ("default Web UI on 8025 and SMTP on 1025"). Les messages sont perdus quand le conteneur est supprimé ; pour les garder, la documentation ajoute un volume et MP_DATABASE=/data/mailpit.db.

Port 1025 déjà pris ?

Sur notre poste, Laragon lance encore MailHog, déjà à l'écoute sur 1025 et 8025. Arrêtez-le, ou publiez Mailpit sur d'autres ports (-p 1026:1025 -p 8026:8025, ce que nous avons fait pour le test) et reportez le port dans le .env.

Quels réglages dans le .env de Laravel ?

.env
MAIL_MAILER=smtp
MAIL_SCHEME=null
MAIL_HOST=127.0.0.1
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null

Avec Sail, remplacez 127.0.0.1 par mailpit, le nom du service Docker.

Deux variables de l'ancienne note ne servent plus :

  • MAIL_DRIVER a été renommée MAIL_MAILER dans Laravel 7 ("the MAIL_DRIVER environment variable has been renamed to MAIL_MAILER"). Le fichier config/mail.php actuel lit env('MAIL_MAILER', 'log'). Dans notre test, avec seulement MAIL_DRIVER=smtp, le mailer utilisé était log : l'e-mail a fini dans storage/logs/laravel.log et rien n'est arrivé dans Mailpit, sans aucun message d'erreur.
  • MAIL_ENCRYPTION n'est plus lue par le config/mail.php d'un projet récent, qui utilise MAIL_SCHEME. Laissée à null, Laravel choisit smtps pour le port 465 et smtp sinon.

Si la configuration est en cache (php artisan config:cache), une modification du .env reste sans effet jusqu'à php artisan config:clear : voir les variables d'environnement qui retournent null.

Comment vérifier que l'envoi arrive bien ?

Avec n'importe quel Mailable de l'application (ici CommandeConfirmee, créé par php artisan make:mail CommandeConfirmee) :

Terminal
php artisan tinker --execute='Illuminate\Support\Facades\Mail::to("client@example.com")->send(new App\Mail\CommandeConfirmee);'

Le message apparaît aussitôt dans l'interface sur http://localhost:8025. Mailpit a aussi une API, pratique pour un script de contrôle :

Terminal
curl -s "http://localhost:8025/api/v1/messages?limit=1"

Dans notre test, 50 e-mails envoyés à la suite en boucle ont été reçus en moins d'une seconde : 51 messages acceptés au total, aucun refusé.

Autre solution sans aucun serveur : MAIL_MAILER=log. La documentation de Laravel le décrit ainsi : "the log mail driver will write all email messages to your log files for inspection". Pratique pour un test rapide, moins lisible qu'une vraie boîte pour vérifier la mise en page.

Sur un serveur de recette

La documentation de Laravel propose aussi Mail::alwaysTo('...') dans le boot() d'un fournisseur de services : tous les e-mails partent vers une seule adresse, ce qui évite d'écrire à de vrais clients depuis une copie de la production.

Ce type de réglage fait partie de ce que nous mettons en place sur une application sur mesure, avec des e-mails testés avant la mise en ligne et un hébergement qui garde la même configuration d'un serveur à l'autre.

À retenir
  • L'erreur 550 "too many emails per second" vient de la limite de débit de la boîte de test Mailtrap (envois par tranche de 10 secondes, selon l'abonnement).
  • En local, Mailpit (SMTP 1025, interface 8025) remplace MailHog, qui n'est plus maintenu ; Sail l'installe par défaut.
  • MAIL_MAILER, pas MAIL_DRIVER : l'ancienne variable est ignorée sans erreur.
  • Après un changement du .env, vider le cache de configuration s'il existe.

Testé avec Mailpit 1.31.6 (Docker), Laravel 13.37.0, Laravel Sail 1.69.0 et PHP 8.3.6.

Questions fréquentes

Mailpit peut-il servir sur un serveur de recette ?

Oui, il capture tout ce qui lui est envoyé en SMTP, d'où qu'il vienne. Protégez alors son interface web, qui affiche tous les messages reçus : la documentation de Mailpit prévoit un fichier d'authentification (MP_UI_AUTH_FILE).

Faut-il Docker pour utiliser Mailpit ?

Non : la documentation de Mailpit propose aussi un exécutable à télécharger (Windows, Linux et Mac) et Homebrew sur Mac. Docker reste le plus simple à lancer puis à supprimer. Cette note n'a testé que la version Docker.

Pourquoi mes e-mails partent dans le fichier de log au lieu de Mailpit ?

Le mailer utilisé est log : soit MAIL_MAILER vaut log, soit le .env contient encore MAIL_DRIVER, que Laravel ne lit plus. Vérifiez aussi que la configuration n'est pas en cache (php artisan config:clear).

Making Digital

Nous connectons les logiciels des PME, automatisons leurs tâches répétitives et créons des assistants IA, depuis 2010. Nos articles partent de nos projets réels.

Notre parcours
Une question sur ce sujet ?

Parlons-en 30 minutes.

Vous saurez si votre problème se règle, comment, et en combien de temps. Sans engagement.

Un échange de 30 minutes, en visio ou par téléphone

Gratuit, sans engagement. On parle de votre problème, pas de technique.