Améliorer l’expérience utilisateur… Avec de bons vieux e-mails

Chez Nereo, nous envoyons beaucoup d’e-mails automatiques à nos utilisateurs : chaque demande de congés donne lieu à un message pour le manager le prévenant qu’il a une nouvelle demande d’un de ses collaborateurs à passer en revue. S’il y a deux niveaux de validation, le supérieur hiérarchique recevra lui aussi un e-mail. Et lorsque la décision est prise, le demandeur reçoit à son tour un message le notifiant de la décision prise. Tous ces e-mails sont également démultipliés si l’une ou l’autre des parties ajoutent des commentaires à la demande.

Le contenu du message reprend les grandes lignes de la demande de congés (dates, type de congés…) mais, jusqu’à il y a peu, il fallait nécessairement cliquer sur le lien proposé afin d’aller sur Nereo et réaliser une action (accepter, refuser ou commenter).

Conscients de l’impact (nécessaire) de cette charge supplémentaire sur ces boîtes mails déjà saturées, nous nous sommes posés une question simple : comment rendre ces e-mails plus utiles et leur donner une véritable valeur ajoutée ?

La réponse est finalement simple : mettre l’e-mail au centre du processus et pas seulement le borner à un rôle de notifications. Car si une boîte mail sait recevoir des messages, elle sait aussi en envoyer. L’idée est donc de donner la possibilité à nos utilisateurs de prendre une décision simplement en répondant à l’e-mail reçu, comme ils le feraient pour répondre à un collègue ou un client.

Un serveur qui lit des e-mails

Généralement, quand on envoie un e-mail, le destinataire est un autre être humain qui va lire (et en principe comprendre) ce que vous avez écrit. Comme vous le voyez ici, c’est bel et bien une machine qui va recevoir cet e-mail et devoir comprendre son contenu.

Trois principaux challenges techniques sont à résoudre :

  1. Faire parvenir le contenu du message au serveur ;
  2. Identifier l’utilisateur de manière sécurisée ;
  3. Traiter le contenu du message.

1. Recevoir des e-mails, façon 2017

Les serveurs savent déjà recevoir des e-mails. En fait, c’est même grâce à eux que les e-mails existent : quand vous envoyez un e-mail, le serveur e-mail de votre fournisseur (par exemple Gmail) va entrer en communication avec le serveur e-mail du fournisseur de votre destinataire (par exemple Free). Les machines vont alors s’échanger les données représentant votre message. C’est le protocole SMTP.

« OK, donc c’est facile alors ? Il suffit de configurer un serveur SMTP sur Nereo ? »

Hum, oui, on aurait pu. Mais en fait, non, c’est trop compliqué. L’envoi et la réception des e-mails est devenue tellement critique (notamment à cause du spam) que c’est devenu un métier à part entière et qu’il est plutôt déconseillé d’improviser un serveur d’e-mail. De nombreuses sociétés sérieuses sont sur ce créneau, à l’instar de Mailchimp/Mandrill, et proposent de gérer l’envoi de vos e-mails automatiques pour des sommes très modiques. Chez Nereo, nous faisons confiance au français (🇫🇷🐓) Mailjet.

Ce type de services est surtout pensé pour envoyer. Mais Mailjet propose aussi l’inverse : recevoir des e-mails à votre place et vous renvoyer les données bien propres à votre application. Car oui, il faut bien voir qu’un e-mail brut, ça ressemble à ça :

Message-Id: <[email protected]iljet.com>
MIME-Version: 1.0
From: =?iso-8859-1?q?Fran=E7ois?= Voron <[email protected]>
Reply-To: [email protected]
To: [email protected]
Subject: Leave request from 06/05/2017 to 06/07/2017
Date: Tue, 30 May 2017 09:39:56 +0000
X-CSA-Complaints: [email protected]
X-MJ-GUID: 647b47e0-4b2a-4269-b4e7-2d6327132c11
X-MJ-Mid: AEEALJLMDvAAAAAAAAAAAGwlMZgAARpdZB8AAAAAAAed_ABZLT3sZHtH4EsqQmm05y1jJxMsEQAHQU0
Content-Type: multipart/alternative; boundary="=-WHbP6PSo9wmwf1AijZsB"
X-Original-Sender: [email protected]
X-Original-Authentication-Results: mx.google.com;       dkim=pass
 [email protected];       spf=pass (google.com: domain of
 [email protected]c3.mailjet.com
 designates 87.253.233.110 as permitted sender) smtp.mailfro[email protected]bnc3.mailjet.com

--=-WHbP6PSo9wmwf1AijZsB
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Le contenu du message est ici !

Mailjet, lui, va nous renvoyer quelque chose comme ça :

{
    "Sender":"[email protected]",
    "Recipient":"[email protected]",
    "Date":"20150410T160638",
    "From":"Pilot <[email protected]>",
    "Subject":"Hey! It's Friday!",
    "Text-part":"Le contenu du message est ici !",
}

Ça ne parle peut-être pas aux non-initiés, mais ce format en JSON est infiniment plus exploitable que le pâté de texte qu’il y a plus haut.

1.1 Parlons technique

Cette partie de l’article va rentrer davantage dans les détails techniques. Si ce n’est pas votre tasse de thé, vous pouvez passer directement au chapitre suivant.

Curieusement, Mailjet ne met pas du tout en avant cette fonctionnalité sur son site, ni même ne propose de la gérer depuis l’interface. Seul un chapitre de leur documentation technique nous explique comment faire, et il faut obligatoirement passer par l’API pour configurer notre webhook.

Qu’à cela ne tienne, un simple POST sur l’endpoint /parseroute va nous configurer une adresse e-mail prête à recevoir des emails. J’ai l’habitude d’utiliser HTTPie (plus haut niveau que cURL) pour faire des appels API sans prise de tête depuis la ligne de commande :

http -a $MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE POST https://api.mailjet.com/v3/REST/parseroute Url=https://monappli.com/mailjet-webhook/

Mailjet va alors nous filer une adresse e-mail du type [email protected] . C’est à cette adresse qu’on enverra les e-mails. Il est possible de configurer une adresse e-mail personnalisée, soit avec un simple transfert, soit en configurant carrément les enregistrements DNS MX vers ceux de Mailjet. J’ai opté pour cette solution avec Nereo, mais en utilisant un sous-domaine emails.nereo.com  car notre domaine racine a évidemment déjà des enregistrements MX pour traiter nos e-mails « standards ».

2. Identifier l’utilisateur de manière sécurisée

Très bien ! Notre serveur est désormais en mesure de recevoir des e-mails envoyés par nos utilisateurs. Problème : comment savoir à quel utilisateur et quelle demande de congés cet utilisateur correspond ? Sur une application, c’est facile, il faut entrer son identifiant et son mot de passe avant d’y accéder. Mais dans le cas présent, tout le monde peut potentiellement envoyer un e-mail à notre adresse.

« On peut peut-être se fier à l’adresse e-mail de l’expéditeur ? »

Malheureusement, non. Le protocole SMTP est fait de telle manière qu’il est possible d’utiliser n’importe quelle adresse d’expéditeur, même une ne vous appartenant pas. Il existe heureusement des mécanismes vérifiant qu’un expéditeur est bien celui qu’il prétend être ; mais ça ne me paraissait pas approprié pour notre cas.

Là encore, Mailjet va nous venir en aide. Il est en effet possible au moment de l’envoi d’e-mail automatique de notifications (celui qui prévient le manager que le salarié a fait une demande) d’ajouter des données annexes, la payload,  qui n’apparaitront nul part dans l’e-mail mais que Mailjet va garder dans un coin de sa tête (enfin, de son disque dur). Lors de cet envoi, Nereo connaît parfaitement le destinataire et la demande d’absence qu’on est en train de traiter : on va donc les ajouter dans la payload.

La magie se produit au moment où le manager répond à l’e-mail : à partir de l’identifiant de l’e-mail automatique, Mailjet va l’associer à cette réponse et ajouter la payload dans les données qu’il renvoie à notre serveur ! On peut donc parfaitement associer une réponse avec un utilisateur et une demande d’absence.

2.1 Est-ce vraiment sécurisé ?

Cette partie de l’article va rentrer davantage dans les détails techniques. Si ce n’est pas votre tasse de thé, vous pouvez passer directement au chapitre suivant.

En principe, oui, car la payload n’apparaît pas du tout dans les données de l’e-mail et qu’il n’est possible d’en ajouter que depuis l’API de Mailjet (qui par définition ne peut être utilisée que par Nereo).

Néanmoins, pour être vraiment safe, la payload est signée selon le processus cryptographique de Django ; le même qui est utilisé pour crypter le cookie de maintien de session.

3. Où on apprend à lire à une machine

Nous savons maintenant qui veut nous parler et à propos de quelle demande de congés. Il est temps maintenant d’analyser le contenu du message.

Alors, malgré le titre un peu racoleur, non, nous n’avons pas développé d’algorithme capable de comprendre l’intention de l’utilisateur dans un texte qu’il aurait écrit librement. C’est techniquement possible, les recherches récentes ont des résultats bluffants, mais ce n’est pas encore parfaitement fiable (coucou Siri !) ; et ce n’était surtout pas nécessaire pour la fonctionnalité que nous voulions.

Dans notre cas, on demande à l’utilisateur d’écrire « Je valide » s’il souhaite accepter la demande de congés ou « Je refuse » pour la refuser. Tout autre texte est ajouté en commentaire.

Toutefois, il y a quand même quelques problèmes à prendre en compte : la plupart des professionnels utilisent une signature à la fin de leur e-mail rappelant leur nom, leurs coordonnées ainsi que celles de leur entreprise. Il y a également tout le texte du message original (puisque c’est une réponse) surmonté d’une ligne du type « Le 2 juin 2017, Nereo a écrit :  » .

Ces informations ne nous sont pas utiles et il faut donc les ignorer. Cependant, comme il n’y a pas de format standard à la fois pour les signatures et l’entête du message précédent, ce n’est pas forcément facile de les détecter.

Heureusement, la communauté du logiciel libre est là pour nous aider. Mailgun, un concurrent de Mailjet (ironiquement), a laissé à l’usage libre de tous les développeurs de la planète son programme pour extraire le texte pertinent dans les e-mails. L’entreprise l’a développé pour proposer un système de réception d’e-mails similaire à Mailjet, avec un traitement beaucoup plus poussé. L’expertise de Mailgun et la maturité du programme leur permet de prendre en compte un nombre incroyable de cas différents. Une précision qu’il aurait été difficile d’atteindre si nous avions développé notre propre algorithme. En informatique, c’est le fameux principe de ne jamais réinventer la roue.

Ce programme nous permet donc de passer de ça :

Je valide

--
François Voron
CTO


Nereo
59 rue Marengo
42000 Saint-Étienne

--
De : Rémi Cournil <[email protected]>
Date : 30 mai 2017 à 13:37 +0200
À : [email protected]
Sujet : Demande d'absence du 9 juin 2017 au 12 juin 2017

Nereo
Demande d'absence de Rémi Cournil du 9 juin 2017 au 12 juin 2017

Rémi Cournil souhaite poser une absence du 9 juin 2017 matin inclus au 12 juin 2017 après-midi inclus.

Commentaires

Pas de commentaire
-


Voir la demande sur Nereo
ou répondez directement à cet e-mail !

Écrivez "Je valide" pour valider

Écrivez "Je refuse" pour refuser

ou écrivez n'importe quel autre message pour commenter

En savoir plus

 
Logiciel de gestion de congés

À ça :

Je valide

Beaucoup mieux ! On peut donc vérifier si le message correspond soit à « Je valide » , soit à « Je refuse » . Pour être tout à fait complet, nous transformons le texte de façon à ce que les majuscules, les espaces et tout ce qui n’est pas des lettres soient ignorés. On peut donc écrire indifféremment : « je valide » , « JE VALIDE » ou même « Je             VaLiDE! » .

Il suffit ensuite d’appliquer l’opération correspondante, exactement comme si l’utilisateur avait cliqué sur le bouton sur Nereo.

Quand l’interface s’efface

Nos utilisateurs peuvent désormais traiter des demandes de congés sans quitter leur boite mail. Cette fonctionnalité s’inscrit totalement dans la tendance des chatbots : on ne veut plus avoir à jongler avec chaque application pour bénéficier de son service mais au contraire disposer d’un seul point d’entrée pour tous nos outils : Slack, Facebook Messenger ou les assistants personnels comme Siri. En leur dictant des commandes simples, ils sont capables d’exécuter des actions qui auraient nécessité de nombreux clics et plusieurs temps de chargement si elles avaient du être exécutées manuellement.

L’originalité de notre approche réside dans le fait que la star ici n’est pas un chatbot hype 🤖, mais bel et bien ces bons vieux e-mails qui, loin d’avoir dit leur dernier mot, sont encore capables de nous rendre bien des services.