In meiner täglichen Arbeit mit R schätze ich die Möglichkeit, aus R Emails versenden zu können. Sei es, um live über bestimmte Ereignisse informiert zu werden, Programmabbrüche auf entfernten Rechnern frühzeitig zu bemerken oder um Ergebnisse automatisch als Report zu verschicken (z.B. als PDF mit RMarkdown).

Diese Automatisierung sorgt dafür, dass ich nicht wartend vor dem Rechner sitzen muss, sondern meine Zeit sinnvoller verwenden kann, aber trotzdem über alle Ereignisse informiert bin. Außerdem gelangen alle wichtigen Informationen zuverlässig an die richtigen Stellen.

Für diese Aufgabe habe ich mir ingesamt zehn Pakete näher angesehen.

Voraussetzungen

Alle Pakete wurden auf Windows-Rechnern mit RStudio und R-Version 3.6.2 getestet.

Neben R benötigt man noch Zugang zum entsprechenden SMTP-Mailserver. Diesen Zugang findet man z.B. in der Microsoft- oder Gmail-Hilfe oder fragt die eigene IT.

Betrachtete Pakete

Bei der Recherche stößt man im Internet auf diverse Pakete aus verschiedenen Quellen und Entwicklungsstadien. Ich habe die folgenden Pakete gefunden:

(Stand Januar 2020)

Die Kategorien

Bei diesen Paketen gibt es generell zwei Typen:

Allgemein gehaltene Pakete, die mit allen Providern zurechtkommen (Allrounder) und solche, die für einen bestimmten Mailprovider geschrieben wurden (Spezialisten).

Unabhängig davon gibt es noch eine weitere Kategorie: Pakete, die nicht geeignet sind, weil sie wesentliche Anforderungen nicht erfüllen oder stark veraltet sind.

Anforderungen

Für mich ist es wichtig, nicht nur simple Text-Emails versenden zu können, sondern auch auf den umfangreichen HTML-Baukasten Zugriff zu haben und Anhänge aller Art verwenden zu können. Außerdem ist eine sichere Verschlüsselung über SSL/TLS selbstverständlich. Natürlich soll das Paket außerdem “schlank” sein und ohne externe Abhängigkeiten auskommen.

Ich suche also nach Pakete, die folgende Anforderungen erfüllen:

  • verschlüsselte Authentifizierung
  • HTML-Formatierung (nicht nur Plaintext)
  • beliebige Anhängen
  • volle Funktion ohne weitere Software

Übersicht

Die folgende Tabelle gibt eine Übersicht, welches Paket welche Anforderung erfüllt.

Paket Empfehlenswert Authentifizierung HTML Anhänge Einschränkungen
mailR 0.4.1 eingeschränkt ja ja ja Java
emayili 0.2.2 eingeschränkt ja ja ja Paket nicht auf CRAN
blastula 0.3.1 ja ja ja ja -
gmailR 1.0.0 eingeschränkt ja ja ja Google-Account
ponyexpress 0.1.0.9000 eingeschränkt ja ja ja Google-Account, Paket nicht auf CRAN
IMmailgun 0.1.2 eingeschränkt ja ja ja Mailgun-Account
RDCOMclient 0.93 eingeschränkt jein ja ja Outlook, Version nicht auf CRAN
sendMailR 1.2-1 nein nein ja ja -
blatr 1.0.1 nein nein ja ja blat, SSL-Proxy
mail 1.0 nein nein nein nein außer Dienst

Im Folgenden stelle ich die Pakete in allen Einzelheiten vor.

mailR

mailR nutzt die Funktionalitäten aus rJava und braucht daher die passende Java-Installation auf dem Rechner.

install.packages(c("mailR", "rJava"))
library(mailR)

send.mail(
  from = "example@example.com",
  to = "wuerzburg_ds@cosmoconsult.com",
  subject = "Wie man Emails mit mailR versendet",
  body = "Hallo Cosmonauten,heute habe ich gelernt, wie man Emails in mailR versendet! LG ...",
  smtp = list(
    host.name = "smtp.example.com",
    port = 465,
    user.name = "user.name",
    passwd = "password",
    ssl = TRUE
  ),
  authenticate = TRUE,
  send = TRUE
)

Hier kann es vorkommen, dass RStudio das Java-Verzeichnis partout nicht findet und einen Fehler anzeigt. Typischerweise genügt es, R manuell den Installations-Pfad zu übergeben, aber es kommt auch vor, dass das Verzeichnis zum Windows-Pfad hinzugefügt werden muss.

