Comment créer un transport d’e-mail personnalisé avec Symfony Mailer

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