R Shiny 通过电子邮件附件发送用户上传的文件
R Shiny sending user-uploaded file via email attachment
我正在尝试构建一个 Shiny 应用程序,它将接受用户上传的文件以及一些其他用户输入信息(textInput 输入),然后使用 textInput 对象向我发送一封电子邮件以填写主题,正文等,同时使用 mailR 包获取文件并将其附加到具有特定名称的电子邮件中。我已经在下面发布了我正在使用的代码(更改了电子邮件地址、用户名和密码)。
代码
# load packages
library(shiny)
library(rJava)
library(mailR)
library(timeDate)
##############
##### ui -----
##############
ui = fluidPage(
fluidRow(
wellPanel(title = "Submit Data to the Database",
textInput("name", label = "Name:", placeholder = "Name"),
textInput("email","Email Address:"),
textInput("inst","Institution:"),
textInput("notes","Notes:", placeholder = ""),
fileInput("userdata", label = "Choose CSV File",
accept = c(
"text/csv",
"text/comma-separated-values,text/plain",
".csv")),
actionButton("submitdata",label = "Submit Data")
)
))
##################
##### server -----
##################
server <- function(input, output) {
observeEvent(input$submitdata, {
isolate({
send.mail(from = "myemail@gmail.com",
to = "myotheremail@gmail.com",
subject = paste("New data submitted to WoodDAM from", input$name, sep = " "),
body = paste(input$name, "from institution:", input$inst, "with email:", input$email,
"has submitted data to the wood jam dynamics database.",
"This data is attached to this email",
input$name, "sent the following note accompanying this data:", input$note, collapse = ","),
smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "myusername", passwd = "mypassword", ssl = TRUE),
authenticate = TRUE,
send = TRUE,
attach.files = input$userdata,
file.names = paste(timeDate(Sys.time(), FinCenter = "America/Denver"), input$name, "WooDDAM_user_data", sep = "_", collapse = ","), # optional parameter
debug = T)
})
})
}
shinyApp(ui = ui, server = server)
当我在外部查看器(chrome 浏览器)中 运行 这个应用程序时,我可以输入文本并收到一封要发送的电子邮件,但当我上传一个测试 .csv 文件并单击提交按钮,它 returns 如下所示的错误。
错误
Listening on http://127.0.0.1:3587
Warning: Error in .createEmailAttachments: If not NULL, length of argument 'file.names' must equal length of argument 'file.paths'
Stack trace (innermost first):
77: .createEmailAttachments
76: send.mail
69: isolate
68: observeEventHandler [#3]
4: <Anonymous>
3: do.call
2: print.shiny.appobj
1: <Promise>
当我通过注释掉 file.names 参数来删除它时,我认为这会解决问题,但我收到以下错误:
第二个错误
Warning: Error in file.exists: invalid 'file' argument
Stack trace (innermost first):
78: file.exists
77: .createEmailAttachments
76: send.mail
69: isolate
68: observeEventHandler [#3]
4: <Anonymous>
3: do.call
2: print.shiny.appobj
1: <Promise>
对于如何让此应用发送上传的 csv 文件而不抛出错误,有没有人有任何建议?当我尝试将 input$userdata 提供给 send.mail 的 attach.files 参数时,我怀疑我做错了什么,但我不确定如何使该输入成为电子邮件附件。虽然文件名问题很烦人,但我可以忍受无法更改文件名,只要上传的文件附在电子邮件中即可。
感谢您提供的任何帮助!
它不起作用的原因是您将对象 input$userdata
提供给 send.mail
函数而不是 filepath
.
如果把input$userdata
的内容打印出来,可以看到它包含以下属性:
- 名字
- 尺码
- 类型
- 数据路径
您应该像这样传递数据路径:attach.files = input$userdata$datapath
.
语法得到纠正,但是如果您热衷于使用 gmail,您可能仍然需要在 google account 上启用安全性较低的应用程序。
我正在尝试构建一个 Shiny 应用程序,它将接受用户上传的文件以及一些其他用户输入信息(textInput 输入),然后使用 textInput 对象向我发送一封电子邮件以填写主题,正文等,同时使用 mailR 包获取文件并将其附加到具有特定名称的电子邮件中。我已经在下面发布了我正在使用的代码(更改了电子邮件地址、用户名和密码)。
代码
# load packages
library(shiny)
library(rJava)
library(mailR)
library(timeDate)
##############
##### ui -----
##############
ui = fluidPage(
fluidRow(
wellPanel(title = "Submit Data to the Database",
textInput("name", label = "Name:", placeholder = "Name"),
textInput("email","Email Address:"),
textInput("inst","Institution:"),
textInput("notes","Notes:", placeholder = ""),
fileInput("userdata", label = "Choose CSV File",
accept = c(
"text/csv",
"text/comma-separated-values,text/plain",
".csv")),
actionButton("submitdata",label = "Submit Data")
)
))
##################
##### server -----
##################
server <- function(input, output) {
observeEvent(input$submitdata, {
isolate({
send.mail(from = "myemail@gmail.com",
to = "myotheremail@gmail.com",
subject = paste("New data submitted to WoodDAM from", input$name, sep = " "),
body = paste(input$name, "from institution:", input$inst, "with email:", input$email,
"has submitted data to the wood jam dynamics database.",
"This data is attached to this email",
input$name, "sent the following note accompanying this data:", input$note, collapse = ","),
smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "myusername", passwd = "mypassword", ssl = TRUE),
authenticate = TRUE,
send = TRUE,
attach.files = input$userdata,
file.names = paste(timeDate(Sys.time(), FinCenter = "America/Denver"), input$name, "WooDDAM_user_data", sep = "_", collapse = ","), # optional parameter
debug = T)
})
})
}
shinyApp(ui = ui, server = server)
当我在外部查看器(chrome 浏览器)中 运行 这个应用程序时,我可以输入文本并收到一封要发送的电子邮件,但当我上传一个测试 .csv 文件并单击提交按钮,它 returns 如下所示的错误。
错误
Listening on http://127.0.0.1:3587
Warning: Error in .createEmailAttachments: If not NULL, length of argument 'file.names' must equal length of argument 'file.paths'
Stack trace (innermost first):
77: .createEmailAttachments
76: send.mail
69: isolate
68: observeEventHandler [#3]
4: <Anonymous>
3: do.call
2: print.shiny.appobj
1: <Promise>
当我通过注释掉 file.names 参数来删除它时,我认为这会解决问题,但我收到以下错误:
第二个错误
Warning: Error in file.exists: invalid 'file' argument
Stack trace (innermost first):
78: file.exists
77: .createEmailAttachments
76: send.mail
69: isolate
68: observeEventHandler [#3]
4: <Anonymous>
3: do.call
2: print.shiny.appobj
1: <Promise>
对于如何让此应用发送上传的 csv 文件而不抛出错误,有没有人有任何建议?当我尝试将 input$userdata 提供给 send.mail 的 attach.files 参数时,我怀疑我做错了什么,但我不确定如何使该输入成为电子邮件附件。虽然文件名问题很烦人,但我可以忍受无法更改文件名,只要上传的文件附在电子邮件中即可。
感谢您提供的任何帮助!
它不起作用的原因是您将对象 input$userdata
提供给 send.mail
函数而不是 filepath
.
如果把input$userdata
的内容打印出来,可以看到它包含以下属性:
- 名字
- 尺码
- 类型
- 数据路径
您应该像这样传递数据路径:attach.files = input$userdata$datapath
.
语法得到纠正,但是如果您热衷于使用 gmail,您可能仍然需要在 google account 上启用安全性较低的应用程序。