5

我正在使用“pander”和“sendmailr”包在电子邮件正文中发送一个小数据框,而不是作为附件。我想将它从一个 gmail 帐户发送到一个 gmail 帐户。

我很接近,但列标题不会像在 Rstudio 中那样与电子邮件正文中的列本身对齐 - 基本上列标题太宽而无法与它们下面的数据列对齐。

似乎问题在于破折号和空格在各种电子邮件客户端中的压缩方式(我通过网络和 OS X Mavericks 附带的电子邮件客户端在 gmail、yahoo 和 hotmail 中尝试了这个)。我可以通过转到“首选项”并选中标有“对纯文本消息使用固定宽度字体”的框来解决我的 OS X 电子邮件客户端中的问题,但我希望它可以在多个设备上工作我的许多同事的客户等,所以我想知道是否有一种不涉及全局电子邮件设置的方法。

这是重现问题的代码:

library(sendmailR) # for emails from R
library(pander) # for table-formatting that does not require HTML

results <- head(iris)
pander(results) # widths look great so far...
a = pandoc.table.return(results)
strsplit(a, "\n") # widths still look great...

panderOptions('table.split.table', Inf) # show all columns on same line

msg_content <- mime_part(
  pandoc.table.return(results, style = "multiline")
)

# I'm using my own gmail address for email_from and email_to
sendmail(from = email_from,
         to = email_to,
         subject = "test",
         msg = msg_content
)

…并且收到的电子邮件存在上述问题。

接下来,您可以看到说明问题的图像:

描述的问题

4

1 回答 1

6

纯文本电子邮件和使用降价表的问题在于电子邮件客户端通常以非固定字体显示文本,并且您必须在所有电子邮件客户端中使用自定义设置来覆盖它(就像您用你的 OS X 电子邮件客户端做的)。另一方面,这就是 HTML 邮件流行的原因 :)

因此,让我们创建一个 HTML 邮件并将 markdown 表包含在一个pre块中:

msg_content <- mime_part(paste('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body><pre>', paste(pander.return(results, style = "multiline"), collapse = '\n'), '</pre></body>
</html>'))

由于 中的错误sendmailR,我们必须覆盖Content-typeto HTML:

msg_content[["headers"]][["Content-Type"]] <- "text/html"

现在可以通过您在示例中使用的评论发送它,结果是:

HTML 邮件中的 Pander 降价表

在任何其他支持 HTML 的电子邮件客户端中,该表应该看起来同样正常。请注意,如果这样可以更好地满足您的需求,您也可以使用 HTML 表格而不是 markdown。

于 2014-12-30T13:14:09.120 回答