是否可以在R中使用sendmail抄送收件人?

时间:2013-07-09 03:39:41

标签: r

我想从R向多个收件人发送一封邮件。我可以使用sendmail功能实现此功能,但当收件人收到电子邮件时,他们只会在to字段中看到他们的电子邮件地址。看起来像sendmail内部循环并向每个收件人发送单独的电子邮件,这不是真正的carbon copy。重要的是,每个收件人都会看到针对其特定电子邮件的所有收件人(业务要求,因为他们需要回复此电子邮件的所有收件人)。如何使用R?

实现这一目标

我的代码

require(sendmailR)
to <- c("vasudeva.naik@abc.com")
header <- list(cc=c("alok.jadhav@abc.com"))
x <- sendmail("toto@abc.com", to, "test", "testing", header=header,control=list(smtpServer=server,verbose=TRUE))
<< 220 equity.xyz.com ESMTP Sendmail 8.11.7p1+Sun/8.11.7; Thu, 11 Jul 2013 21:31:43 -0400 (EDT)
>> HELO  HKD03836654
<< 250 equity.xyz.com Hello HKD03836654.gbl.ad.net [169.34.175.142], pleased to meet you
>> MAIL FROM:  toto@abc.com
<< 250 2.1.0 toto@abc.com... Sender ok
>> RCPT TO:  vasudeva.naik@abc.com
<< 250 2.1.5 vasudeva.naik@abc.com... Recipient ok
>> DATA
<< 354 Enter mail, end with "." on a line by itself
>> <message data>
<< 250 2.0.0 r6C1Vh101169 Message accepted for delivery
>> QUIT
<< 221 2.0.0 equity.csfb.com closing connection

调试选项的输出。调试输出中不存在标题信息。

> sendmail("toto@abc.com", to, "test", "testing", header=header,control=list(smtpServer=server,transport="debug"))
From: toto@abc.com
To: vasudeva.naik@abc.com
Subject: test
Date: Mon, 15 Jul 2013 02:15:29 -0000
MIME-Version: 1.0
Content-Type: multipart/mixed;             boundary="1a556aa6576e231876dabb67e5a4f58730d3a228654e14705503b6985a6a6707"

This is a message with multiple parts in MIME format.
--1a556aa6576e231876dabb67e5a4f58730d3a228654e14705503b6985a6a6707
Content-Type: text/plain; format=flowed

testing
--1a556aa6576e231876dabb67e5a4f58730d3a228654e14705503b6985a6a6707--

感谢。

5 个答案:

答案 0 :(得分:3)

您需要合并所有真正的收件人,并将电子邮件分别发送给每个收件人。 CC只是信息性的;把它留下来,你得到BCC所以,例如:

to <- c("vasudeva.naik@abc.com")  # addresses for the "To" header
cc <- c("alok.jadhav@abc.com")    # addresses for the "CC" header
bcc <- c("...")                   # more addresses, but these won't be visible anywhere

recipients <- c(to, cc, bcc)  # need to send the email to everyone (FIXME: drop duplicates)
header <- list(cc=cc)         # let everyone know who else gets the mail

x <- sendmail("toto@abc.com", recipients, "test", "testing", header=header, control=list(smtpServer=server,verbose=TRUE))

如果您想要To标题中的所有地址,则可以使用header <- list(to=to)代替。

注意,上面是未经测试的。应该在理论上工作,但sendmailR可能有其他计划处理一些论点。


详细说明我之前的评论。发送电子邮件有两个部分,SMTP是用于将邮件传递给收件人的协议,以及邮件内容本身。

处理交付的SMTP看起来像:

MAIL FROM: toto@abc.com
RCPT TO: vasudeva.naik@abc.com
DATA
<message content here, see below>
.

请注意,此处FROMTO匹配sendmail()函数的参数。这决定了谁收到邮件。

现在,消息内容(好吧,只是标题)看起来像这样:

From: no-reply@example.com
To: everyone@example.com
CC: everyone-else@example.com

是的,FromTo与之前完全不同。这是收件人获取和看到的内容,但它与实际收​​到电子邮件的人无关。这就是为什么收件箱中的垃圾邮件会显示为您发送给其他人的内容,即使您是真正的收件人。

答案 1 :(得分:3)

问题是由参数header而非headers的使用引起的。然而,正如人们可能认为的那样,并不是那种愚蠢的错字。我们知道,我们可以在调用函数时缩写参数名称:

myfun <- function(xx = 1) print(xx)
myfun(x = 2)
# [1] 2

拥有...

时也可以
myfun <- function(xx = 1, ...) print(xx)
myfun(x = 2)
[1] 2

但在这种情况下,我们有一个不同且不常见的参数顺序:

sendmail(from, to, subject, msg, ..., headers = list(), control = list())

这不足为奇地引起了这样的问题:

myfun <- function(..., yy = 1) print(yy)
myfun(y = 2)
[1] 1

答案 2 :(得分:2)

尝试:

> for (to in recipients) {
+ sendmail(from, to, subject, msg, control...

答案 3 :(得分:2)

几种可能性(未经测试):

  1. 将收件人列表作为邮件正文中的第一行。相当笨重,但它的工作原理。我实际上看到这是用Bcc:字段完成的(它击败了Bcc:但不记得了)。

  2. to参数设为包含所有收件人的单个字符串,而不是邮件收件人的矢量,以逗号分隔。

答案 4 :(得分:1)

之前我遇到过这个问题,很想知道一个更直接的解决方案,但我解决它的方法是创建一个分发列表并将一封邮件发送到分发列表。这样每个人都可以看到并且可以回复所有列表。希望这能解决你的问题。