🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

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')  ...