La semaine dernière, lors du keynote de la SymfonyLive Paris 2019 où netinfluence était présent, Fabien Potencier a annoncé le nouveau composant Mailer de Symfony. Celui-ci rejoint le composant Mime, qui avait été dévoilé lors la SymfonyLive Lille. Ensemble, ils proposent une solution pour l’envoi d’e-mails transactionnels, c’est-à-dire « uns par uns » (à l’opposé de l’envoi de newsletters, par exemple).
Ces composants proposent une alternative à la librairie SwiftMailer. Bien que très bien maintenue, elle souffrait de son âge point de vue fonctionnalité, avec peu ou prou d’ajouts ces dernières années. On peut imaginer que l’architecture et les contraintes de la backward compatibility posaient trop de limites. D’où le besoin d’un nouveau composant pour les besoins de 2019, Mailer Mime.
Toutefois pour l’instant cela est une alternative, SwiftMailer n’est pas remplacé officiellement dans Symfony 4. Cela sera peut-être pour la version 5? Pour l’anecdocte, SwiftMailer a été la solution par défaut de Symfony 1.3 à la version 4, soit pendant presque de 10 ans, un bel exemple de stabilité et qualité!
Installation
Cet article étant une preview, nous allons tester le composant qui est encore en cours de développement, et donc expérimental.
Pour réussi cela, il va donc falloir éditer notre composer.json
.
Tout d’abord, il faut ajouter "minimum-stability": "dev"
(ou bien remplacer stable
, la valeur par défaut). Ensuite, dans le cas où vous utilisez Flex, trouvez la ligne extra.symfony.require
, et remplacez 4.2.*
(par exemple) par ~4.2
.
Il est maintenant possible de faire composer require symfony/mailer:dev --update-with-dependencies
, la seule commande que l’on retiendra pour le futur, une fois une version officielle publiée 🙂
Prise en main
La prise en main est on ne peut plus simple: on rédige un email, représenté par l’object Symfony\Component\Mime\Email
, et l’envoi via le service Symfony\Component\Mailer\Mailer
. Très simple et efficace!
Quelques secondes plus tard nous recevons l’e-mail, ici j’ai utilisé MailCatcher pour « l’attraper » via un serveur SMTP bouchon:
Autre nouveauté immédiatement visible: en cas d’erreur, des Exceptions sont émises. Pas moyen de râter un e-mail qui n’est pas envoyé, contrairement à SwiftMailer (+ son bundle) où les erreurs étaient facilement perdues dans les logs, voir invisibles dans certains cas. De plus, en cas d’exception lors de la connexion au serveur pour un envoi multiple, aucun e-mail n’est envoyé, pour éviter des envois « partiels » très délicats à gérer après.
Aller plus loin
Un cas très courant est de vouloir rendre un template Twig pour générer l’HTML de notre e-mail, comme avec le fameux TwigSwiftMailer
du FOSUserBundle.
Là encore, les nouveaux composants viennent à notre secours, avec la possibilité d’écrire un Symfony\Bridge\Twig\Mime\TemplatedEmail
:
L’email sera envoyé avec en contenu HTML le contenu du template, mais aussi une version TXT générée automatiquement (sans les tags HTML).
Cela est vraiment très rapide à utiliser et l’interface est très agréable.
À noter, deux syntaxes différentes sont possibles au niveau des templates. Il est possible d’avoir un unique template avec des blocs pour chaque partie de notre message (notre exemple), ou bien un template pour le contenu texte (textTemplate()
) et un autre pour le contenu HTML (htmlTemplate()
). La première syntaxe me semble plus utile, vu que les templates seront souvent assez courts, contenant surtout des clefs de traduction dans notre cas (avec 4 langues nationales, dur de faire un projet en Suisse sans traductions!).
Pour finir, « out-of-the-box » le Mailer supportera Amazon SES, Gmail, Mailchimp, Mailgun, Postmark et Sendgrid. Il suffit de changer le DSN, avec par exemple smtp://MY_POSTMARK_KEY@postmark
pour envoyer des e-mails via Postmark. Un composant batteries included, vraiment!
Et encore bien plus!
Cette preview ne se veut qu’une prise en main très rapide des composants afin de découvrir leur philosophie, mais il reste encore plein de fonctionnalités à explorer. La nouvelle architecture du Mailer se base largement sur un bus, avec la possibilité d’utiliser Symfony Messenger pour envoyer des messages en asynchrone, ou encore d’utiliser une message queue pour gérer plus facilement une forte volumétrie.
De plus, il est possible de rajouter des listeners, qui peuvent modifier l’e-mail. Sans installer de librairie tierce, il sera ainsi possible d’inliner le CSS dans l’e-mail, d’utiliser une syntaxe autre que HTML comme par exemple Inky… Toutes ces fonctionnalités seront l’occasion d’un article plus avancé, plus tutoriel, après la publication d’une version finale et de son intégration complète à Symfony.
Les nouveaux composants Mailer et Mime sont très prometteurs. Ils posent des bases solides et saines pour permettre de faire plus, plus simplement. De plus, Symfony a des engagements forts point de vue qualité du code et tests, support et maintenance dans le futur, backward-compatibility, qui leurs permettront à mon avis de rapidement devenir les références de demain, et peut-être même pour les 10 prochaines années à leur tour 🙂