TLS est un protocole de chiffrement des données qui remplace SSL.

Par mesure de sécurité c'est ce que j'utilise quand je mets en place un serveur SMTP, cela permet de crypter les données lors de la transmission du couple login / pass au serveur.

Mais quel rapport avec le module ActionMailer vas tu me dire ?

Aucun, justement. ActionMailer ne gère pas TLS en natif. Comme je n'ai pas envie de me logguer en clair sur mon SMTP, j'ai cherché une solution plus clean. Et c'est Kyle Maxwell qui l'offre, via un plug-in.

Comment mettre en place ce plug-in ?

Commence par récupérer le source directement du trunk :

$ svn co http://svn.kylemaxwell.com/rails_plugins/action_mailer_optional_tls/trunk

Une fois réalisé tu copies les lib (action_mailer_tls.rb et smtp_tls.rb) dans le répertoire lib de ton application rails, et le plus dur est fait.

Il nous reste à inclure ces lib au démarrage de l'application, dans le environnement.rb :

require "#{File.dirname(__FILE__)}/../lib/action_mailer_tls"
require "#{File.dirname(__FILE__)}/../lib/smtp_tls"

Note : Il faut éviter les chemins absolus qui rendent une application difficile à migrer.

Au niveau de la configuration de la connexion au SMTP, ça donne ça (en mode développement, donc dans le development.rb) :

config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_charset = "utf-8"
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
        :address => "smtp.domain.tld",
        :port => 25,
        :user_name =>'login',
        :password =>'pass',
        :authentication => :login,
        :domain => "domain.tld",
        :tls => true
}
config.action_mailer.perform_deliveries = true

Attention, en prod on n'utiliserait pas le même genre de configuration puisque l'on ne voudrait pas que l'appli se gauffre lamentablement devant le client en cas d'échec d'envoi du mail.
On mettrait donc le raise_delivery_errors à false.

De même en dev on n'a pas forcément envie d'envoyer les mails pour de vrai une fois que l'on sait que ça marche.

config.action_mailer.perform_deliveries = false

Dans ce cas on peut stocker les mails dans des variables et les soumettre à des test unitaires.

config.action_mailer.delivery_method = :test

Pour le reste rien ne change, on peut utiliser ActionMailer comme d'habitude, ce qui n'est pas l'objet de ce billet :-)

Note : Pense à rajouter les parenthèses autour du start_method à la ligne 24 du smtp_tls.rb pour éviter les warning au démarrage du serveur ( warning: parenthesize argument(s) for future version), et avoir un code plus conforme.