Comment envoyer un email en Ruby on Rails

Comment envoyer un email en Ruby on Rails

Ruby on Rails vient avec la gem ActionMailer intégrée afin de pouvoir envoyer des emails transactionnels simplement. Il utilise des classes qu’on appelle mailers ainsi que des vues pour construire ses emails. Voyons voir comment envoyer un mail avec ActionMailer au sein d’une application Ruby on Rails.

Prérequis

Pour envoyer un mail on va avoir besoin d’une application Ruby on Rails qui tourne et d’un serveur SMTP qui se chargera d’envoyer nos mails. Ici nous utiliserons Pacomail en tant que faux serveur SMTP afin de ne pas réellement envoyer nos emails. Si ce n’est pas déjà fait, allez vous inscrire sur Pacomail !

On va se placer dans le cas où on veut envoyer un mail de bienvenue à notre visiteur.

Créer un mailer

Commençons par demander à rails de générer un mailer avec la commande suivante :

rails generate mailer Welcome
      create  app/mailers/welcome_mailer.rb
      invoke  erb
      create    app/views/welcome_mailer
      invoke  test_unit
      create    test/mailers/welcome_mailer_test.rb
      create    test/mailers/previews/welcome_mailer_preview.rb

On nomme notre mailer “Welcome” et on peut voir que rails nous génère 4 éléments : le mailer, le dossier qui va contenir la ou les vues du mail et 2 fichiers qui vont nous permettre de tester notre mail mais que nous allons laisser de côté cette fois-ci.

Ouvrons notre mailer dans notre éditeur de code préféré.

On peut voir que notre classe WelcomeMailer hérite de ApplicationMailer. Cette dernière classe définit des choses communes à ses classes enfants. En l’occurrence par défaut, il définit un expéditeur et un layout de base. Un mailer est très similaire à un controller rails, il va notamment nous permettre d’utiliser des actions, des vues, des variables d’instance accessibles au sein des vues ainsi que des partials et des layouts pour construire son mail.

Maintenant, éditons notre mailer afin qu’il puisse envoyer un mail pour qu’il ressemble à ceci :

class WelcomeMailer < ApplicationMailer

	def welcome_email(email_address)
      @email_address = email_address
      mail(to: @email_address, subject: 'Bienvenue parmi nous, nouvel utilisateur')
    end

end

On utilise la fonction mail avec seulement 2 arguments : l’adresse du destinataire et le sujet. On stocke l’adresse mail du destinataire dans une variable d’instance car on va s’en servir dans le corps du mail.

Passons donc à la vue.

Implémenter la vue

Ça se passe dans le dossier app/views/welcome_mailer, nous allons créer 2 fichiers pour les 2 versions du mail, une version HTML et une version texte, nommées welcome_email.html.erb et welcome_email.text.erb.

C’est une bonne pratique d’avoir une version texte de son mail car tous les clients ne sont pas en mesure de lire du HTML même si c’est de moins en moins vrai. Avec nos 2 versions ActionMailer va détecter qu’il faut envoyer le mail au format multipart/alternative.

<h1>Bienvenue !</h1>
<p>Nous sommes ravis de te voir parmi nous <%= @email_address %></p>
Bienvenue !
Nous sommes ravis de te voir parmi nous <%= @email_address %>

A ce stade on a donc :

  • l’expéditeur
  • le destinataire
  • le sujet
  • le contenu

Il nous faut maintenant un service externe capable d’envoyer notre mail via le protocole SMTP.

Configurer le SMTP

Pour que notre application utilise un serveur SMTP, il faut lui donner la configuration du serveur en question, ici Pacomail. Dans notre exemple, on va renseigner cette configuration dans le fichier config/environments/development.rb car il est fortement lié à notre environnement de développement.

On ajoute donc ceci :

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
    address:                 'smtp.pacomail.io',
    port:                    2525,
    domain:                  'example.com',
    user_name:               '<username>',
    password:                '<password>',
    authentication:          :cram_md5,
    enable_starttls_auto:    true
}

Renseignez bien les informations de votre service d’envoi d’emails.

Envoyer notre mail

Ce faisant, il nous reste à faire l’appel au mailer au bon endroit du code, ce qui devrait ressembler à ça :

WelcomeMailer.welcome_email('to@example.com').deliver_now

On passe l’adresse email du destinataire en argument et on appelle la méthode deliver_now pour l’envoyer immédiatement au serveur SMTP. Si vous avez un système de background jobs il peut être pertinent d’utiliser plutôt deliver_later qui va utiliser ActiveJob pour le mettre dans une file d’attente et le traiter de manière asynchrone.

Si on se rend sur Pacomail, on trouve bien notre email qui a été envoyé :

Utiliser Pacomail pour tester ses emails

Félicitations ! On a donc vu de quelle manière on peut envoyer un mail avec Ruby on Rails et ActiveMailer. Si vous aussi vous voulez envoyer des emails en Ruby on Rails, je vous encourage à utiliser Pacomail afin de vous assurer de ne pas envoyer de vrais mails. La planète vous remerciera et nous aussi !

Source : https://rubyonrails.org