SOS mes mails ne partent pas avec Symfony

Ahah, encore un truc que je n’ai pas demandé, mais qui a changé avec Symfony.

Historiquement avec Symfony quand je voulais envoyer un email, par exemple suite à une inscription sur mon site (validation de compte quoi). J’utilise MailerInterface, je peuple mon instance et paf, j’envoie avec la méthode :

$mailer->send();

et zou c’est parti.

Que nenni mon ami, depuis la version 7, il semblerait que ce n’est plus le fonctionnement standard. Il stocke plutôt les messages en BDD via Messenger et les envoie de manière async. Cela part d’une bonne attention, le fait d’éviter les fonctionnements synchrones. En effet, on envoie une notification de création de message, stocké en BDD, puis un worker passe régulièrement pour faire une partie des envois, de manière régulière.

Mais le problème, c’est encore le fonctionnement sur des hébergements mutualisés qui ne nous permettent pas toujours d’avoir accès à ce genre d’outils. (WIP, je vais creuser ça).

Résoudre ça

Pour résoudre ça rapidement, il est possible de faire une rustine ici :

config/package/messager.yaml

au niveau de routing, commentez cette ligne:

# FIXME check for worker in my host
Symfony\Component\Mailer\Messenger\SendEmailMessage: async

Et on n’oublie pas le petit fixme, pour revoir ça plus tard.

Exemple de code pour test

Si vous voulez tester rapidement, vous pouvez créer, si ce n’est déjà fait, un MailController qui va se charger de tout les envoie de mail que je forward sur une route spécifique. C’est ce que je fais dans mes projets afin de séparer les responsabilités.

Dans mon MailController, je crée une route de test (à supprimer en sûr).

   #[Route('/mail_test', name: 'mail_test')]
    public function mailTest(MailerInterface $mailer)
    {
        
        if ($_ENV["APP_ENV"] == 'dev') {

            // create new emailObject
            $email = (new Email())
                ->from('test@test.com')
                ->to("client@client.com")
                ->subject("Mail de test")
                ->text(
                    "Bonjour je suis un mail de test"
                )
                ->html(
                    "<h2>Bonjour je suis un mail de test mais en HTML</h2>"
                );

            // send it via mailerInterface
            $mailer->send($email);
            // dd($email);

        }
        // redirect to home anyway
        return new RedirectResponse("/");
    }