Da nicht jeder Java auf eigenen oder fremden Rechnern installieren möchte, ist mailR nur eingeschränkt empfehlenswert.

emayili

emayili nutzt curl, eine Bibliothek zum Datenversand. emayili befindet sich noch in einem sehr frühen Entwicklungsstadium, weswegen es noch nicht in CRAN gelistet ist und auch keine ausführliche Dokumentation existiert. Davon abgesehen bietet emayili den vollen Funktionsumfang.

install.packages(c("curl", "dplyr"))
remotes::install_github("datawookie/emayili")

library("dplyr")
library("curl")
library("emayili")

email <- envelope() %>%
  from("example@example.com") %>%
  to("wuerzburg_ds@cosmoconsult.com") %>%
  subject("Wie man Emails mit emayili versendet") %>%
  html("Hallo Cosmonauten, heute habe ich gelernt, wie man Emails in emayili versendet! LG ...")


smtp <- server(
  host = "smtp.example.com",
  port = 465,
  username = "user",
  password = "password"
)
smtp(email, verbose = TRUE)

Aufgrund der frühen Version ist keine umfassende Beurteilung möglich, daher halte ich emayili (noch) für eingeschränkt empfehlenswert.

blastula

Blastula nutzt ebenfalls curl. (In einer früheren Version war Mailsend noch Pflicht. Dies gilt nicht mehr.)

install.packages("blastula")
library(blastula)

create_smtp_creds_file(file="blastula_example_cred",
  user = "example@example.com",
  provider = "example")

send_email_out(
  message = compose_email(
    body = "Hallo Cosmonauten, heute habe ich gelernt, wie man Emails in blastula versendet! LG ..."
  ),
  from = "example@example.com",
  to = "wuerzburg_ds@cosmoconsult.com",
  subject = "Wie man Emails mit blastula versendet",
  creds_file = "blastula_example_cred",
  verbose = TRUE
)

Die einfache Installation und Benutzung machen Blastula empfehlenswert.

gmailR

Wie der Name bereits andeutet, wurde gmailR für den Gebrauch mit Gmail entwickelt. Zur Authentifizierung muss lediglich die Gmail API aktiviert werden und ein Zugangstoken (JSON) heruntergeladen werden. Die Anleitung hierzu findet sich in der Paket-Dokumentation.

install.packages("gmailr","here")
library("gmailr","here")

# Dieses JSON muss verfügbar sein
gm_auth_configure(path = here::here("credentials.json"))
gm_auth()

email <-
  gm_mime() %>%
  gm_from("example@gmail.com") %>%
  gm_to("wuerzburg_ds@cosmoconsult.com") %>%
  gm_subject("Wie man Emails mit gmailR versendet") %>%
  gm_text_body("Hallo Cosmonauten, heute habe ich gelernt, wie man Emails in gmailR versendet! LG ...")

gm_send_message(email)

Aufgrund der Einschränkung auf Gmail ist gmailR eingeschränkt empfehlenswert.

ponyexpress

ponyexpress ist eine Erweiterung von gmailR und erleichtert den Versand an viele Adressen gleichzeitg. Die Authentifizierung funktioniert genauso wie bei gmailR.

devtools::install_github("ropenscilabs/ponyexpress")
library(gmailr)
library(ponyexpress)

gm_auth_configure(path = here::here("credentials.json"))
gm_auth()

df <- data.frame(
  name = c("Cosmonauten"),
  email = c("wuerzburg_ds@cosmoconsult.com")
)

template <- "Hallo {name},

heute habe ich gelernt, wie man Emails in ponyexpress versendet! 

LG ..."


parcel <- parcel_create(df,
                        sender_name = "...",
                        sender_email = "example@gmail.com",
                        subject = "Wie man Emails mit ponyexpress versendet",
                        template = template)

parcel_send(parcel)

Aufgrund der Einschränkung auf Gmail ist ponyexpress eingeschränkt empfehlenswert.

IMmailgun

IMmailgun erlaubt es, Mails mittels der Mailgun API zu verschicken. Dazu ist natürlich ein Mailgun-Account notwendig. Aus diesem generiert man dann die Domain-URL und den Zugangsschlüssel.

install.packages("IMmailgun")
library(IMmailgun)

