sendmailR消息体

时间:2014-03-26 21:33:35

标签: r sendmailr

我尝试使用sendmailR程序包发送电子邮件。引用位于here的示例。

我能够很好地发送电子邮件,但当它们出现在我的邮件客户端(Outlook 2013)中时,会显示原始HTML代码。任何想法如何纠正这个?

收到的电子邮件示例。 https://dl.dropboxusercontent.com/u/3734701/Untitled_Clipping_032614_022810_PM.jpg

2 个答案:

答案 0 :(得分:1)

您需要使用Content-Type标头指定正确的MIME类型。但是,显然作者决定对此进行硬编码,headers函数提供的sendmail参数不适用于Content-Type。你可以使用trace函数来解决它,它可以让你动态地将内容插入到其他函数中。有关此问题的更多信息,请参阅他的Debugging tutorial

在内部函数sendmailR:::.write_mail中,作者具有以下代码:

 for (part in msg) {
   writeLines(sprintf("--%s", boundary), sock, sep="\r\n")
   if (inherits(part, "mime_part"))
     .write_mime_part(part, sock)
   else if (is.character(part)) { ## Legacy support for plain old string
     ## writeLines(sprintf("--%s", boundary), sock, sep="\r\n")
     writeLines("Content-Type: text/plain; format=flowed\r\n", sock, sep="\r\n")
     writeLines(part, sock, sep="\r\n")
   }

我们将在writeLines内部函数中临时替换函数sendmailR,以将text/plain(非HTML电子邮件)更改为text/html。这将强制使用正确的MIME类型。

 send_html <- function(...) {
   suppressMessages(trace(sendmailR:::.write_mail, quote(
    writeLines <- function(x, ...) {
     if(grepl('^Content-Type: text/plain', x)) base::writeLines(gsub('\\/plain', '\\/html', x), ...)
     else base::writeLines(x, ...)
    }), at = 9))
    capture.output(sendmail(...))
    suppressMessages(untrace(sendmailR:::.write_mail)) # undo our hack
 }
 send_html('you@gmail.com','you@gmail.com','hello','<h1> Hows it going man? </h1>')

神奇的数字9来自于使用print(as.list(body(sendmailR:::.write_mail)))和眼球注入代码的位置。

example email

答案 1 :(得分:0)

您可以尝试在github https://github.com/rpremraj/mailR

上提供的mailR包的开发版本

使用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),
          authenticate = TRUE,
          send = TRUE)