4

我想从 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--

谢谢。

4

5 回答 5

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>
.

请注意,这里的FROMandTO匹配sendmail()函数的参数。这决定了谁接收邮件。

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

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

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

于 2013-07-12T08:29:24.987 回答
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
于 2013-07-15T11:22:04.417 回答
2

尝试:

> for (to in recipients) {
+ sendmail(from, to, subject, msg, control...
于 2013-07-09T03:58:49.737 回答
2

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

  1. 将收件人列表作为邮件正文的第一行。相当笨重,但它的工作原理。我实际上已经看到使用 Bcc: 字段完成此操作(这违背了 Bcc: 的要点,但不要介意)。

  2. 而不是邮件收件人的向量,让您的to参数是包含所有收件人的单个字符串,用逗号分隔。

于 2013-07-09T06:37:02.107 回答
1

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

于 2013-07-11T18:25:50.657 回答