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.