4

R から複数の受信者に 1 つのメールを送信したいのですが、関数を使用してこれを実現できますが、受信者がメールを受信すると、フィールドsendmailに自分のメール アドレスしか表示されません。tosendmail が内部的にループし、 true ではない各受信者に個々​​のメールを送信するように見えます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 と、メッセージの内容自体の 2 つの部分があります。

配信を処理する SMTP は次のようになります。

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

FROMここのとは、引数を関数TOに一致させることに注意してください。sendmail()これにより、誰がメールを受信するかが決まります。

これで、メッセージの内容 (ヘッダーのみ) は次のようになります。

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

はい、FromToは以前のものとは完全に異なります。これは受信者が取得して表示するものですが、実際に誰が電子メールを受信するかには関係ありません。そのため、受信トレイのスパムは、実際の受信者であっても、他の誰かに送信したものとして表示されます。

于 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 に答える