Envoyer un email transactionnel en PHP sans serveur SMTP
Un script PHP ou une application Symfony n’a pas besoin de devenir opérateur SMTP. Le client Spore transforme l’envoi en requête HTTP typée ; la plateforme prend ensuite en charge DKIM, la file, les retries et les suppressions.
Ce que nous allons construire
Un service PHP réutilisable avec Guzzle, une clé d’idempotence liée à votre action métier et une gestion explicite des erreurs API.
1. Installer le package Composer
composer require lalternative/sporeLe SDK demande PHP 8.1 ou plus récent.
SPORE_API_KEY=spore_api_key_here2. Configurer le client
<?php
use GuzzleHttp\Client;
use Lalternative\Spore\Api\MessagingApi;
use Lalternative\Spore\Configuration;
$apiKey = getenv('SPORE_API_KEY');
if (!$apiKey) {
throw new RuntimeException('SPORE_API_KEY is required');
}
$configuration = Configuration::getDefaultConfiguration()
->setApiKey('Authorization', $apiKey)
->setApiKeyPrefix('Authorization', 'Bearer');
$spore = new MessagingApi(new Client(), $configuration);3. Envoyer un email
use Lalternative\Spore\Model\SendEmailSendEmailRequest;
$userId = 'user_42';
$message = new SendEmailSendEmailRequest([
'from' => 'hello@votredomaine.fr',
'to' => ['alex@example.com'],
'subject' => 'Bienvenue',
'html' => '<p>Votre compte est prêt.</p>',
]);
$result = $spore->sendEmail($message, "welcome:{$userId}");
echo $result->getMessageId();Le second argument de sendEmail devient l’en-tête Idempotency-Key. Gardez
la même valeur lorsque votre queue ou votre cron relance la même action.
4. Distinguer erreur et mise en file
use Lalternative\Spore\ApiException;
try {
$result = $spore->sendEmail($message, "welcome:{$userId}");
} catch (ApiException $error) {
error_log((string) $error->getResponseBody());
throw $error;
}Une réponse 202 signifie que le message est en file. Ne gardez pas le
processus PHP ouvert jusqu’à la livraison finale : conservez le messageId et
laissez un webhook mettre à jour votre état si le parcours produit en dépend.
5. Brancher votre framework
Dans Symfony, enregistrez MessagingApi comme service. Dans Laravel, exposez-le
comme singleton et appelez-le depuis un job de queue. Le transport change, pas
la structure de votre application.
Continuez avec le guide Laravel, la
documentation PHP ou la
référence de sendEmail.