sendmailR(第 2 部分):将文件作为邮件附件发送

Posted

技术标签:

【中文标题】sendmailR(第 2 部分):将文件作为邮件附件发送【英文标题】:sendmailR (Part2): Sending files as mail attachments 【发布时间】:2011-04-04 02:38:24 【问题描述】:

按照this 相关问题中提供的说明,我能够发送 html 格式的邮件消息。现在的问题是:我应该如何修改以下代码,以便将一个或多个文件(任何类型)附加到此消息?

library(sendmailR)

from <- "<sendmailR@myserver.mycompany.com>"
to <- c("<someone@mycompany.com>","<anotherone@mycompany.com>")
subject <- iconv("Message Title", to = "utf8")

msg <- "<hr size='2' width='33%' style='text-align: left;'><font size='2'>
  <i>This email was sent automatically using <a href='http://finzi.psych.upenn.edu/R/library/sendmailR/html/00Index.html' rel='nofollow' target='_blank'>sendmailR</a>.<br>
  Please do not reply directly to this e-mail.</i></font>"

msg <- iconv(msg, to = "utf8")

sapply(to,function(x) sendmail(from, x, subject, msg, control=list(smtpServer="###.###.###.###"), headers=list("Content-Type"="text/html; charset=UTF-8; format=flowed")))

【问题讨论】:

我在这里添加了处理多个附件的代码:***.com/questions/2885660/… 【参考方案1】:

使用 mailR 包 (https://github.com/rpremraj/mailR),您可以轻松发送 HTML 电子邮件和附加文件,如下所示:

send.mail(from = "sender@gmail.com",
          to = c("recipient1@gmail.com", "recipient2@gmail.com"),
          subject = "Subject of the email",
          body = "<html>The apache logo - <img src=\"http://www.apache.org/images/asf_logo_wide.gif\"></html>",
          html = TRUE,
          smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = TRUE),
          attach.files = c("./download.log", "upload.log"),
          authenticate = TRUE,
          send = TRUE)

编辑(2014-05-13):

mailR 已更新为允许不同的字符编码。下面是一个以 UTF-8 格式发送消息的示例。

send.mail(from = "Sender Name <sender@gmail.com>",
          to = "recipient@gmail.com",
          subject = "A quote from Gandhi",
          body = "In Hindi :  थोडा सा अभ्यास बहुत सारे उपदेशों से बेहतर है।
                  English translation: An ounce of practice is worth more than tons of preaching.",
          encoding = "utf-8",
          smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "gmail_username", passwd = "password", ssl = T),
          authenticate = TRUE,
          send = TRUE)

【讨论】:

谢谢!如何设置字符集为 UTF-8? 我看到最后一个版本也支持utf-8编码。你的答案值得被接受。 感谢伟大的包裹!【参考方案2】:

一个工作(至少对我来说)功能:

sendMessage<-function(contents,subject,from,to,attMIME,attachment,control)    
   msg<-list(contents,sendmailR:::.file_attachment(attachment,attachment,attMIME));
   sendmail(from=from,to=to,subject=subject,msg=msg,control=control);

可以这样使用:

png('a.png');hist(rnorm(700));dev.off()
sendMessage('Here you have a nice histogram:',
'Nice picture',
'from@example.com',
'to@example.com',
'image/png',
'a.png',list(smtpServer="..."))

请注意,此示例发送的邮件可能会被标记为垃圾邮件,因为它是短文本和大图片 - 但是对于较大的邮件,例如 pdf 附件,它应该通过。如果没有,您可以考虑添加消息的文本版本。

编辑(现在不太相关):关于如何制作 MIME 消息的最深刻见解可以在 here 找到。

【讨论】:

