Comment envoyer des e-mails depuis R et Gmail

À un moment donné de votre vie R, vous voudrez probablement partager les résultats de votre analyse avec des collègues qui n'utilisent pas R. Il y a plusieurs manières de faire ça. L'un des moyens les plus simples (et les moins chers) est d'envoyer vos résultats par courrier électronique.

Mais c'est un peu triste d'automatiser l'ensemble de votre flux de travail d'analyse, uniquement pour créer et envoyer manuellement un e-mail à la fin. Heureusement, vous n'êtes pas obligé. Il existe plusieurs packages R qui vous permettent d'envoyer des e-mails directement à partir d'un script R. Dans cet article, je vais en faire une démonstration: gmailr par Jim Hester, qui est maintenant ingénieur logiciel chez RStudio.

De toute évidence, vous aurez besoin d'un compte Gmail, qui est gratuit si vous n'en avez pas. Ensuite, avant de pouvoir utiliser ce compte à partir de R, vous devrez le configurer pour l'accès à l'API. Voici comment.

Accédez à console.developers.google.com (oui, c'est un sous-sous-domaine). Si vous n'avez pas encore de projet de développeur, il vous sera demandé d'en créer un. 

En haut de votre tableau de bord, vous devriez voir une option "Activer les API et les services". Cliquez dessus.

Sharon Machlis,

Ensuite, vous voudrez rechercher l'API Gmail. Cliquez dessus, puis cliquez sur Activer. 

Le script R aura besoin d'informations d'identification, cliquez donc sur Créer des informations d'identification en haut à droite.

Sharon Machlis

Selon les instructions de Jim Hester, nous avons besoin d'un identifiant client, je choisirai donc l'identifiant client.

Sharon Machlis,

Maintenant, il demande un type d'application. Comme "R script" n'est pas ici, je souhaite choisir "Autre". Mais tous les boutons radio sont grisés. C'est parce que je n'ai pas configuré l'écran de consentement. C'est facile à manquer si vous vous concentrez sur les choix de boutons radio; c'est en haut à droite. Cliquez dessus.

Sharon Machlis,

Votre adresse e-mail doit déjà figurer dans le formulaire d'écran de consentement. La seule autre exigence est un nom pour l'application. Vous pouvez l'appeler comme vous le souhaitez.

Jim dit que le reste des valeurs par défaut est correct, alors faites défiler vers le bas et sauvegardez. Vous devriez maintenant pouvoir sélectionner le type d'application Autre, donner un nom à l'application et cliquer sur Créer.

La console devrait alors vous donner un ID client et un secret client. Vous pouvez les utiliser en les ajoutant à votre environnement R si vous le souhaitez. Mais Jim suggère de télécharger le fichier JSON à la place. Vous pouvez le télécharger dans le répertoire de travail de votre projet R et mémoriser le nom de fichier que vous lui donnez.

Sharon Machlis,

Cela termine la configuration du côté Google, et il est enfin temps pour un code R. 

Tout d'abord, assurez-vous que le package gmailr est installé. Il est disponible sur CRAN, vous pouvez donc l'installer avec install.packages("gmailr"). Chargez ensuite le package dans votre script avec library(gmailr).

Avant de faire quoi que ce soit, vous voudrez configurer votre session R de travail pour utiliser votre fichier d'informations d'identification JSON téléchargé. Vous pouvez le faire avec la use_secret_file()fonction et le nom de votre fichier JSON comme argument. Si j'appelais mon fichier d'informations d'identification JSON DoMoreWithR.json, la commande serait 

use_secret_file("DoMoreWithR.json")

En fait, envoyer un message est assez simple.

Pour certains exemples de données, j'ai téléchargé les taux de chômage mensuels aux États-Unis, puis j'ai créé une chaîne de texte appelée latest_msg avec des informations sur le dernier taux de chômage. Notez que dans le code ci-dessous, j'utilise le package glue pour assembler la chaîne de caractères que je veux pour mon message, mais c'est parce que j'aime le faire de cette façon; paste()ou paste0()fonctionnent aussi bien.

Vous pouvez utiliser toutes les données générées par R que vous souhaitez dans votre message électronique. Si vous souhaitez suivre le mien, voici le code (vous aurez besoin du package pacman installé):

pacman :: p_load (quantmod, glue, xts, dplyr, ggplot2)
getSymbols ("UNRATE", src = "FRED")

chômage <- coredata (UNRATE)

month_starting <- index (UNRATE)

series_length <- length (chômage)

latest_msg <- glue ("Le dernier taux de chômage aux États-Unis était de {chômage [series_length]}, au cours du mois commençant le {month_starting [series_length]}. Cela représente une différence de {chômage [series_length] - chômage [series_length - 1]} points de pourcentage par rapport au précédent mois.")

Ensuite, je veux créer un objet de courrier électronique MIME, puis ajouter une adresse à, une adresse d'expéditeur, un texte d'objet et le corps de mon message.

mon_email_message%

à ("[email protected]")%>%

de ("[email protected]")%>%

subject ("Mon message de test")%>%

text_body (latest_msg)

Si vous faites cela et vérifiez la structure de my_email_message avec str(my_text_message)vous verriez qu'il s'agit d'une liste avec une classe de mime.

Après avoir créé votre objet de message MIME, vous pouvez l'envoyer avec la send_message()fonction. L'argument est juste le nom de mon objet MIME, dans ce cas mon_email_message. La commande complète dans ce cas est donc

send_message (mon_email_message)

Lorsque vous exécutez send_message () la première fois, il vous sera probablement demandé si vous souhaitez mettre en cache l'autorisation entre les sessions R. Je vous suggère de dire oui. La première fois que vous exécutez ceci, votre navigateur vous demandera également d'autoriser votre script R à utiliser votre compte Google.

Vous pouvez faire plus avec gmailr. Une option consiste à créer un message HTML, vous pouvez donc utiliser un balisage tel que gras et italique.

Ici, le corps de mon message comprend des marques de paragraphe de type HTML et des caractères gras et italiques, et je l'enverrai à mon adresse professionnelle. 

html_msg_text <- glue ("

Le dernier taux de chômage américain était

{chômage [series_length]} , dans le mois commençant

{month_starting [series_length]}. C'est

{chômage [series_length] - chômage [series_length - 1]}

différence de points de pourcentage par rapport au mois précédent.

Données du Bureau of Labor Statistics des États-Unis.

")
mon_html_message%

à ("[email protected]")%>%

de ("[email protected]")%>%

subject ("Mon message de test")%>%

html_body (html_msg_text)

send_message (mon_html_message)

Malheureusement, je ne connais pas de moyen d'inclure facilement une image générée à partir de R directement dans le corps du message. Mais il est assez simple d'en inclure un comme pièce jointe. 

En haut du script ci-dessous, je transforme mes données de taux de chômage en un bloc de données avec des métriques de 2000 et plus tard, afin que je puisse utiliser ggplot pour le représenter graphiquement, puis enregistrer le graphique dans un fichier. 

This next part of the code is what’s important to know for email, though. First, like before, I’m creating a text string for my message text with the glue package. What’s new is the last two lines of code creating my MIME object. That last line, attach_file(), attaches my PNG file to the email. The line before is important if you want text to show up in the body of the email. Without using both text_body()andattach_part() for the body text, text won’t show up when you attach a file. Just something to remember.

Then I can use the same send_message() function to send it.

un_df %

filter(month_starting >= as.Date("2000-01-01")) %>%

rename(unemployment = UNRATE)

mygraph <- ggplot(un_df, aes(month_starting, unemployment)) +

geom_line() +

ggtitle("US Monthly Unemployment") +

xlab("Month Starting") +

ylab ("")

ggsave("unemployment_graph.png")
msg_text <- glue("The latest US unemployment rate was {unemployment[series_length]}, in the month starting {month_starting[series_length]}. That's {unemployment[series_length] - unemployment[series_length - 1]} percentage points difference from the prior month. A graph of the data since January 2000 is attached.")

message2 %

to("[email protected]") %>%

from("[email protected]") %>%

subject("My text message with attached graph") %>%

text_body(msg_text) %>%

attach_part(msg_text) %>%

attach_file("unemployment_graph.png")

send_message(message2)

Si vous le souhaitez, vous pouvez utiliser la fonction create_draft() pour créer un brouillon de message dans votre compte Gmail, si vous souhaitez vérifier à quoi il ressemble avant de l'envoyer. Dans ce cas, create_draft(message2)créerait un brouillon de mon message de pièce jointe.

Si vous souhaitez voir à quoi tout cela ressemble en action, regardez la vidéo en haut de cet article. Et pour plus de conseils R, rendez-vous sur la page vidéo Do More With R ou consultez la playlist YouTube Do More With R.