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 !