Symfony: ¿Como usar el componente Mime?

Symfony: ¿Como usar el componente Mime?

Componente MIME de Symfony

El componente **Mime de Symfony fue introducido en la versión 4.3** y aún esta considerado un feature experimental Nota a considerar antes de comenzar a usarlo en producción.

Otro de los componentes nuevos creados por Symfony e incluidos en su versión 4.3 es el componente MIME.

Este componente nos permite crear y manipular mensajes MIME, que es el formato utilizado para enviar emails.

Por otro lado, incluye algunas utilidades relacionadas con “los tipos MIME”. El estandar MIME completo (Multipurpose Internet Mail Extensions) es una serie de estándares que definen las funcionalidades añadidas con el paso del tiempo a los emails originales basados en texto (como la posibilidad de adjuntar archivos o formatear los contenidos con HTML).

El componente Mime abstrae toda esa complejidad por nosotros para proporcionar dos formas de crear mensajes MIME. La primera es una API de alto nivel basada en la clase Symfony\Component\Mime\Email y que nos permite de forma fácil y sencilla crear emails con requerimientos básicos y comunes:

use Symfony\Component\Mime\Email;

$email = (new Email())
    ->from('fabien@symfony.com')
    ->to('foo@example.com')
    ->subject('Important Notification')
    ->text('Lorem ipsum...')
    ->html('<h1>Lorem ipsum</h1> <p>...</p>')
;

Como se puede ver en el ejemplo anterior, de una forma sencilla nos permite mediante un objeto de la clase Symfony\Component\Mime\Email, configurar los parámetros de envío a los que estamos acostumbrados normalmente.

La otra forma de crear los mensajes MIME es con una API de bajo nivel basada en la clase Symfony\Component\Mime\Message y que te brinda el control absoluto sobre todas y cada una de las partes del mensaje.

El siguiente ejemplo que veremos a continuación esta basado en el anterior pero profundizando a un nivel mas bajo la API y configurando en detalle las opciones que queremos para el envío:

use Symfony\Component\Mime\Header\Headers;
use Symfony\Component\Mime\Message;
use Symfony\Component\Mime\Part\Multipart\AlternativePart;
use Symfony\Component\Mime\Part\TextPart;

$headers = (new Headers())
    ->addMailboxListHeader('From', ['fabien@symfony.com'])
    ->addMailboxListHeader('To', ['foo@example.com'])
    ->addTextHeader('Subject', 'Important Notification')
;

$textContent = new TextPart('Lorem ipsum...');
$htmlContent = new TextPart('<h1>Lorem ipsum</h1> <p>...</p>', 'html');
$body = new AlternativePart($textContent, $htmlContent);

$email = new Message($headers, $body);

Funcionalidades extra del componente MIME:

Integración con Twig

Otra de las tantas funcionalidades del componente Mime es su integración total con Twig.

La clase Symfony\Bridge\Twig\Mime\TemplatedEmail por ejemplo permite renderizar una plantilla Twig para generar los contenidos del email:

use Symfony\Bridge\Twig\Mime\TemplatedEmail;

$email = (new TemplatedEmail())
    ->from('fabien@symfony.com')
    ->to('foo@example.com')
    // ...

    // pasa la ruta donde está la plantilla con los contenidos
    ->htmlTemplate('messages/user/signup.html.twig')

    // este método define los parámetros (nombre => valor) pasados a la plantilla
    ->context([
        'expiration_date' => new \DateTime('+7 days'),
        'username' => 'foo',
    ])
;

Funcionalidades extras del componente MIME con TWIG

El componente Mime definitivamente es tan completo que te provee de absolutamente todo lo que necesitas para crear cualquier email que requieras para tus desarrollos

Lo que sí tienes que tener en cuenta es que no envía los emails. El envío de los mensajes esta delegado a otro de los componentes de Symfony llamado “” y que se incluye también desde la versión 4.3 de Symfony. Estaré publicando acerca de este componente más adelante.

Serializando Mensajes de Email

Los mensajes de email creados con las clases de Email o Message, pueden ser fácilmente serializadas puesto que ellas son objetos simple de datos.

$email = (new Email())
    ->from('fabien@symfony.com')
    // ...
;

$serializedEmail = serialize($email);

Un caso de uso particular es para almacenar los mensajes de email serializados, incluirlos luego en un Message y ser enviado con el Componente Messenger y ser recreado luego nuevamente cuando se vaya a enviar.

Debes usar la clase RawMessage para recrear el mensaje de email desde nuestros contenidos serializados:

use Symfony\Component\Mime\RawMessage;

// ...
$serializedEmail = serialize($email);

// later, recreate the original message to actually send it
$message = new RawMessage(unserialize($serializedEmail));

Es todo por ahora con todo lo relacionado con este maravilloso componente de Symfony. Estaré publicando actualizaciones a medida que el componente vaya incorporando nuevas funcionalidades.

Recuerda que si tienes alguna sugerencia o pregunta, no dudes en dejar tus comentarios al final del post.

Si te gustó este post, ayúdame a que pueda servirle a muchas más personas, compartiendo mis contenidos en tus redes sociales.

Espero que este post haya sido de gran ayuda para ti, y como siempre, cualquier inquietud o duda que tengas, puedes contactarme por cualquiera de las vías disponibles, o dejando tus comentarios al final de este post. También puedes sugerir que temas o post te gustaría leer a futuro.

Did you find this article valuable?

Support Francisco Ugalde by becoming a sponsor. Any amount is appreciated!