Cómo enviar un correo electrónico con una cuenta de zoho email (Zoho Email SMTP) en Symfony 5

Cómo enviar un correo electrónico con una cuenta de zoho email (Zoho Email SMTP) en Symfony 5

En muchas aplicaciones es necesario enviar correos electrónicos automáticamente para recibir notificaciones sobre la actividad en la cuenta de la aplicación, enviar información sobre políticas actualizadas, etc. Por supuesto, dependiendo del cliente de correo electrónico que uses, automatizar el proceso en PHP específicamente usando Swiftmailer en Symfony 5 no es muy intuitivo.

En este artículo, aprenderá cómo enviar fácilmente un correo electrónico en Symfony 5 utilizando su cuenta de Zoho Email.

1. Configurar DSN de Mailer

Edita tu archivo .env y descomenta el parámetro MAILER_DSN o créalo si no está en el archivo. La configuración de la cadena para el DSN para Zoho Email tiene este aspecto:

MAILER_DSN=smtp://<email>:<password>@smtp.zoho.com:465?encryption=ssl

En la cadena dada, deberás reemplazar <email> <password>. Por ejemplo, si nuestro correo electrónico es contact@mydomain.com y la contraseña sería 12345.

MAILER_DSN=smtp://contact%40mydomain.com:12345@smtp.zoho.com:465?encryption=ssl

La dirección SMTP de Zoho es smtp.zoho.com en el puerto 465 usando el cifrado SSL.

Nota importante: el correo electrónico y la contraseña deben estar codificados en URL, como puedes ver, el correo electrónico contact@mydomain.com está codificado en URL, por lo que el carácter @ se reemplazará por %40.

2. Envíe un correo electrónico en un controlador

Ahora, después de configurar los conceptos básicos del envío de correos (las credenciales de acceso), solo necesitas saber cómo enviar el correo electrónico. El siguiente ejemplo de controlador te muestra cómo enviar el correo electrónico. Debes importar las clases MailerInterfaceEmailTransportExceptionInterface en el controlador y luego proceder a inyectar automáticamente la clase MailerInterface en el método donde necesitas enviar el correo electrónico:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

// Incluya las clases Email, Mailer y EmailException
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;

class PagesController extends AbstractController
{
    public function index(MailerInterface $mailer): Response
    {
        $email = (new Email())
            ->from("contact@mydomain.com")
            ->to('client@somedomain.com')
            // Add carbon copy if you need
            ->cc('other@mydomain.com')
            ->replyTo("email_of_the_one_who_sends@somedomain.com")
            ->subject("This is the subject of the Email")
            ->text("This is the content of the message")
            // Si deseas enviar HTML en su lugar
            //->html("<p>This is the HTML of my Email</p>")
        ;

        try {
            $mailer->send($email);
        } catch (TransportExceptionInterface $e) {
            // algún error impidió el envío del correo electrónico; mostrar un
            // mensaje de error o intente reenviar el mensaje
        }
            
        return $this->render('pages/index.html.twig', [
            
        ]);
    }
}

Como puede ver, es bastante sencillo. En algunos casos, según la implementación, no es necesario configurar el remitente o el destinatario manualmente, por lo que puedes definirlos automáticamente a través del archivo mailer.yaml:

# config/packages/dev/mailer.yaml
framework:
    mailer:
        envelope:
            sender: 'carlos@mydomain.com'
            recipients: ['foo@example.com', 'bar@example.com']
        headers:
            from: 'Carlos <carlos@mydomain.com>'
            bcc: 'baz@example.com'

3. Envío de una plantilla como contenido de correo electrónico

Si estás buscando enviar el contenido de una vista Twig en el correo electrónico, puede usar la clase TemplatedEmail en lugar del correo electrónico. La clase extiende la clase de correo electrónico, por lo que los métodos son básicamente los mismos, sin embargo, hay un nuevo método htmlTemplate que recibe como primer argumento la ruta de la plantilla twig para renderizar. Para pasar variables a la vista Twig, puedes usar el método context que recibe como primer argumento una matriz con los datos que deseas pasar:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

// Incluir Mailer
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;

class PagesController extends AbstractController
{
    public function index(MailerInterface $mailer): Response
    {
        $email = (new TemplatedEmail())
            ->from("contact@mydomain.com")
            ->to('client@somedomain.com')
            ->subject("This is the subject of the Email")
                
            // ruta de la plantilla Twig para renderizar
            ->htmlTemplate('emails/notification.html.twig')
            // pasar variables (nombre => valor) a la plantilla
            ->context([
                'username' => "Bruce Wayne",
            ]);

        try {
            $mailer->send($email);
        } catch (TransportExceptionInterface $e) {
            // algún error impidió el envío del correo electrónico; mostrar un
            // mensaje de error o intente reenviar el mensaje
        }
            
        return $this->render('pages/index.html.twig', [
            
        ]);
    }
}

El código Twig de la plantilla que renderizaríamos en el correo electrónico es:

{# templates/emails/notification.html.twig #}
<h1>Welcome {{ username }}!</h1>

<p>
    Welcome to our website
</p>

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable