繁体   English   中英

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

[英]Is it possible to cc recipients using sendmail in 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--

谢谢。

您需要合并所有真实的收件人,并将电子邮件分别发送给每个收件人。 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是消息的内容本身。

处理传递的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与之前的完全不同。 这是收件人收到和看到的内容 ,但与实际收到电子邮件的人无关。 这就是为什么收件箱中的垃圾邮件会显示为已发送给其他人的内容,即使您是实际的收件人也是如此。

该问题是由于使用参数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

尝试:

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

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

  1. 将收件人列表作为邮件正文的第一行。 有点笨拙,但可以。 实际上,我已经用“密件抄送:”字段完成了此操作(这破坏了“密件抄送:”的意思,但不要紧)。

  2. 代替邮件收件人的向量,将to参数设为包含所有收件人的单个字符串,并用逗号分隔。

我以前曾遇到过这个问题,很想知道一个更直接的解决方案,但是我解决的方法是创建一个通讯组列表,然后向该通讯组列表发送一封邮件。 这样,每个人都可以看到并可以将所有回复到列表。 希望这能解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM