Envoyer un email transactionnel dans Rails avec Active Job

Action Mailer est excellent pour composer un message. Mais une application Rails solo-maintenable ne devrait pas aussi exploiter une infrastructure SMTP. Avec Spore, Active Job garde la responsabilité du workflow ; l’API prend celle de la livraison.

L’intégration en trois pièces

Un initializer pour la clé, un modèle de requête typé, puis un job idempotent. Rien à configurer sur les ports 25 ou 587.

1. Installer le gem

# Gemfile
gem "spore-email"
bundle install

2. Configurer Spore

# config/initializers/spore.rb
SporeEmail.configure do |config|
  config.api_key["Authorization"] = ENV.fetch("SPORE_API_KEY")
  config.api_key_prefix["Authorization"] = "Bearer"
end

3. Envoyer depuis Active Job

class SendWelcomeEmailJob < ApplicationJob
  queue_as :mailers
 
  def perform(user_id)
    user = User.find(user_id)
    message = SporeEmail::SendEmailSendEmailRequest.new(
      from: "hello@votredomaine.fr",
      to: [user.email],
      subject: "Bienvenue",
      html: ApplicationController.render(
        template: "emails/welcome",
        assigns: { user: user },
        layout: "mailer"
      )
    )
 
    SporeEmail::MessagingApi.new.send_email(
      message,
      idempotency_key: "welcome:#{user.id}"
    )
  end
end

Vous conservez vos vues Rails et vos layouts. Seul le transport change : le HTML rendu part vers une API HTTP au lieu d’une session SMTP.

4. Laisser les retries coopérer

Active Job peut relancer perform. La clé stable welcome:<id> garantit que ces relances techniques représentent toujours une seule intention métier. Une nouvelle notification légitime doit, elle, recevoir une nouvelle clé.

5. Suivre le résultat

L’appel renvoie un identifiant et le statut initial queued. Pour les parcours qui doivent réagir à un bounce ou à un échec définitif, consommez les webhooks Spore. Pour une investigation ponctuelle, ouvrez le détail du message ou appelez GET /emails/{id}.

La frontière utile

Rails rend le contenu et décide quand envoyer. Spore signe, retente et protège la réputation du domaine. Cette séparation laisse moins d’infrastructure dans le projet, donc moins de choses à réparer seul un dimanche.

Continuez avec la documentation Ruby/Rails ou la référence de sendEmail.