我想我正处于“愚蠢”的日子之一。我必须承认我不明白我是否能做到。如果您认为有可能,能否请您使用我的示例并进行适当的转换? 当然可以,您必须将消息和附件压缩成这种疯狂的格式,然后将其作为实际消息传递。我打算将其编辑为可用的代码,但这仍需要一些时间,因为现在我还有其他事情要做。 嗯。 waitFor(代码)中的错误:SMTP 错误:5.7.1 无法为 mymail@mycompany.com 中继 只要你真的尝试过 mymail@mycompany.com,我并不感到意外。如果不是,这是网络错误或错误的 SMTP 配置。 其中一个问题与“控制”的使用有关。我使用了sendMessage&lt;-function(contents,subject,from,to,attMIME,attachment,ctrl)sendmail(from,to,subject,msg,control=ctrl... 现在当我使用谷歌的 smtpServer 时,我确实收到了一条带有图片的消息,但我没有收到消息正文!!!【参考方案3】:

请注意,当前版本的 sendmailR 支持开箱即用的附件,方法是将 msg 设为 mime_type 对象的列表,即您现在可以

sendmail( from,to,subject,
          msg=list(mime_part("Here's an attachment for you!"), 
          mime_part(attachmentFileName)), control, headers)`

【讨论】:

【参考方案4】:

这是为日常批处理作业设置的示例,例如在 R 中使用 sendmail() 设置多个附件(一个 CSV,一个 PDF):

设置要在文件名中引用的日期信息:

> yesterday_date_stuff  <- new.env()
> yesterday_date_stuff[['month']] <- strftime(Sys.Date()-1, format="%m")
> yesterday_date_stuff[['day']] <- strftime(Sys.Date()-1, format="%d")
> yesterday_date_stuff[['year']] <- strftime(Sys.Date()-1, format="%y")
> yesterday_date_stuff$month
[1] "03"
> yesterday_date_stuff$day
[1] "29"
> yesterday_date_stuff$year
[1] "17"

现在在本文末尾创建一些 sendmail() 函数所需的信息:

> from <- "youremail@whateveryourmailserveris.com"
> to <- c("person_A_to_send_email_to@whatever.com", "person_B_to_send_email_to@whatever.com", "person_C_to_send_email_to@whatever.com")
> subject <- paste("whatever you want subject line to read for batch job analyzing data for ", yesterday_date_stuff$month, "/", yesterday_date_stuff$day, "/", yesterday_date_stuff$year, sep="")
> body <- "Text to insert into the body of your email"                     

在此处指定邮件服务器:

> mailControl=list(smtpServer="mail.whateveryourmailserveris.com")

定义附件1的路径和名称:

> attachmentPath1 <- paste("file1name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".csv", sep="")
> attachmentName1 <- paste("file1name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".csv", sep="")

定义附件 1 对象:

> attachmentObject1 <- mime_part(x=attachmentPath1,name=attachmentName1)

定义附件2路径和名称:

> attachmentPath2 <- paste("file2name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".pdf", sep="")
> attachmentName2 <- paste("file2name", "_", yesterday_date_stuff$month, yesterday_date_stuff$day, yesterday_date_stuff$year, ".pdf", sep="")

定义附件2对象:

> attachmentObject2 <- mime_part(x=attachmentPath2,name=attachmentName2)

现在将电子邮件正文与附件结合起来:

> bodyWithAttachment <- list(body,attachmentObject1, attachmentObject2)
> bodyWithAttachment
[[1]]
[1] "Text to insert into the body of your email"

[[2]]
<environment: 0x000000004efff188>
attr(,"class")
[1] "mime_part"

[[3]]
<environment: 0x00000000407a1b68>
attr(,"class")
[1] "mime_part"

使用 sendmail() 函数发送电子邮件:

> sendmail(from=from, to=to, subject=subject, msg=bodyWithAttachment, control=mailControl)

【讨论】:

【参考方案5】:

我会放弃为此使用 R。存在用于在 Python 中执行此操作的可行、跨平台、稳定的解决方案,您可以从 R 调用 Python。

如果我必须在 Python 程序中拟合混合效果模型,我会调用 R 来完成它 - 如果我想做一个系统任务,比如在 R 中发送电子邮件,我会调用 Python 来完成它。如果你还不知道它值得学习。

【讨论】:

如果允许使用外部工具,运行writeLines(message,p&lt;-pipe('mutt -s blah -a att.ext -- mail@mail.com'));close(p) 会更容易。 mutt有Windows移植,所以是跨平台的。

以上是关于sendmailR(第 2 部分):将文件作为邮件附件发送的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 发送带有附件的电子邮件,附件在 Thunderbird 中作为第 1.2 部分到达

将一些文件附加到 MIME 多部分电子邮件

使用 mailR 包通过 R 通过 Outlook 发送经过身份验证的邮件

我可以将 S/MIME 作为多部分/混合消息的一部分吗?

使用列表邮件时,Outlook 邮件 API 返回拼写检查类名称作为 html 响应的一部分

作为 Cognito 验证的一部分,在 SES 中验证电子邮件