url <- "https://api.mailgun.net/v3/MY_DOMAIN"
api_key <- "MY_KEY"

from="<example@MY_DOMAIN.mailgun.org>"
email_client <- mailgun$new(url = url, api_key = api_key, from = from)
email_client$sendEmail(to = c("wuerzburg_ds@cosmoconsult.com"),
                       subject = "Wie man Emails mit IMmailgun versendet", plaintext = "Hallo {name},

heute habe ich gelernt, wie man Emails in IMmailgun versendet! 

LG ...")

Aufgrund der Einschränkung auf Mailgun ist IMmailgun eingeschränkt empfehlenswert.

RDCOMclient

Das Paket RDCOMclient dient eigentlich dazu, COM-Objekte zu erzeugen. Das schließt auch Outlook-Mails mit ein. Der Nachteil ist natürlich, dass dies nur mit einer lokalen Outlook-Installation funktioniert. (Für R-3.6.2 ist außerdem noch keine stabile Version des Pakets erschienen. Daher nutzen wir hier eine Entwicklungsversion. )

devtools::install_github("dkyleward/RDCOMClient")
library("RDCOMClient")

OutApp <- COMCreate("Outlook.Application")

outMail <- OutApp$CreateItem(0)

outMail[["To"]] <- "wuerzburg_ds@cosmoconsult.com"
outMail[["subject"]] <- "Wie man Emails mit RDCOMClient versendet"
outMail[["body"]] <- "Hallo Cosmonauten, heute habe ich gelernt, wie man Emails in RDCOMClient versendet! LG ..."

outMail$Send()

Da RDCOMClient ausschließlich lokal arbeitet und keinen SMTP-Server anfragt, gibt es keine Authentifizierung (da es nicht nötig ist).

Da RDCOMClient nur mit Outlook funktioniert, ist es eingeschränkt empfehlenswert.

sendMailR

sendMailR bietet erst einmal denselben Umfang wie alle anderen Pakete auch, hat aber ein Problem: Es gibt keine sichere Authentifizierung am Mailserver, weswegen viele Server zu Recht das Verschicken verweigern. Ausnahmen hierbei sind beispielsweise der Versand von einer Gmail- zu einer Gmail-Adresse oder ein passend konfigurierter, lokaler Mailserver.

install.packages("sendmailR")
library(sendmailR)

sendmailR::sendmail(
  from = "<example@example.com>",
  to = "<wuerzburg_ds@cosmoconsult.com>",
  subject = "Wie man Emails mit sendMailR versendet",
  msg = "Hallo Cosmonauten, heute habe ich gelernt, wie man Emails in sendMailR versendet! LG ...",
  control = list(smtpServer = "smtp.example.com")
)

Aufgrund der fehlenden Sicherheit ist sendmailR nicht empfehlenswert.

blatr

Das Paket blatr nutzt die Funktionalität von blat, einem Kommandozeilentool zum Versand von Emails. Die Installation von blat kann direkt im R-Skript durchgeführt werden.

install.packages("blatr")
library(blatr)

blatr:::install_blat()

blatr:::check_install()

blat(
  f = "example@example.com",
  to = "wuerzburg_ds@cosmoconsult.com",
  s = "Wie man Emails mit blatr versendet",
  server = "smtp.example.com"
  body = "Hallo Cosmonauten, heute habe ich gelernt, wie man Emails in blatr versendet! LG ..."
)

Der große Nachteil ist, dass die Authentifizierung ohne Verschlüsselung stattfindet - Abhilfe schafft ein SSL-Proxy, z.B. Stunnel.

Daher ist auch dieses Paket nicht “einfach so” benutzbar und nicht empfehlenswert.

mail

Das mail-Paket ist zwar noch in CRAN gelistet, stammt aber aus 2011 und wird nicht mehr gewartet. Ursprünglich war es dafür gedacht, Emails über einen festen Server an sich selbst zu schicken (z.B. wenn Code fertig durchgelaufen ist), der Server ist aber inzwischen nicht mehr benutzbar.

Fazit

Ich habe zehn Pakete betrachtet und kann einige Empfehlungen aussprechen:

Alle anderen Pakete haben starke Einschränkungen oder sind ungeeignet.


Möchten Sie mehr darüber erfahren, wie wir (nicht nur) mit R Lösungen für unsere Kunden entwickeln? Wir freuen uns auf Ihre Anfrage - gerne auch direkt aus R gesendet!