La clase Mailer
Instalación y configuración
Antes de finalizar esta exploración de Symfony, detengámonos en una clase bastante útil, que es la clase Mailer. En las versiones anteriores de Symfony, se utilizaba la clase SwiftMailer, pero hoy en día, en la versión 7, Symfony recomienda la clase Mailer para el envío de correos electrónicos: https://symfony.com/doc/current/mailer.html
La clase Mailer ya está instalada por defecto en la aplicación base. Compruebe que, en efecto, está presente en el archivo composer.json:
"symfony/mailer": "7.0.*",
Si no la encuentra, instálela utilizando Composer:
composer require symfony/mailer
Antes de utilizar Mailer, hay algo muy importante por hacer y que puede pasar desapercibido: debe comentar las instrucciones asincrónicas.
Si no lo hace, nunca verá sus correos electrónicos enviados y podría perder la paciencia tratando de entender por qué.
Para comentar las instrucciones asincrónicas, abra el archivo:
config/packages/messenger.yaml
Y comente o elimine las siguientes instrucciones:
routing:
# Symfony\Component\Mailer\Messenger\SendEmailMessage: async
# Symfony\Component\Notifier\Message\ChatMessage: async
# Symfony\Component\Notifier\Message\SmsMessage: async
Es especialmente...
Envío de e-mails
La biblioteca Mailer funciona creando y enviando objetos de la clase Mailer.
Crearemos un nuevo controlador para mostrar un ejemplo:
php bin/console make:controller MailController
Encontrará un ejemplo de código para el controlador Mailer en la página: https://symfony.com/doc/current/mailer.html#creating-sending-messages
Lo hemos adaptado a nuestras necesidades:
<?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('miAppSymf@symfony.com')
->to('destinatario@email.com')
->subject('Mi Applicación Symfony')
->text('¡Hola!')
->html('<p>Symfony...
Uso de una plantilla
Puede ser interesante utilizar una plantilla Twig para el cuerpo del correo electrónico en lugar de código HTML. Para utilizar una plantilla, simplemente reemplace la clase Email por la clase TemplatedEmail. Encontrará el contenido de esta clase en esta página: https://github.com/symfony/symfony/blob/6.2/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php
Entonces podrá utilizar el método htmlTemplate() en lugar de html(). Por ejemplo, en nuestra clase MailController, estos son los cambios que hay que realizar:
<?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('miAppSymf@symfony.com')
->to('destinatario@gmail.com') ...