Envoyer des emails avec Symfony 5

Dans ce tuto je vous montre comment envoyer des emails avec Symfony 5. Symfony utilise SwiftMailer pour envoyer des e-mails.

SwiftMailer est un logiciel de messagerie PHP gratuit et riche en fonctionnalités. Symfony intègre SwiftMailer via son symfony

Dans l’exemple, nous avons envoyé un simple e-mail. Nous utilisons Twig pour créer un modèle d’e-mail.

?ous créons un nouveau projet squelette Symfony et allons dans le répertoire du projet nouvellement créé.

Nous avons besoin de ces dépendances , exécutez donc ces commandes :

composer req twig annotations monolog
composer req symfony/swiftmailer-bundle 

Configurer le fichier .env avec vos données :

MAILER_URL=smtp://smtp.monsite.com:465?encryption=ssl&auth_mode=login&username=admin@monsite.com&password=motdepasse

Dans le fichier .env, nous définissons la variable MAILER_URL. Il contient le serveur SMTP qui va livrer les e-mails. Si vous êtes débutant, évitez d’utiliser Gmail car la configuration correcte de Gmail est une tâche complexe en raison du haut niveau de sécurité de Gmail.

Utilisez plutôt un serveur SMTP de votre fournisseur d’hébergement ou un service tel que mailgun ou mailtrap. Les options nécessaires telles que le numéro de port et le cryptage sont fournies par le fournisseur/service.

Mainenant créons un controlleur :

php bin/console make:controller TestMailController 

Nous créons un TestMailController qui contient un lien simple pour envoyer un email.

<?php

namespace App\Controller;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class TestMailController extends AbstractController
{
    /**
     * @Route("/test/mail", name="test_mail")
     */
    public function index(Request $request, \Swift_Mailer $mailer, 
        LoggerInterface $logger)
    {
        $name = $request->query->get('name');

        $message = new \Swift_Message('Test email');
        $message->setFrom('admin@zetcode.com');
        $message->setTo('admin2@zetcode.com');
        $message->setBody(
            $this->renderView(
                'emails/mymail.html.twig',
                ['name' => $name]
            ),
            'text/html'
        );

        $mailer->send($message);

        $logger->info('email sent');
        $this->addFlash('notice', 'Email sent');

        return $this->redirectToRoute('home');
    }
}

Dans la méthode index() de TestMailController, nous envoyons l’e-mail. Notez que le code d’envoi d’e-mails ne doit pas se trouver dans un contrôleur d’une application de production ; il devrait être dans un certain service. Mais pour des raisons de simplicité, nous le laissons ici.

public function index(Request $request, \Swift_Mailer $mailer, 
    LoggerInterface $logger)
{

Nous injectons le Request, Swift_Mailer et le logger

$name = $request->query->get('name');

Nous obtenons le nom utilisé dans la requête GET.

$message = new \Swift_Message('Test email');
$message->setFrom('example@example.com');
$message->setTo('example2@example.com');

Un Swift_Message est créé. Les valeurs d’e-mail de départ et d’arrivée sont codées en dur pour simplifier cet exemple. Vous pouvez supprimer les valeurs codées en dur à titre d’exercice. (Définissez l’e-mail source en tant que paramètre, récupérez l’e-mail de destination à partir d’un formulaire.)

$message->setBody(
    $this->renderView(
        'emails/mymail.html.twig',
        ['name' => $name]
    ),
    'text/html'
);

Avec setBody(), nous définissons le corps de l’e-mail. La méthode renderView() rend la vue à partir du modèle Twig fourni. Nous passons la variable $name au modèle.

$mailer->send($message);

L’e-mail est envoyé avec send().

$logger->info('email sent');
$this->addFlash('notice', 'Email sent');

Nous enregistrons et flashons un message. Le message flash s’affiche une fois l’e-mail envoyé avec succès.

templates/emails/monemail.html.twig

Bonjour {{ name }}! Test email

Merci!