mailR: how to send rmarkdown documents as body in email?

老子叫甜甜 提交于 2019-11-29 14:41:02

问题


How to send rmarkdown generated documents as a body in an email, using R?

I have successfully tried knitr with mailR, but when instead generating the html-report with the (new) rmarkdown-package it fails.

library(mailR)
send.mail(
  from = "FROM@gmail.com",
  to = "TO@gmail.com",
  subject = "MyMail",
  html = T,
  inline = T,
  body = "my_report.html",
  smtp = list(host.name = "smtp.gmail.com", port = 465,
    user.name = "USERNAME", passed = "PASSWORD", ssl = T),
  authenticate = T,
  send = T
)

error:

org.apache.commons.mail.EmailException: Building the MimeMessage failed
    at org.apache.commons.mail.ImageHtmlEmail.buildMimeMessage(ImageHtmlEmail.java:110)
    at org.apache.commons.mail.Email.send(Email.java:1436)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at RJavaTools.invokeMethod(RJavaTools.java:386)
Caused by: java.io.IOException: Cant resolve the following file resource :/Users/USERNAME/myfolder/./data:image/png;base64,iVBORw0KGg …

(…)

… SuQmCC
    at org.apache.commons.mail.resolver.DataSourceFileResolver.resolve(DataSourceFileResolver.java:105)
    at org.apache.commons.mail.resolver.DataSourceFileResolver.resolve(DataSourceFileResolver.java:79)
    at org.apache.commons.mail.ImageHtmlEmail.replacePattern(ImageHtmlEmail.java:149)
    at org.apache.commons.mail.ImageHtmlEmail.buildMimeMessage(ImageHtmlEmail.java:103)
    ... 6 more
Error: EmailException (Java): Building the MimeMessage failed

I guess it has to do with the following line: Cant resolve the following file resource :/Users/USERNAME/myfolder/./data:image/png;base64?

I'm more than grateful for any kind of guidance.


回答1:


mailR currently does not support resolving inline images encoded using the data URI scheme (http://en.wikipedia.org/wiki/Data_URI_scheme).

For the time being, I suggest the following solution to address your problem. In the future, I will look into getting mailr to support this natively.

First off, create the HTML file from the R terminal (the important thing here is that options does not include "base64_images" --- see ?markdown::markdownHTMLOptions):

library(knitr)
knit2html("my_report.Rmd",options="")

Now you can send the resulting HTML file via mailR:

send.mail(from = "FROM@gmail.com",
          to = "TO@gmail.com",
          subject = "MyMail",
          html = T,
          inline = T,
          body = "my_report.html",
          smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "USERNAME", passwd = "PASSWORD", ssl = T),
          authenticate = T,
          send = T)



回答2:


You can also create the html from R itself. Example here also (sorry for duplication, but formating in the reply to a previous comment was not nicely readable, I reckon)

A workaround/solution I did was to set the param:

  #------------------
  if (!require(pacman)) install.packages("pacman"); library(pacman)
  p_load("mailR")
  p_load("markdown")
  markdownToHTML("MyReport.Rmd", 
                 output="MyReport.html", 
                 options=c("toc", "use_xhtml", "smartypants", "mathjax", "highlight_code"))

  send.mail(from = "myemail@example.com",
            to = c("myemail@example.com", 
                   "myotheremail@example.com"),
            subject = "Email with a Markdown document in HTML at the message body",
            body = "MyReport.html",
            html = TRUE,
            inline = TRUE,
            smtp = list(host.name = "localhost"),
            send = TRUE)
  #------------------

(or choose your own param set for the options of markdownToHTML, while ensuring that you avoid adding the "base64_images")

This way, I managed to send the html and get the report to show in the body of the email the images included in your report. The images were places in the same folder where the html was generated.

I hope this helps.



来源:https://stackoverflow.com/questions/24346856/mailr-how-to-send-rmarkdown-documents-as-body-in-email

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!