Envoyer un email transactionnel dans Laravel sans gérer SMTP

Laravel rend l’envoi d’emails agréable. L’exploitation SMTP, elle, reste un deuxième métier : réputation IP, DKIM, retries, bounces et suppressions. Le SDK Spore conserve l’ergonomie Laravel tout en déplaçant cette plomberie hors de votre application.

Le résultat attendu

Un client injectable, appelé depuis un job de queue, avec un retry idempotent. Votre contrôleur reste rapide et votre utilisateur ne reçoit jamais deux fois le même email.

1. Installer et configurer

composer require lalternative/spore
SPORE_API_KEY=sk_live_...

Ajoutez la clé dans config/services.php, puis construisez le client dans un service provider :

use GuzzleHttp\Client;
use Lalternative\Spore\Api\MessagingApi;
use Lalternative\Spore\Configuration;
 
$this->app->singleton(MessagingApi::class, function () {
    $config = Configuration::getDefaultConfiguration()
        ->setApiKey('Authorization', config('services.spore.key'))
        ->setApiKeyPrefix('Authorization', 'Bearer');
 
    return new MessagingApi(new Client(), $config);
});

2. Envoyer depuis un job

use Illuminate\Contracts\Queue\ShouldQueue;
use Lalternative\Spore\Api\MessagingApi;
use Lalternative\Spore\Model\SendEmailSendEmailRequest;
 
final class SendWelcomeEmail implements ShouldQueue
{
    public function __construct(
        public readonly string $userId,
        public readonly string $email,
    ) {}
 
    public function handle(MessagingApi $spore): void
    {
        $message = new SendEmailSendEmailRequest([
            'from' => 'hello@votredomaine.fr',
            'to' => [$this->email],
            'subject' => 'Bienvenue',
            'html' => '<p>Votre compte est prêt.</p>',
        ]);
 
        $spore->sendEmail($message, "welcome:{$this->userId}");
    }
}

3. Pourquoi la clé est métier

Laravel peut relancer un job après un timeout alors que Spore a déjà reçu le message. La clé welcome:<userId> reste identique d’une tentative à l’autre. Spore peut donc rejouer la réponse sans réexpédier l’email.

4. Ne bloquez pas le job jusqu’à la livraison

Un 202 confirme la mise en file, pas la réception finale. Laissez le job se terminer et utilisez un webhook pour mettre à jour votre propre état si votre parcours en dépend. Pour le support, GET /emails/{id} expose l’historique de chaque tentative.

Ce que vous ne maintenez plus

Pas de mot de passe SMTP, de rotation DKIM, de retry artisanal ni de liste de bounces dans Laravel. Le framework orchestre votre logique produit ; Spore orchestre la livraison.

Continuez avec la documentation PHP/Laravel ou la référence de sendEmail.