Comment envoyer un mail en Ruby ?

Comment envoyer un mail en Ruby ?

Il existe de nombreuses solutions pour envoyer un email avec le langage Ruby en utilisant le protocole SMTP. Nous allons voir ici les plus courantes que sont l’utilisation de la librairie native Net::SMTP et les 3 gems les plus utilisées que sont Mail, Pony et ActionMailer.

Envoyer un mail avec Net::SMTP

La librairie native Net::SMTP permet d’envoyer facilement et sans ajouter de dépendances un email. C’est le moyen le plus simple et simpliste d’envoyer un email en Ruby. Il suffit de définir le contenu de l’email, d’ouvrir une connexion avec le serveur SMTP en fournissant tous les identifiants de connexion et d’envoyer le message.

require 'net/smtp'
require 'date' # pour utiliser DateTime.now

message = <<FIN_DU_MESSAGE
From: Mon application <contact@monapplication.com>
To: Mon destinataire <contact@mondestinataire.com>
Content-type: text/html
Subject: Test email via Net::SMTP
Date: #{DateTime.now}

<html>
  <body>
    <h1>Bonjour mon destinataire,</h1>
    <p>Ceci est un email envoyé via Net::SMTP</p>
  </body>
</html>
FIN_DU_MESSAGE

Net::SMTP.start('mon.server.smtp', 25) do |smtp|
  smtp.send_message message, 'contact@monapplication.com', 'contact@mondestinataire.com'
end

Dans un cas réel vous aurez besoin de plus d’informations pour la connexion au serveur SMTP que l’exemple ci-dessus, tel que :

Net::SMTP.start('mon.server.smtp',
                port,
                'helo.server',
                'user',
                'password',
                :authentification
              ) do |smtp|
  smtp.send_message message, 'contact@monapplication.com', 'contact@mondestinataire.com'
end

Où les arguments passés sont :

  • l’adresse du serveur SMTP
  • le port (souvent 25, 465, 587 ou 2525)
  • le serveur HELO
  • l’identifiant de l’utilisateur si le serveur demande à s’authentifier
  • le mot de passe associé à l’identifiant
  • le mode d’authentification à choisir entre plain, login ou cram_md5

Bien que suffisant pour des emails texte, Net::SMTP est assez limité; C’est pour cette raison qu’on privilégie souvent l’utilisation d’une gem.

Envoyer un email avec la gem Mail

La gem Mail utilise Net::SMTP en ajoutant une couche de sucre syntaxique qui permet d’avoir une approche plus dans l’esprit Ruby. Les informations de l’email à envoyer sont les mêmes mais dans une approche plus élégante et moins proche du protocole SMTP.

require 'mail'

Mail.defaults do
  delivery_method :smtp, {
    :address => 'mon.server.smtp',
    :port => port,
    :user_name => 'user',
    :password => 'password',
    :authentication => :cram_md5,
    :enable_starttls_auto => true
  }
end

body = <<FIN_DU_MESSAGE
<html>
  <body>
    <h1>Bonjour mon destinataire,</h1>
    <p>Ceci est un email envoyé via la gem Mail</p>
  </body>
</html>
FIN_DU_MESSAGE

mail = Mail.new do
  from     'contact@monapplication.com'
  to       'contact@mondestinataire.com'
  subject  'Test email via gem Mail'
  body     body
end

mail.deliver!

Pour la connexion au serveur SMTP, c’est bien entendu les mêmes données à renseigner que pour les autres moyens d’envoyer un email.

Envoyer un mail avec la gem Pony

La gem Pony quant à elle est basée sur la gem Mail pour s’approcher d’une syntaxe type php et sa fameuse fonction mail() qui en une ligne de code permet d’envoyer un email.

Dans les faits, si notre email est un peu complet et pour faciliter la compréhension des développeurs qui passeront derrière nous, il est quand même judicieux d’aérer le code et de le passer sur plusieurs lignes.

require 'pony'

body = <<FIN_DU_MESSAGE
<html>
  <body>
    <h1>Bonjour mon destinataire,</h1>
    <p>Ceci est un email envoyé via la gem Pony</p>
  </body>
</html>
FIN_DU_MESSAGE

Pony.mail({
  to:       'contact@mondestinataire.com',
  from:     'contact@monapplication.com',
  subject:  'Test email via gem Pony',
  html_body: body,
  via:       :smtp,
  via_options: {
    address:              'mon.server.smtp',
    port:                 2525,
    enable_starttls_auto: true,
    user_name:            'user',
    password:             'password',
    authentication:       :cram_md5
  }
})

Envoyer un mail avec la gem ActionMailer

La gem Action Mailer est la gem intégrée à Ruby on Rails qui intègre la notion de mailer (une classe Ruby qui a la responsabilité d’envoyer un email) mais on peut tout à fait s’en servir en dehors de Ruby on Rails, on commence par définir nos paramètres SMTP puis on prépare et on envoie le mail.

require 'action_mailer'

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address: 'mon.server.smtp',
  port: 2525,
  authentication: :cram_md5,
  user_name: 'user',
  password: 'password',
  enable_starttls_auto: true
}

body = <<FIN_DU_MESSAGE
<html>
  <body>
    <h1>Bonjour mon destinataire,</h1>
    <p>Ceci est un email envoyé via la gem Action Mailer</p>
  </body>
</html>
FIN_DU_MESSAGE

# Send email
ActionMailer::Base.new.mail(
  from: 'contact@monapplication.com',
  to: 'contact@mondestinataire.com',
  subject: 'Test email via gem Action Mailer',
  body: body
).deliver

Utiliser Pacomail pour tester ses emails

On a donc fait le tour des principaux moyens d’envoyer un email en Ruby en utilisant le protocole SMTP. Si vous aussi vous voulez tester d’envoyer des emails en Ruby, je vous encourage à utiliser Pacomail afin de vous assurez de ne pas envoyer de vrais emails. La planète vous remerciera et nous aussi !