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/spore

Le SDK demande PHP 8.1 ou plus récent.

SPORE_API_KEY=spore_api_key_here

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