🍪📮 Action Mailbox, le composant méconnu de Rails
Automatiser le traitement d'e-mails en quelques lignes de code, c'est ce que propose Action Mailbox, un composant de Rails.
Malgré sa simplicité d'utilisation et les possibilités d'automatisations de tâches chronophage qu'il offre, cet outil reste encore méconnu des développeurs Rails.
C'est en tout cas mon opinion, puisque chez Capsens nous étions peu à le connaître avant qu'Héléna nous le présente, c'est pourquoi j'ai trouvé intéressant qu'elle vous en parle à vous aussi 😉
Au programme :
Action Mailbox
Implémenter sa boite aux lettres
Les tests
Rails World
Le job de tes rêves
Le défi
Hello les petits Biscuits !
Bienvenus sur la 9ème édition de Ruby Biscuit.
Vous êtes maintenant 164 abonnés 🥳 Et si vous n’êtes pas déjà inscrit :
Pour cette édition je laisse la parole à Héléna, développeuse chez Capsens depuis un peu moins d'un an, qui a découvert récemment Action MailBox.
Elle s'est proposée pour vous parler de l’utilisation qu'elle fait de ce module de Rails encore peu utilisé, avec une implémentation étape par étape et les tests qui y sont associés, comme on aime le faire sur Ruby Biscuit !
Je vous laisse donc entre de bonnes mains et je vous retrouve à la fin de son article pour parler évènement Rails, jobs et défi du jour !
Spoiler : en lisant toute la newsletter tu pourras gagner ta place pour le Rails World 😉
Action Mailbox
Introduit sous Rails 6, Action Mailbox permet de créer des sortes de boîtes aux lettres directement dans votre application Rails puis de capturer, manipuler et stocker les e-mails entrants grâce à des controllers.
Très simple à implémenter, ce composant peut s'avérer utile pour tout un tas d'utilisation, voici la mienne :
Un comptable recevait chaque jour une très grande quantité d'e-mails de ses clients qui lui adressaient l'ensemble de leurs documents justificatifs, tickets de caisse, notes de frais, factures, ou encore des relevés bancaires. Tous ces documents avaient besoin d'être stockés sur une plateforme comptable pour être ensuite traités par une API qui transformait les lignes de dépenses en écritures comptables dans le but de faciliter les clôtures d'exercices.
Historiquement ces justificatifs étaient envoyés par mail directement au comptable qui lui-même les chargeait sur sa plateforme.
Vous l'avez compris, il s'agissait d'une tâche chronophage, répétitive et fastidieuse. C'est ici qu'Action Mailbox entre en jeu. La solution a donc été de se brancher à la boîte mail pour traiter directement les e-mails et leurs pièces jointes.
Voici comment nous avons implémenté notre fonctionnalité :
Implémenter sa boite aux lettres
Pour l’exemple je pars d’une application Rails avec Devise et Active Storage
Nous allons naturellement commencer par installer Action Mailbox à notre application.
Comme pour la plupart des composants Rails, une commande nous est fournie pour l'installer :
Cette commande génère les fichiers suivants :
Le fichier
application_mailbox.rb
qui hérite deActionMailbox::Base
, c'est ici que nous configurerons nos boîtes aux lettres.
Un fichier de migration pour créer une table
action_mailbox_inbound_emails
:
Bien sûr n'oubliez pas d'exécuter vos migrations !
Dans application_mailbox.rb
nous allons maintenant définir à quelle adresse e-mail nos utilisateurs vont pouvoir s'adresser et configurer un controller qui sera en charge du traitement des courriers entrant.
Cette ligne de code permet de dire à ActionMailbox que les e-mails envoyés à ruby@biscuit.fr seront traités par le processeur InboundAttachmentsMailbox
.
À savoir, il est aussi possible d'utiliser une regex à la place d'un e-mail, pour par exemple dire que tout ce qui est envoyé à une adresse de la forme "*@replies.*" soit traité par un controller en particulier. Par exemple :
Maintenant que nous avons décidé que nos e-mails seront traités dans InboundAttachmentsMailbox
, il nous faut créer le fichier.
Notre Mailbox héritera de ApplicationMailbox et contiendra une méthode nommée process
, qui sera la seule méthode publique.
Grâce à ActionMailbox::Base
dont hérite ApplicationMailbox
, nous avons accès à une méthode mail
. C'est une instance de la classe Mail:Message qui va nous donner accès à tout un tas de méthodes pour manipuler l'e-mail reçu.
Grâce à ces méthodes nous allons pouvoir facilement accéder aux metadatas et au contenu de notre e-mail, notamment :
mail.body
pour le corps de l'e-mailmail.attachments
pour les pièces jointesmail.from
pour l'expéditeur.
Pour plus d'informations sur cet objet mail, vous pouvez vous référer à sa documentation.
Maintenant que mes éléments de base sont configurés et que nous comprenons comment manipuler nos e-mails entrants, revenons à notre besoin initial et passons à la personnalisation.
Nous avions besoin pour notre client, d'un système qui serait en mesure de recevoir les e-mails arrivant à l'adresse ruby@biscuit.fr, de les lier à un utilisateur existant sur la plateforme puis de lui associer ses pièces jointes.
Pour faire correspondre l'expéditeur à un utilisateur de notre plateforme nous allons commencer par implémenter une première méthode qui sera privée et s'appellera find_user_or_bounce
. Elle sera appelée préalablement au traitement de chaque e-mail reçu grâce au callback before_processing
que ActionMailbox
nous offre.
Dans les cas où l'e-mail de l'expéditeur ne correspond à aucun de nos utilisateurs sur la plateforme, nous lui renvoyons un e-mail d'erreur pour le prévenir, à l'aide de la méthode bounce_with
.
Une fois que je me suis assurée qu'il s'agissait bien d'un de mes utilisateurs, je vais pouvoir lui associer et enregistrer ses pièces jointes.
J'utilise .decoded
pour accéder à mes pièces jointes, elles sont initialement encodées en Base64, tout comme le body
de mon e-mail.
Notez qu'il est important de mettre des validations sur la taille, le content type et l'extension des documents pour ne pas laisser n'importe quel fichier être enregistré en base de données. Pour les validations vous pouvez utiliser la gem active_storage_validations.
Comme on dit : "Never trust user input"
Aussi pour aller plus loin on pourrait imaginer qu'un e-mail soit envoyé à l'utilisateur si son document ne respecte pas les validations afin de lui fournir explicitement les raisons de l'échec et qu'il puisse rectifier son envoi en autonomie avec de nouveaux documents.
Les tests
Pour tester notre boîte aux lettres en local, pas besoin de services externes, Rails nous facilite la vie ! Il met à notre disposition un formulaire auquel nous pouvons accéder en local à la route suivante :
http://localhost:3000/rails/conductor/action_mailbox/inbound_emails/new
(On repassera pour le design 🙄)
Cette route a été créée au moment où nous avons installé Action MailBox sur notre application Rails, d'autres sont disponibles, je vous laisserai les découvrir en faisant rails routes -g mailbox
dans votre console.
Hop hop hop, ce n'est pas une raison pour ne pas écrire de tests unitaires 😉
Sachez qu'en dehors de votre environnement local, staging, production ou autre, il vous faudra un peu plus de configuration !
Pour faire fonctionner Action Mailbox vous avez besoin qu'un service SMTP externe reçoive les courriers électroniques et les transmettent ensuite à votre boite aux lettres. Pour cela, une liste de services externes, appelés "Ingresses" sont disponibles. Je vous conseille de vous référer directement à la documentation officielle pour en savoir davantage.
Rails World
Au cas où vous ayez loupé l'info, Rails Foundation organise la première conférence officielle de Rails !
Il y a quelques mois on nous annonçait la création de Rails Fondation. Un nouvel organisme qui a pour mission de faire prospérer l'écosystème qui est le nôtre, celui des développeurs Ruby on Rails. Le 6 avril dernier a été publié une lettre annonçant le premier évènement organisé par la Rails Fondation, qui s'appellera Rails Worlds et qui aura lieu les 5 et 6 octobre 2023 à Amsterdam !
Rails World est une conférence de deux jours qui propose des talks techniques, des démos, des workshops, du réseautage et des discours d'ouverture. Les créateurs et les responsables de Rails vous parleront des dernières fonctionnalités et des meilleures pratiques en matière de développement Rails.
Cerise sur le gâteau, nous tirerons au sort une personne parmi ceux d’entre vous qui proposeront une réponse au défi Ruby Biscuit dans les 24h et nous lui offrirons une place pour l’événement !!
Alors rendez-vous un peu plus bas pour découvrir les consignes du défi.
Le job de tes rêves !
Comme vous le savez, derrière Ruby Biscuit, il y a Capsens 👋 , nous sommes une agence web spécialisée dans le Ruby on Rails depuis 10 ans.
Avec le temps on s'est rendu compte que beaucoup de dévs choisissent leur entreprise un peu par hasard alors qu'ils pourraient mieux s'épanouir et se valoriser dans des structures qui leur correspondent bien.
Ce qui tombe super bien c'est que chez Capsens nous avons une excellente connaissance de l'écosystème Ruby on Rails en France, avec un réseau d'entreprises considérable.
C'est pourquoi on vous annonce à travers cette newsletter que nous mettons à profit notre connaissance du métier pour vous aider à trouver le poste de vos rêves !
Concrètement :
Tu souhaites trouver le job de tes rêves ? Alors réponds à cet email ! Tu peux dire "Coucou", ça suffit !
On te proposera aussitôt des créneaux pour une visio afin de faire connaissance
Puis nous te proposerons 3 entreprises qui correspondent à qui tu es. Et pour chacun de ces postes :
Tu pourras discuter avec un développeur de l'équipe (pas le recruteur lui-même) afin de savoir comment ça se passe de l'intérieur. No bullshit
Un développeur de Capsens t'aidera à :
Analyser le poste : ce qui a l'air bien, les dangers, quelles conditions poser pour que tout se passe bien
Te préparer pour que tu décroches le bon poste
Tu veux aller vers une vie professionnelle plus épanouie ? 😀 Eh bien, on attend ton
e-mail ! Et si tu aimes déjà ton travail, ne nous contacte surtout pas ! Ou alors fais-le pour nous recommander ta boite 😉
Le défi
Je suis super contente de voir que vous êtes plusieurs à avoir participé au défi que je vous ai proposé dans la dernière newsletter !
J'ai repris conscience il y a peu de temps à quel point les kata étaient formateurs. Pourtant je prends rarement le temps d'en faire.
Ok je l'avoue, je n'en fais jamais mais je suis sûre de ne pas être la seule !
Alors c'est décidé, vous aurez un nouveau défi par newsletter, ça ne vous demandera pas trop d'énergie et vous êtes libre de jouer le jeu !
Pour le défi de la dernière newsletter félicitations à Raphaël pour sa réponse
On a beaucoup aimé le i % (3 * 5) == 0
en une seule comparaison, et écrire 3 * 5
au lieu de 15
car ça exprime bien l’intention. C’est un concept qu’on peut retrouver si on travaille sur des durées par exemple. 86400
, il n’est pas évident de savoir à quoi ça correspond, alors que 60 * 60 * 24
on devine beaucoup plus facilement que c’est le nombre de secondes dans une journée.
Et c'est aussi la première fois que je vois case
utilisé sans paramètre !
Voici une autre proposition de chez nous proposée par Antoine. Elle a le mérite d'être originale :
Je vous laisse méditer la dessus 🥲
Et voici les règles du prochain défi :
Écris “Ruby Biscuit” sans utiliser de Literals : pas de strings, de nombres, symboles, regex etc.
Point bonus pour la personne qui le fait avec le minimum de caractères.
Tout comme la dernière fois, envoyez-moi vos réponses en répondant à cette newsletter et je publierai la meilleure dans la prochaine édition !
Pour découvrir des nouveaux tips Ruby on Rails, ne cherche plus, tu es au bon endroit.
Héléna & Mélanie 😉