Come Creare un Trasporto Email Personalizzato con Symfony Mailer

Oggi vedremo come creare un trasporto email personalizzato con Symfony Mailer. Per l'esempio, creeremo un trasporto chiamato “pt”.

Prerequisiti

Prima di iniziare, assicurati di avere installato e configurato Symfony Mailer e HttpClient nel tuo progetto. Puoi aggiungerli al tuo progetto utilizzando i seguenti comandi:

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

Creazione della Classe di Trasporto

La prima cosa da fare è creare una nuova classe che implementa Symfony\Component\Mailer\Transport\TransportInterface. La chiameremo PtTransport. Ecco un esempio di come potrebbe essere:

// 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);
    }
}

Creazione della Classe Factory

In seguito, dobbiamo creare una classe factory che sarà responsabile della creazione di istanze di PtTransport. Chiameremo questa classe PtTransportFactory. Ecco un esempio di come potrebbe apparire:

// 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')
        );
    }
}

Configurazione

Dopo di che, dobbiamo registrare PtTransportFactory come un servizio e contrassegnarlo con mailer.transport_factory. Ecco come fare questo in services.yaml:

services:
    App\Mailer\Transport\Pt

Successivamente, dobbiamo registrare PtTransportFactory come servizio e contrassegnarlo con mailer.transport_factory. Ecco come fare questo in services.yaml:

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

Utilizzo

Ora, puoi utilizzare il tuo nuovo trasporto email personalizzato configurando il tuo DSN mailer nel file .env:

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

Ed ecco fatto! Ora hai un trasporto email personalizzato con Symfony Mailer. La prossima volta che invii un'email, Symfony utilizzerà il tuo nuovo trasporto.

Conclusione

Symfony Mailer è uno strumento potente e flessibile per gestire l'invio di email nelle tue applicazioni Symfony. Creando un trasporto email personalizzato, puoi integrare facilmente qualsiasi servizio di invio email nella tua applicazione, anche se non è direttamente supportato da Symfony Mailer.

Spero che questo articolo sia stato utile e che ora tu abbia una migliore comprensione di come usare Symfony Mailer per creare un trasporto email personalizzato.