Enviar correos desde R con cuentas Microsoft O365 (y gmail, hotmail…)


Existen varios paquetes para poder enviar correos electrónicos con adjuntos desde R, como por ejemplo: mailR, sendmailR, mail, blastula, blatr, gmailR, IMmailgun, emayili, RDCOMClient, ponyexpress….

Es muy común encontrarse como configurar estos paquetes para el envío de correos desde cuentas de gmail, hotmail (que al final de este post os pondré unos ejemplos), pero en mi caso, tuve muchos problemas para poder dar con un paquete que funcionase con una cuenta de Office365 y admitiese la configuración TLS/StartTLS.

La configuración de las cuentas de Office365 es la siguiente:

Servidor/host inteligentesmtp.office365.com
PuertoPuerto 587 (recomendado) o puerto 25
TLS/StartTLSHabilitado
Configuración correo smpt cuentas Microsoft Office365 – Fuente: docs.microsoft.com

Únicamente conseguí hacerlo funcionar con estos dos paquetes: mailR y emayili.

mailR

Este paquete, como indica su documentación, permite a los usuarios enviar correos electrónicos desde R.

La instalación del paquete no tiene mayor complicación, es simple como cualquier otro paquete de R. A continuación os indico el comando de instalación:

install.packages("mailR", dep = T)

Es muy sencillo de utilizar y configurar con los parámetros de Microsoft Office 365:

library(rJava)
library(mailR)

desde <- "javier@javierripoll.com"
para <- "destinatario@javierripoll.com" #Podría ser una lista
asunto <- "Esta es una prueba"
mensaje <- "Esto es el cuerpo del mensaje de prueba"

send.mail(from = desde,
to = para,
subject = asunto,
body = mensaje,
authenticate = TRUE,
smtp = list(host.name = "smtp.office365.com", port = 587,
                        user.name = "javier@javierripoll.com", passwd = "MiContrasenya", tls = TRUE))

mailR necesita del paquete rJava, que es una sencilla interfaz R-to-Java. rJava proporciona un puente de bajo nivel entre R y Java (a través de JNI). Permite crear objetos, llamar a métodos y acceder a campos de objetos Java desde R.

Aunque a priori parece sencillo de instalar y utilizar, me he encontrado con problemas por la librería dependiente rJava, como el que os muestro a continuación:

library(rJava)
Error: package or namespace load failed for ‘rJava’:
 .onLoad failed in loadNamespace() for 'rJava', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/home/meteo/R/x86_64-pc-linux-gnu-library/3.6/rJava/libs/rJava.so':
  libjvm.so: cannot open shared object file: No such file or directory

Este problema aparece porque faltan unos archivos que deben copiarse en la carpeta del paquete rJava. Por tanto, para poder dar solución a este problema, debéis copiar los ficheros javax.activation-api-1.2.0.jar y javax.activation-1.2.0.jar en el directorio java del paquete mailR. En mi caso, la ruta en linux es /usr/local/lib/R/site-library/mailR/java/ , en Windows es similar.

Estos dos archivos se pueden obtener desde:

Con Windows, copiando estos dos ficheros en la ruta indicada bastaría para funcionar. Pero estuve probando este paquete con una imagen de Docker de Debian, y me encontré con el mismo error. Buscando por internet, encontré que con instalar Java y ejecutar el siguiente comando, se solucionaba.

sudo apt-get update && sudo apt-get install openjdk-11-jdk
sudo R CMD javareconf

Y con todo esto, debería funcionar!

emayili

Si habéis leído el apartado anterior, habéis visto que mailR, aunque funcional y sencillo, tiene una dependencia de Java que nos puede dar dolores de cabeza. Emayili, es una herramienta ligera y sin dependencias, que funcionará a la primera con la configuración de Office365.

La instalación es sencilla:

install.packages("emayili")

Y su utilización, aún más:

library(emayili)

desde <- "javier@javierripoll.com"
para <- "destinatario@javierripoll.com" #Podría ser una lista
asunto <- "Esta es una prueba"
mensaje <- "Esto es el cuerpo del mensaje de prueba"

email <- envelope(
  from = desde,
  to= para,
  subject = asunto,
  text = mensaje)
smtp <- server(host = "smtp.office365.com",
               port = 587,
               username = "javier@javierripoll.com",
               password = "MiContrasenya")
smtp(email, verbose = TRUE)

Como habéis visto, podréis utilizar estos dos paquetes para el envío de correos desde cuentas Microsoft Office 365. Pero, con independencia que este post habla del envío desde cuentas Microsoft Office365, el poder mandar desde cuentas gmail o hotmail sería muy sencillo, únicamente cambiando la configuración del servidor smtp cuando se configura el paquete mediante los parámetros. Por ejemplo:

Gmail

Con este ejemplo, se podría utilizar el paquete emayili para mandar correos desde cuentas de gmail.

library(emayili)

usuario<-"XXXXXXX@gmail.com"
contrasenya <- "micontrasenya"
para <- "destinatario@losequesea.com" #Podría ser una lista
asunto <- "Esta es una prueba gmail"
mensaje <- "Esto es el cuerpo del mensaje de prueba desde gmail"

smtp <- server(host = "smtp.gmail.com",
               port = 465,
               username = usuario,
               password = contrasenya)

email <- envelope(
  from = usuario,
  to= para,
  subject = asunto,
  text = mensaje)
smtp(email, verbose = TRUE)

Nota: En el caso que os aparezca el siguiente error:

535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8  https://support.google.com/mail/?p=BadCredentials y11sm333517wmi.0 - gsmtp
Closing connection 4
schannel: shutting down SSL/TLS connection with smtp.gmail.com port 465
Error in curl_fetch_memory(smtp_server, handle = h) : Login denied

Deberéis configurar vuestra cuenta de gmail para que de acceso a aplicaciones menos segura siguiendo los siguientes pasos:

  1. Ve a tu cuenta de Google.
  2. Selecciona Seguridad.
  3. En «Acceso a aplicaciones menos seguras» hacer clic en «Activar el acceso (opción no recomendada)».
Hotmail
library(emayili)

usuario<-"XXXXXXX@hotmail.com"
contrasenya <- "micontrasenya"
para <- "destinatario@losequesea.com" #Podría ser una lista
asunto <- "Esta es una prueba hotmail"
mensaje <- "Esto es el cuerpo del mensaje de prueba desde hotmail"

smtp <- server(host = "smtp.live.com",
               port = 587,
               username = usuario,
               password = contrasenya)

email <- envelope(
  from = usuario,
  to= para,
  subject = asunto,
  text = mensaje)
smtp(email, verbose = TRUE)
Otras cuentas

Con esta tabla, tenéis la configuración para poder mandar desde otras cuentas más comunes:

Proveedorhost.namePuertoSSL/TSLUtiliza STARTTLS
gmailsmtp.gmail.com587TLSSI
Outlooksmtp.office365.com587TLSNO
Yahoosmtp.mail.yahoo.com587TLSSI
Hotmailsmtp.live.com587TLSNO
AOLsmtp.aol.com587TLSSI
Fuente: https://www.r-bloggers.com/2019/04/mailr-smtp-setup-gmail-outlook-yahoo-starttls/

Fuentes:


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *