Blog ENI : Toute la veille numérique !
🎁 Jusqu'au 25/12 : 1 commande de contenus en ligne
= 1 chance de gagner un cadeau*. Cliquez ici
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici
  1. Livres et vidéos
  2. Apprendre à développer des applications web avec PHP et Symfony (2e édition)
  3. La classe Mailer
Extrait - Apprendre à développer des applications web avec PHP et Symfony (2e édition)
Extraits du livre
Apprendre à développer des applications web avec PHP et Symfony (2e édition)
2 avis
Revenir à la page d'achat du livre

La classe Mailer

Installation et configuration

Avant de terminer cette exploration de Symfony, arrêtons-nous sur une classe bien sympathique qui est la classe Mailer. Dans les anciennes versions de Symfony, c’était la classe SwiftMailer qui était utilisée, mais aujourd’hui, en version 6, Symfony préconise la classe Mailer pour l’envoi des e-mails.

La classe Mailer est déjà installée par défaut dans l’application de base. Vérifiez que c’est bien le cas, elle doit être présente dans le fichier composer.json :

"symfony/mailer": "6.2.*", 

Si vous ne la trouvez pas, installez-la, en utilisant Composer :

composer require symfony/mailer 

Avant d’utiliser Mailer, il y a une chose très importante à faire et qui n’est pas évidente à connaître : vous devez commenter les instructions asynchrones.

Si vous ne le faites pas, vous ne verrez jamais vos e-mails envoyés et vous risquez de perdre patience à comprendre pourquoi.

Pour commenter les instructions asynchrones, ouvrez le fichier :

config/messenger.yaml

Et commentez ou supprimez les instructions suivantes :

   routing: 
    # Symfony\Component\Mailer\Messenger\SendEmailMessage: async 
    # Symfony\Component\Notifier\Message\ChatMessage: async 
    #...

Envoi d’e-mails

La bibliothèque Mailer fonctionne en créant, puis en envoyant des objets de la classe Mailer.

Nous allons créer un nouveau contrôleur pour montrer un exemple :

php bin/console make:controller MailController 

Vous trouverez un exemple de code de l’utilisation de la classe Mailer dans un contrôleur sur la page : https://symfony.com/doc/current/mailer.html#creating-sending-messages

Nous l’avons adaptée à notre besoin, la voici :

<?php 
namespace App\Controller; 
 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Mailer\MailerInterface; 
use Symfony\Component\Mime\Email; 
use Symfony\Component\Routing\Annotation\Route; 
 
class MailController extends AbstractController 
{ 
    #[Route('/email',name:'email')] 
    public function sendEmail(MailerInterface $mailer): Response 
    { 
      $email = (new Email()) 
          ->from('monAppliSymf@symfony.com') 
          ->to('mondestinataire@monmail.com') 
          ->subject('Mon appli Symfony') 
          ->text('Hello Email de notre Symfony ! ') 
          ->html('<p>Symfony is the best</p>'); 
        $mailer->send($email); 
        return new Response('message envoyé'); 
    } 
} 

Un message est défini par un objet de la classe Email :

$email = (new Email()) 

Les () encapsulant l’instruction new permettent d’exécuter directement les méthodes suivantes...

Utilisation d’un template

Il peut être intéressant d’utiliser un template Twig pour le corps de l’e-mail en lieu et place d’un code HTML. Pour utiliser un template, il suffit de remplacer la classe Email par la classe TemplatedEmail. Vous trouverez le contenu de cette classe sur cette page : https://github.com/symfony/symfony/blob/6.2/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php

Vous pourrez alors utiliser la méthode htmlTemplate() au lieu de html(). Par exemple, dans notre classe MailController voici les changements :

<?php 
namespace App\Controller; 
 
 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Mailer\MailerInterface; 
use Symfony\Bridge\Twig\Mime\TemplatedEmail; 
use Symfony\Component\Routing\Annotation\Route; 
 
class MailController extends AbstractController 
{ 
    #[Route('/email',name:'email')] 
    public function sendEmail(MailerInterface $mailer): Response 
    { 
        $email = (new TemplatedEmail()) 
        ->from('monAppliSymf@symfony.com') 
        ->to('maildestination@gmail.com') 
        ->subject('Hello...