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é.