Aprende a configurar Zoho SMTP para enviar un correo electrónico desde un controlador en Symfony 5 usando el componente de correo de Symfony.

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 [email protected] y la contraseña sería 12345.

MAILER_DSN=smtp://contact%40mydomain.com:[email protected]: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 [email protected] 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("[email protected]")
            ->to('[email protected]')
            // Add carbon copy if you need
            ->cc('[email protected]')
            ->replyTo("[email protected]")
            ->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: '[email protected]'
            recipients: ['[email protected]', '[email protected]']
        headers:
            from: 'Carlos <[email protected]>'
            bcc: '[email protected]'

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("[email protected]")
            ->to('[email protected]')
            ->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 ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores