Action Mailer – Envoyer des mails depuis son App Rails

La différence entre un mail transactionnel et marketing

Le mail marketing est envoyé à plusieurs personnes, tandis que le mail transactionnel est envoyé à une seule personne. On parle de mail de marketing dans le cas d’une newsletter alors qu’une confirmation de création de compte ou une facture reçue par mail sont des mails transactionnels. Le mail transactionnel peut servir par exemple pour confirmer l’inscription d’un utilisateur lorsqu’il vous a donné son email depuis une Landing Page.

Le protocole SMTP (Simple Mail Tranfert Protocol)

C’est un protocole de communication permettant l’envoi de mail entre un serveur et un client.

Action Mailer : C’est parti !

Créez un nouveau projet avec le nom de votre choix, ici “app_name” en précisant l’utilisation d’une base de données PostgreSQL. Le scaffold va nous générer les fonctions basiques du CRUD (Create Read Update Delete) et nous servir pour la démo.

$ rails new app_name -d postgresql
$ cd app_name rails g scaffold contact Firstname:string Lastname:string email:string
$ git init git add .
$ git commit -m "First commit"
$ hub create
$ git push origin master rails db:create && rails db:migrate

Générez votre premier mailer avec un unique mail de bienvenue.

$ rails g mailer ContactMailer welcome 

Depuis votre éditeur préféré comme sublimetext vous pouvez constater la création d’un contrôleur ContactMailler avec la vue associée et un layout qui sert pour la mise en commun d’une signature par exemple le logo, l’adresse, etc…

Le contrôleur ContactMailer dépend du ApplicationMailer

# app/mailers/contact_mailer.rb
class ContactMailer < ApplicationMailer
def welcome(contact)
@contact = contact mail(to: @contact.email, subject: "Bienvenue chez Nous")
end
end

La méthode Welcome définit un type de mail à envoyer à disposition de la vue associée welcome.html.erb. Vous pouvez supprimer l’autre vue welcome.text.erb car rare sont les messageries qui n’arrive pas à lire le HTML

Si vous voulez ajouter d’autres paramètres à l’action mail, consultez la documentation

Ajoutez dans le ApplicationMailer votre adresse mail pour l’envoie à la place de ‘postmaster@domain.com

# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: '[email protected]'
layout 'mailer'
end

Modifiez la vue welcome.html.erb comme ci-dessous

# app/views/contact_mailer/welcome.html.erb
<h1>Bonjour <%= @contact.Firstname %> <%= @contact.Lastname %></h1> <p>Bienvenue !</p>
A bientôt <strong>BestCompany</strong>

Action Mailer : Comment prévisualiser le mail ?

Créez le dossier previews et le fichier contact_mailer_preview.rb

$ mkdir -p test/mailers/previews && touch test/mailers/previews/contact_mailer_preview.rb 

Ajoutez le code comme ci-dessous :

La méthode welcome va récupérer le dernier contact enregistré dans la base de données et construire le mail

# test/mailers/previews/
contact_mailer_preview.rb
class ContactMailerPreview < ActionMailer::Preview
def welcome
contact = Contact.last
ContactMailer.welcome(contact)
end
end

Créez un utilisateur depuis la console de rails grâce à la commande rails c

$ rails c
Running via Spring preloader in process 29874
Loading development environment (Rails 5.0.4)
irb(main):001:0> contact = Contact.new(Firstname: "John", Lastname: "Doe", email: "[email protected]") => #<Contact id: nil, Firstname: "John", Lastname: "Doe", email: "[email protected]", created_at: nil, updated_at: nil>
irb(main):002:0> contact.save
(0.2ms) BEGIN
SQL (0.4ms) INSERT INTO "contacts" ("Firstname", "Lastname", "email", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["Firstname", "John"], ["Lastname", "Doe"], ["email", "[email protected]"], ["created_at", "2017-06-27 13:37:31.756382"], ["updated_at", "2017-06-27 13:37:31.756382"]]
(5.0ms) COMMIT
=> true
irb(main):003:0> exit

Démarrez votre serveur avec rails s et visualisez le mail en entrant l’URL suivante : localhost:3000/rails/mailers/contact_mailer/welcome

action mailer - mail de prévisualisation depuis localhost

Action Mailer : Simuler l’envoie de mails en mode développement

Ajoutez la Gem letter_opener dans votre Gemfile uniquement pour la partie développement.

# Gemfile 
gem "letter_opener", group: :development

Installez la Gem à l’aide du bundle.

$ bundle install 

Ajoutez à la fin de votre fichier development.rb la ligne suivante :

# config/environments/development.rb
config.action_mailer.delivery_method = :letter_opener

Action Mailer : Comment faire pour envoyer le mail une fois que l’utilisateur est créé en base de données ?

Première méthode : Depuis le modèle Contact

# app/models/contact.rb
class Contact < ApplicationRecord
after_create :send_welcome_email

private
def send_welcome_email
ContactMailer.welcome(self).deliver.now
end
end

Redémarrez votre serveur Rails “rails s” pour prendre en compte les modifications

Créez un utilisateur “rails c” et vous verrez apparaître automatiquement sur votre navigateur la page de prévisualisation de mail de letter_opener

Seconde méthode : Depuis le contrôleur de Contact

Dès que le contact est sauvegardé en base de données le mail est envoyé

# app/controllers/contact_controller.rb
class ContactsController < ApplicationController
[...]
def create
@contact = Contact.new(contact_params)
if @contact.save
ContactMailer.welcome(@contact).deliver_now
else
render "index.html.erb"
end
end
[...]

Ajoutez la page index à votre routes.rb

# app/config/locales/routes.rb 
Rails.application.routes.draw do
root "contacts#index"
resources :contacts
end

Maintenant remplissez votre formulaire depuis votre App avec le prénom, le nom et l’email

Complétez le formulaire et cliquez sur Create Contact.

action mailer - formulaire
action mailer letter_opener

Vous devez voir s’ouvrir automatiquement une fenêtre qui affiche le mail à prévisualiser

mail à prévisualiser fonctionne

Désormais, passons aux choses sérieuses ! Envoyons réellement notre mail transactionnel

Action Mailer : Envoyer ses mails pour de VRAI en production

Création du dépôt sur le service d’hébergement cloud Heroku

Nous ajoutons “–region eu” pour que le serveur soit proche géographiquement de nous

“Heroku push origin master” permet d’uploader notre dépôt Git chez Heroku, “Heroku run rails db:migrate” permet de migrer la base de donnée chez Heroku et pour finir “Heroku open” ouvre une nouvelle fenêtre dans votre navigateur pour afficher le résultat

$ heroku create tutomailler --region eu
$ git push heroku master
$ heroku run rails
$ db:migrate
$ heroku open

Utilisation du service Postmark avec votre propre domaine

Nous allons maintenant ajouter Postmark qui gère le SMTP

Commencez par créer un compte sur le service Postmark

Créez votre serveur Postmark jusqu’à confirmer votre adresse email.

action mailer Postmark créer un nouveau serveur

Copiez le Server API Tokens.

identifiants server API Postmark

Ajoutez la clé token chez Heroku.

$ heroku config:set POSTMARK_API_KEY="4847d3c1-*********************" 

Ajoutez la Gem Postmark.

# Gemfile
gem 'postmark-rails'

Installez la Gem postmark-rails.

$ bundle install 

Configurer Postmark pour la production

N’oubliez pas de changer “yourapp.herokuapp.com” avec le l’URL que vous avez chez Heroku

# config/environments/production.rb
# [...]
config.action_mailer.delivery_method = :postmark
config.action_mailer.postmark_settings = { api_key: ENV['POSTMARK_API_KEY'] }
config.action_mailer.default_url_options = { host: "yourapp.herokuapp.com" }
end

Ajoutez DKIM et SPF à votre domaine

Ces protocoles servent à ce que les mails envoyés aux destinataires n’arrivent pas dans le SPAM de leur Boîte au lettre

Validez les enregistrements DNS chez votre hébergeur

Poussez votre code sur Github.

$ git checkout -b send_transactional_email
$ git add . git commit -m "send transactional email"
$ git push origin send_transactional_email
$ hub pull-request -m "send transactional email"

Depuis votre compte Github, cliquez sur Merge pull request puis sur Confirm Merge.

pull-request chez Heroku

Récupérez la version de votre code de Github puis envoyez le tout sur Heroku.

$ git checkout master
$ git pull origin master
$ git push heroku master
$ heroku open

La commande heroku open ouvre une nouvelle fenêtre de votre App chez heroku

Créez un nouveau contact pour tester l’envoi de notre mail de bienvenue.

heroku app création nouveau contact

Le résultat

action mailer result
mail transactionnel fonctionne
signature Pierre-Christophe

Aucun commentaires

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.