Symfony comment recevoir les erreurs par mails avec monolog, swiftmailer et maildev

Prérequis du tutoriel pour recevoir les mails :

monolog https://packagist.org/packages/symfony/monolog-bundle (Permet de recevoir les erreurs serveur par mail)

maildev https://github.com/maildev/maildev (Permet de créer un serveur SMTP local)

swiftmailer https://packagist.org/packages/symfony/swiftmailer-bundle (Permet d’envoyer des mails sous Symfony)

Configurer Monolog pour le template des mails:

Allez dans le fichier monolog.yaml dans le dossier config/packages/dev (ou prod pour la prod..)

Et définissez les options comme dans l’encadré si dessous pour recevoir les erreurs critique (donc 5XX) mais il est également possible de configurer les erreurs 4XX : Voir plus d’options

Dans la partie “swift” nous définissons qui envoie le mail, qui recevra le mail, ainsi que le sujet de l’email.

# config/packages/dev/monolog.yaml
monolog:
  handlers:
    main:
      type: fingers_crossed
      # 500 errors are logged at the critical level
      action_level: critical
      # to also log 400 level errors (but not 404's):
      # action_level: error
      # excluded_404s:
      #     - ^/
      handler: deduplicated
    deduplicated:
      type: deduplication
      handler: swift
    swift:
      type: swift_mailer
      from_email: 'error@example.com'
      to_email: 'error@example.com'
      # or list of recipients
      # to_email:   ['dev1@example.com', 'dev2@example.com', ...]                                             
      subject: 'An Error Occurred! %%message%%'
      level: debug
      formatter: monolog.formatter.html
      content_type: text/html

Configurer swiftmailer pour recevoir les mails:

Dans le fichier swiftmailer.yaml dans le dossier config/packages, vous pouvez voir que l’url du SMTP est ‘%env(MAILER_URL)%’ cela veut dire que la variable qui contient l’url est dans le fichier .env du projet, il faut donc aller le modifier directement là bas.

swiftmailer:
    url: '%env(MAILER_URL)%'
    spool: { type: 'memory' }

Dirigez vous donc vers le fichier .env et modifier le MAILER_URL comme ceci :

MAILER_URL=smtp://localhost:1025

Pour recevoir les mails en local sur l’interface maildev, sinon mettez les informations de votre SMTP En savoir plus.

Lancer maildev pour recevoir les mails en local :

Allez dans une invite de commande et lancez la commande “maildev“:

MailDev webapp running at http://0.0.0.0:1080
MailDev SMTP Server running at 0.0.0.0:1025

Vous verrez ces deux lignes apparaitre pour signaler le lancement du smtp local, les mails sont donc envoyé sur localhost:1025 et l’interface est sur le port 1080.

Simulez une erreur sous Symfony :

Nous allons maintenant tenter d’envoyer un mail d’erreur à notre serveur SMTP.

Dans mon cas j’ai crée une erreur assez simple dans mon controller.

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class AppController extends AbstractController
{
    /**
     * @Route("/app", name="app")
     */
    public function app(): Response
    {
        $var = "";
        //L'erreur est ici car ->getError() n'existe pas
        dump($var->getError());
        return $this->json('error !');
    }
}

L’erreur est simple, getError n’existe pas ce qui va provoquer une erreur 5xx, ensuite monolog va intercepter cette erreur, et puisque nous avons défini que nous voulons toutes les erreurs 5xx par mails, il va l’envoyer via notre swiftmailer configuré pour envoyer les mails sur notre SMTP local via maildev.

Lorsque l’on accède à notre route, nous avons cette erreur 500, qui est donc renvoyée à notre interface maildev:

Voici l’interface maildev avec notre mail d’erreur, et si vous défilez vous pouvez trouver l’erreur critique qui à bloqué votre serveur:

Vous pouvez maintenant recevoir les erreurs serveur de votre serveur Symfony via mail pour les résoudre plus rapidement en production.

Ce tutoriel est maintenant fini, merci pour votre lecture.