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érequisAvant de commence...
TBÉcrit parThomas Bourdin3 min de lecture
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:
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 :
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é.
Valider le transport sans exposer les identifiants
Les mécanismes d’authentification des fournisseurs de messagerie évoluent. Stockez les secrets hors du dépôt, utilisez un compte technique aux droits minimaux et testez d’abord l’envoi vers une adresse contrôlée.
Vérifiez le chiffrement TLS, le port et la méthode d’authentification attendus par le fournisseur.
Contrôlez les journaux applicatifs et la file d’attente, sans y afficher de mot de passe.
Pour Google, privilégiez « Se connecter avec Google » ; un mot de passe d’application exige la validation en deux étapes et doit pouvoir être révoqué.
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érequisAvant de commence...
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:
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’appelleronsPtTransport. 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’appelleronsPtTransportFactory. 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
PtTransportFactorycomme un service et le marquer avec le tagmailer.transport_factory. Voici comment faire cela dansservices.yaml:services: App\Mailer\Transport\PtEnsuite, nous devons enregistrer
PtTransportFactorycomme un service et le marquer avec le tagmailer.transport_factory. Voici comment faire cela dansservices.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: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é.
Valider le transport sans exposer les identifiants
Les mécanismes d’authentification des fournisseurs de messagerie évoluent. Stockez les secrets hors du dépôt, utilisez un compte technique aux droits minimaux et testez d’abord l’envoi vers une adresse contrôlée.
Référence : documentation Google sur les mots de passe d’application.