Cómo enviar correo electrónico desde R y Gmail

En algún momento de su vida R, es probable que desee compartir los resultados de su análisis con colegas que no utilizan R. Hay muchas formas de hacer esto. Uno de los más fáciles (y menos costosos) es enviar sus resultados por correo electrónico.

Pero es un poco triste automatizar todo el flujo de trabajo de análisis, solo para crear manualmente y enviar un correo electrónico al final. Afortunadamente, no es necesario. Hay varios paquetes R que le permiten enviar correos electrónicos directamente desde un script R. En este artículo, haré una demostración de uno de ellos: gmailr de Jim Hester, que ahora es ingeniero de software en RStudio.

Obviamente, necesitará una cuenta de Gmail, que se puede configurar gratis si no tiene una. Luego, antes de que pueda usar esa cuenta de R, deberá configurarla para el acceso a la API. Así es cómo.

Vaya a console.developers.google.com (sí, es un subdominio). Si aún no tiene un proyecto de desarrollador, se le pedirá que cree uno. 

En la parte superior de su panel, debería ver la opción "Habilitar API y servicios". Haga clic en eso.

Sharon Machlis,

A continuación, querrá buscar la API de Gmail. Haga clic en eso y luego haga clic en Habilitar. 

La secuencia de comandos R necesitará credenciales, así que haga clic en Crear credenciales en la parte superior derecha.

Sharon Machlis

De acuerdo con las instrucciones de Jim Hester, necesitamos una identificación de cliente, así que elegiré la identificación de cliente.

Sharon Machlis,

Ahora pide un tipo de aplicación. Dado que "script R" no está aquí, quiero elegir "Otro". Pero todos los botones de opción están atenuados. Eso es porque no he configurado la pantalla de consentimiento. Eso es fácil de pasar por alto si se concentra en las opciones de los botones de radio; está en la parte superior derecha. Haga clic en eso.

Sharon Machlis,

Su dirección de correo electrónico ya debería estar en el formulario de pantalla de consentimiento. El único otro requisito es un nombre para la aplicación. Puedes llamarlo como quieras.

Jim dice que el resto de los valores predeterminados están bien, así que desplácese hacia abajo y guarde. Ahora debería poder seleccionar el tipo de aplicación Otro, dar un nombre a la aplicación y hacer clic en Crear.

La consola debería proporcionarle un ID de cliente y un secreto de cliente. Puede usarlos agregándolos a su entorno R si lo desea. Pero Jim sugiere descargar el archivo JSON en su lugar. Puede descargarlo en el directorio de trabajo de su proyecto R y recordar el nombre de archivo que le dio.

Sharon Machlis,

Eso finaliza la configuración en el lado de Google, y finalmente es hora de un código R. 

Primero, asegúrese de tener instalado el paquete gmailr. Está disponible en CRAN, por lo que puede instalarlo con install.packages("gmailr"). Luego cargue el paquete en su script con library(gmailr).

Antes de hacer cualquier otra cosa, querrá configurar su sesión de trabajo de R para usar su archivo de credenciales JSON descargado. Puede hacerlo con la use_secret_file()función y el nombre de su archivo JSON como argumento. Si llamo a mi archivo de credenciales JSON DoMoreWithR.json, el comando sería 

use_secret_file("DoMoreWithR.json")

En realidad, enviar un mensaje es bastante fácil.

Para obtener algunos datos de muestra, descargué las tasas de desempleo mensuales de EE. UU. Y luego creé una cadena de texto llamada latest_msg con información sobre la última tasa de desempleo. Tenga en cuenta que en el código siguiente utilizo el paquete de pegamento para ensamblar la cadena de caracteres que quiero para mi mensaje, pero eso es porque me gusta hacerlo de esa manera; paste()o paste0()trabajar igualmente bien.

Puede utilizar cualquier dato generado por R que desee en su mensaje de correo electrónico. Si desea seguir el mío, aquí está el código (necesitará el paquete pacman instalado):

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

desempleo <- coredata (UNRATE)

month_starting <- índice (UNRATE)

series_length <- longitud (desempleo)

latest_msg <- pegamento ("La última tasa de desempleo de EE. UU. fue {desempleo [series_length]}, en el mes que comenzó el {month_starting [series_length]}. Eso es {desempleo [series_length] - desempleo [series_length - 1]} puntos porcentuales de diferencia con respecto al mes.")

A continuación, quiero crear un objeto de correo electrónico MIME y luego agregar una dirección para, una dirección de remitente, el texto del asunto y el cuerpo de mi mensaje.

my_email_message%

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

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

asunto ("Mi mensaje de prueba")%>%

cuerpo_texto (último_msg)

Si hace esto y luego verifica la estructura de my_email_message con str(my_text_message), verá que es una lista con una clase de mime.

Después de crear su objeto de mensaje MIME, puede enviarlo con la send_message()función. El argumento es solo el nombre de mi objeto MIME, en este caso my_email_message. Entonces, el comando completo en este caso es

enviar_mensaje (mi_mensaje_correo electrónico)

Cuando ejecute send_message () por primera vez, probablemente se le preguntará si desea almacenar en caché la autorización entre sesiones de R. Te sugiero que digas que sí. La primera vez que ejecute esto, también se le pedirá en su navegador que autorice su secuencia de comandos R para usar su cuenta de Google.

Puede hacer más con gmailr. Una opción es crear un mensaje HTML, por lo que puede usar marcas como negrita y cursiva.

Aquí el cuerpo de mi mensaje incluye marcas de párrafo tipo HTML y negrita y cursiva, y lo enviaré a la dirección de mi trabajo. 

html_msg_text <- pegamento ("

La última tasa de desempleo de EE. UU. Fue

{desempleo [series_length]} , en el mes que comienza

{month_starting [series_length]}. Eso es

{desempleo [series_length] - desempleo [series_length - 1]}

diferencia de puntos porcentuales con respecto al mes anterior.

Datos de la Oficina de Estadísticas Laborales de EE. UU.

")
my_html_message%

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

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

asunto ("Mi mensaje de prueba")%>%

html_body (html_msg_text)

enviar_mensaje (mi_html_mensaje)

Desafortunadamente, no conozco una manera de incluir fácilmente una imagen generada desde R directamente en el cuerpo del mensaje. Pero es bastante sencillo incluir uno como archivo adjunto. 

En la parte superior del script a continuación, estoy convirtiendo los datos de mi tasa de desempleo en un marco de datos con métricas de 2000 y posteriores, de modo que puedo usar ggplot para graficarlo y luego guardar el gráfico en un archivo. 

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 lo desea, puede usar la función create_draft() para crear un borrador de mensaje en su cuenta de Gmail, si desea verificar cómo se ve antes de enviarlo. En este caso, create_draft(message2)crearía un borrador de mi mensaje de archivo adjunto.

Si desea ver cómo se ve todo esto en acción, consulte el video en la parte superior de este artículo. Y para obtener más consejos de R, diríjase a la página de videos Do More With R o consulte la lista de reproducción Do More With R de YouTube.