Il est parfois intéressant de dialoguer avec un bot via l’envoi d’un email.
Par exemple vos commerciaux doivent rédiger un rapport mensuel dans un fichier Excel. Ils l’envoient en PJ au bot qui se charge d’accuser réception, l’archiver et lancer un traitement.
C’est le scénario que nous allons démontrer ici. Ce scénario est assez fréquent en entreprise, c’est par exemple ainsi que j’envoi des fichiers sur mon Kindle.
Notez également qu’Email est pour l’instant le seul canal qui accepte les conversations de groupe initiées par le bot.
Botbuilder supporte uniquement les mails Office 365. Si vous ignorez ce que c’est, voici une couche de rappel:
Activer le canal Email
Il faut aller dans le portail :
On clique sur Edit:
Renseignez le formulaire.
L’adresse email est celle du bot, c’est à dire l’adresse qu’il va surveiller et surtout sur laquelle il va répondre.
Note: ne mettez pas une adresse pro car à chaque fois qu’un client vous enverra quelque chose le bot va lui répondre!
Je dis ça comme ça bien entendu, je ne suis pas du genre à faire ce genre d’erreur…..
Cliquer ensuite sur le bouton bleu: ‘Submit Email Credentials »
Si tout se passe bien:
Premier essai
On va faire réagir le bot à la réception d’un email.
Faisons un bot très simple histoire de voir si ça marche vraiment:
public async Task StartAsync(IDialogContext context) { await context.PostAsync("Salut, je suis SuperBot à votre service!"); context.Wait(MessageReceivedAsync); } private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) { await context.PostAsync("Que puis-je faire pour vous?"); context.Wait(MessageReceivedAsync); }
J’envoi ensuite un mail depuis une boîte quelconque. Le message parvient à la boîte cible bien entendu et au bout de quelques instants le bot répond à l’expéditeur:
On a reçu deux messages. Un par appel à PostAsync().
Le principe est donc très simple.
Un scénario plus élaboré
On va envoyer un message avec une PJ. On va alors:
- Accuser réception
- Récupérer la PJ
- Lire le message de l’émail qui pourrait être analysé éventuellement par un des services cognitifs tels LUIS
Pour la récupération de la PJ, il faut avoir en tête que l’appli va tourner sur un serveur où vous n’avez pas accès. La sauvegarde locale n’est donc pas envisageable et pas non plus possible d’ailleurs faute d’avoir les permissions.
Voici un exemple de code:
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) { IMessageActivity message = await argument; foreach (Attachment item in message.Attachments) { if (item.ContentType.StartsWith("image/")) { // sauvegarde d'un fichier image try { byte[] array = (byte[])item.Content; // sauvegarde du fichier } catch (Exception ex) { await context.PostAsync(ex.Message); } await context.PostAsync(message.From.Name + ", j'ai bien reçu le fichier: " + item.Name); } } context.Wait(MessageReceivedAsync); }
Ce qui nous permet de recevoir le mail suivant:
Les PJ nous arrivent donc sous la forme d’un attachement. Là j’analyse le content type pour connaître la nature du fichier et faire ou pas une sauvegarde.
D’autres paramètres peuvent nous intéresser dans message:
- Text
Le corps du mail - From
Expéditeur de l’activité (le mail) - Recipent
Agent qui reçoit l’activité, le bot dans notre exemple - ServiceUrl
Url du canal - ChannelId
Nom du canal, ici ’email’
L’examen de la propriété ChannelData constitue toutefois une façon plus systématique de récupérer les informations qui nous intéressent. On y découvrent les 3 propriétés suivantes:
- htmlBody
Le corps du message - importance
L’importance du message: high, normal ou low - subject
Le sujet du message
On peut trouver un exemple dans la doc: