mailR:如何在电子邮件中以正文形式发送rmarkdown文档?

mailR:如何在电子邮件中以正文形式发送rmarkdown文档?,r,email,r-markdown,sendmailr,R,Email,R Markdown,Sendmailr,如何使用R将生成的文档作为电子邮件正文发送 我已经用mailR成功地尝试了knitr,但是当用(新的)rmarkdown包生成html报告时失败了 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 =

如何使用R将生成的文档作为电子邮件正文发送

我已经用
mailR
成功地尝试了
knitr
,但是当用(新的)
rmarkdown
包生成html报告时失败了

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
)
错误:

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
我想这与以下行有关:无法解析以下文件资源:/Users/USERNAME/myfolder//data:image/png;base64


我非常感谢您的指导。

mailR目前不支持解析使用数据URI方案()编码的内联图像

目前,我建议以下解决方案来解决您的问题。在未来,我将考虑让mailr在本地支持这一点

首先,从R终端创建HTML文件(这里重要的是选项不包括“
base64\u图像”
”——请参见
?markdown::markdownHTMLOptions
):

现在,您可以通过mailR发送生成的HTML文件:

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)

您还可以从R本身创建html。这里也有一个例子(很抱歉重复,但我认为在回复前一条评论时的格式不好理解)

我做的一个变通方法/解决方案是设置参数:

  #------------------
  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)
  #------------------
(或者为markdownToHTML选项选择自己的参数集,同时确保避免添加“base64_图像”)

通过这种方式,我成功地发送了html,并让报告在电子邮件正文中显示报告中包含的图像。图像位于生成html的同一文件夹中


我希望这会有所帮助。

当html文件包含图像时,我会收到类似的消息,即使它是使用(旧)标记包生成的。如果图像未包含在消息正文中,我通常会收到以下失败:“org.apache.commons.mail.EmailException:将电子邮件发送到以下服务器失败:aspmx.l.google.com:25。我们的系统检测到此邮件可能是未经请求的邮件。为了减少发送到Gmail的垃圾邮件数量,此消息已被阻止:“谢谢!我期待未来的本机支持。@RahulPremraj我可以使用file.choose()吗?”或者从shiny的fileInput附加文件?@Rahul Premraj我刚刚尝试了你的解决方法,但我收到一个错误,告诉我使用rmarkdown::render而不是knitr::knit2html。我尝试了使用该函数的相同语法,但它不起作用。你能发布一个与render函数一起工作的更新的解决方法吗?顺便说一句,谢谢你的邮件软件包-太棒了!@ChrisNewton您必须删除my_report.Rmd文件中的markdown YAML头。否则knitr例如
knit2html(“my_report.Rmd”,options=”“)
无法呈现markdown文件。更新的解决方法:markdownToHTML(“MyReport.Rmd”,output=“MyReport.html”,options=c(“toc”,“use_xhtml”,“smartypants”,“mathjax“,”突出显示代码“)send.mail(发件人=”myemail@example.com“,to=”myemail@example.com,subject=“邮件正文中带有HTML标记文档的电子邮件”,body=“MyReport.HTML”,HTML=TRUE,inline=TRUE,smtp=list(host.name=“localhost”),send=TRUE)(即避免该选项“base64_图像”,将图像放在html所在的同一文件夹中(&P)
  #------------------
  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)
  #------------------