将针织的临时文件附加到R闪亮的电子邮件中

时间:2018-04-04 19:06:21

标签: r email shiny r-markdown knitr

我有一个工作闪亮的应用程序,使用Mailgun在单击按钮时发送电子邮件,并在单击另一个按钮时生成rmarkdown报告。

这是工作代码,显然没有工作电子邮件身份验证:

ui.R

library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(
  sliderInput("slider", "Slider", 1, 100, 50),
  downloadButton("report", "Generate report"),
  actionButton("mail", "send email"),
  textOutput('mailo')
)
)

server.R

library(shiny)

sendEmail <- function(email = "xxx@you.org",
                      mail_message = "Hello"){

  url <- "https://api.mailgun.net/v3/sandboxxxxxxxxx.mailgun.org/messages"
  ## username:password so api_key is all after the api:
  api_key <- "key-0xxxxxxxxxxxx"
  the_body <-
    list(
      from="Mailgun Sandbox <postmaster@sandboxxxxxxxxxxxxxxxx.mailgun.org>",
      to=email,
      subject="Mailgun from R test",
      text=mail_message
    )

  req <- httr::POST(url,
                    httr::authenticate("api", api_key),
                    encode = "form",
                    body = the_body)

  httr::stop_for_status(req)

  TRUE

}


# Define server logic required to draw a histogram
shinyServer(function(input, output) {

  event <- observeEvent(input$mail,{     
                                  sendEmail()
                                  }, ignoreInit = TRUE)
  output$mailo <- renderText({print("EMAIL SENT!")})

  output$report <- downloadHandler(
    # For PDF output, change this to "report.pdf"
    filename = "report.html",
    content = function(file) {
      # Copy the report file to a temporary directory before processing it, in
      # case we don't have write permissions to the current working dir (which
      # can happen when deployed).
      tempReport <- file.path(tempdir(), "report.Rmd")
      file.copy("report.Rmd", tempReport, overwrite = TRUE)

      # Set up parameters to pass to Rmd document
      params <- list(n = input$slider)

      # Knit the document, passing in the `params` list, and eval it in a
      # child of the global environment (this isolates the code in the document
      # from the code in this app).

      rmarkdown::render(tempReport, 
                        output_file = file,
                        params = params,
                        envir = new.env(parent = globalenv())
      )
    }
  )

})

我想一步完成这两件事。也就是说,生成报告,将其附加到电子邮件并将其发送到给定地址。我只是不确定在引用文件时如何对待tempfile()

我目前还在Shinyapps.io上部署了应用程序,因此保存到文件然后检索不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

这是您需要的代码。我进行了测试,尽管它的gmail确实给了我巨大的黄色警告,但该电子邮件中包含未经验证的文件,这可能很危险,但我的gmail确实发出了警告。我还简化了该应用程序,并删除了一些不必要的代码。

library(shiny)

ui <- fluidPage(
  sliderInput("slider", "Slider", 1, 100, 50),
  actionButton("mail", "send email")
)

sendEmail <- function(email = "RECIPIENT@gmail.com",
                      mail_message = "Hello",
                      file = NULL) {

  url <- "https://api.mailgun.net/v3/sandboxxxxxxxxxxxxxxxxxxxxxxxx.mailgun.org/messages"
  ## username:password so api_key is all after the api:
  api_key <- "XXXXXXXXXXXXXXXXXX-XXXXXXXXX-XXXXX"
  the_body <-
    list(
      from = "Mailgun Sandbox <postmaster@sandboxXXXXXXXXXXXXXXXXXXX.mailgun.org>",
      to = email,
      subject = "Mailgun from R test",
      text = mail_message
    )
  if (!is.null(file)) {
    the_body$attachment = httr::upload_file(file)
  }

  req <- httr::POST(url,
                    httr::authenticate("api", api_key),
                    encode = "multipart",
                    body = the_body)

  httr::stop_for_status(req)

  TRUE

}

server <- function(input, output, session) {
  observeEvent(input$mail, {
    # Copy the report file to a temporary directory before processing it, in
    # case we don't have write permissions to the current working dir (which
    # can happen when deployed).
    tempReport <- file.path(tempdir(), "report.Rmd")
    file.copy("report.Rmd", tempReport, overwrite = TRUE)

    # Set up parameters to pass to Rmd document
    params <- list(n = input$slider)

    # Knit the document, passing in the `params` list, and eval it in a
    # child of the global environment (this isolates the code in the document
    # from the code in this app).

    file <- rmarkdown::render(tempReport,
                      output_file = file.path(tempdir(), "report.html"),
                      params = params,
                      envir = new.env(parent = globalenv())
    )

    sendEmail(file = file)
  })
}

shinyApp(ui, server)

顺便说一句,如果您有兴趣的话,还有一个IMmailgun软件包,但实际上可以实现您使用此代码所做的工作。