Cómo crear un transporte de correo electrónico personalizado con Symfony Mailer

Hoy, vamos a ver cómo crear un transporte de correo electrónico personalizado con Symfony Mailer. Para el ejemplo, crearemos un transporte llamado “pt”.

Prerrequisitos

Antes de comenzar, asegúrate de haber instalado y configurado Symfony Mailer y HttpClient en tu proyecto. Puedes añadirlos a tu proyecto utilizando los siguientes comandos:

composer require symfony/mailer
composer require symfony/http-client

Creando la Clase de Transporte

Lo primero que debemos hacer es crear una nueva clase que implemente Symfony\Component\Mailer\Transport\TransportInterface. La llamaremos PtTransport. Aquí tienes un ejemplo de cómo podría ser:

// src/Mailer/Transport/PtTransport.php

namespace App\Mailer\Transport;

use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\Transport\TransportInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\RawMessage;
use Symfony\Contracts\HttpClient\HttpClientInterface;

class PtTransport implements TransportInterface
{
    private $httpClient;
    private $username;
    private $password;
    private $endpointUrl;

    public function __construct(HttpClientInterface $httpClient, string $username, string $password, string $endpointUrl)
    {
        $this->httpClient = $httpClient;
        $this->username = $username;
        $this->password = $password;
        $this->endpointUrl = $endpointUrl;
    }

    public function send(RawMessage $message, ?Symfony\Component\Mailer\Envelope $envelope = null): ?Symfony\Component\Mailer\SentMessage
    {
        // Implémentez ici votre logique d'envoi d'e-mail
        // Vous pouvez utiliser $this->httpClient pour faire une requête HTTP à $this->endpointUrl
    }

    public function __toString(): string
    {
        return sprintf('pt://%s@%s', $this->username, $this->endpointUrl);
    }
}

Creando la Clase de Fábrica

A continuación, necesitamos crear una clase de fábrica que será responsable de crear instancias de PtTransport. Llamaremos a esta clase PtTransportFactory. Aquí tienes un ejemplo de cómo podría ser:

// src/Mailer/Transport/PtTransportFactory.php

namespace App\Mailer\Transport;

use Symfony\Component\Mailer\Exception\UnsupportedSchemeException;
use Symfony\Component\Mailer\Transport\AbstractTransportFactory;
use Symfony\Component\Mailer\Transport\Dsn;
use Symfony\Component\Mailer\Transport\TransportInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;

class PtTransportFactory extends AbstractTransportFactory
{
    private $httpClient;

    public function __construct(HttpClientInterface $httpClient)
    {
        $this->httpClient = $httpClient;
    }

    public function supports(Dsn $dsn): bool
    {
        return 'pt' === $dsn->getScheme();
    }

    public function create(Dsn $dsn): TransportInterface
    {
        return new PtTransport(
            $this->httpClient,
            $dsn->getUser(),
            $dsn->getPassword(),
            $dsn->getOption('endpoint_url')
        );
    }
}

Configuración

Después de eso, necesitamos registrar PtTransportFactory como un servicio y etiquetarlo con mailer.transport_factory. Así es cómo hacer esto en services.yaml:

services:
    App\Mailer\Transport\Pt

A continuación, necesitamos registrar PtTransportFactory como un servicio y etiquetarlo con mailer.transport_factory. Así es cómo hacer esto en services.yaml:

services:
    App\Mailer\Transport\PtTransportFactory:
        tags: ['mailer.transport_factory']
        arguments:
            $httpClient: '@http_client'

Uso

Ahora, puedes usar tu nuevo transporte de correo electrónico personalizado configurando tu DSN de mailer en tu archivo .env:

MAILER_DSN=pt://username:password@default?endpoint_url=https://your-endpoint-url

¡Y eso es todo! Ahora tienes un transporte de correo electrónico personalizado con Symfony Mailer. La próxima vez que envíes un correo electrónico, Symfony utilizará tu nuevo transporte.

Conclusión

Symfony Mailer es una herramienta poderosa y flexible para gestionar el envío de correos electrónicos en tus aplicaciones Symfony. Al crear un transporte de correo electrónico personalizado, puedes integrar fácilmente cualquier servicio de envío de correos electrónicos en tu aplicación, incluso si no está directamente soportado por Symfony Mailer.

Espero que este artículo haya sido de ayuda y que ahora tengas un mejor entendimiento de cómo usar Symfony Mailer para crear un transporte de correo electrónico personalizado.