Aujourd’hui, nous allons voir comment créer un transport d’e-mail personnalisé avec Symfony Mailer. Pour l’exemple, nous créerons un transport nommé « pt ».
Prérequis
Avant de commencer, assurez-vous d’avoir installé et configuré Symfony Mailer et HttpClient dans votre projet. Vous pouvez les ajouter à votre projet avec les commandes suivantes:
composer require symfony/mailer
composer require symfony/http-client
Création de la classe de transport
La première chose à faire est de créer une nouvelle classe qui implémente Symfony\Component\Mailer\Transport\TransportInterface. Nous l’appellerons PtTransport. Voici un exemple de ce à quoi cela pourrait ressembler :
// 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);
}
}
Création de la classe de factory
Ensuite, nous devons créer une classe factory qui sera responsable de la création des instances de PtTransport. Nous l’appellerons PtTransportFactory. Voici un exemple de ce à quoi cela pourrait ressembler :
// 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')
);
}
}
Configuration
Ensuite, nous devons enregistrer PtTransportFactory comme un service et le marquer avec le tag mailer.transport_factory. Voici comment faire cela dans services.yaml :
services:
App\Mailer\Transport\Pt
Ensuite, nous devons enregistrer PtTransportFactory comme un service et le marquer avec le tag mailer.transport_factory. Voici comment faire cela dans services.yaml :
services:
App\Mailer\Transport\PtTransportFactory:
tags: ['mailer.transport_factory']
arguments:
$httpClient: '@http_client'
Utilisation
Maintenant, vous pouvez utiliser votre nouveau transport d’e-mail personnalisé en configurant votre DSN de messagerie dans votre fichier .env :
MAILER_DSN=pt://username:password@default?endpoint_url=https://your-endpoint-url
Et voilà! Vous avez maintenant un transport d’e-mail personnalisé avec Symfony Mailer. La prochaine fois que vous enverrez un e-mail, Symfony utilisera votre nouveau transport.
Conclusion
Symfony Mailer est un outil puissant et flexible pour gérer l’envoi d’e-mails dans vos applications Symfony. En créant un transport d’e-mail personnalisé, vous pouvez facilement intégrer n’importe quel service d’envoi d’e-mails dans votre application, même s’il n’est pas directement supporté par Symfony Mailer.
J’espère que cet article vous a été utile et que vous avez maintenant une meilleure compréhension de comment utiliser Symfony Mailer pour créer un transport d’e-mail personnalisé.