向多个收件人发送电子邮件,而不透露其他收件人

时间:2010-12-01 00:20:05

标签: java email javamail

我正在使用javamail将电子邮件发送到收件人列表,但不希望他们能够看到其他人收到了电子邮件。我也不想使用BCC发送它,因为用户甚至没有在TO列表中看到自己。我认为这段代码会这样做,但它会显示TO列表中的所有收件人。除了创建循环并一次发送一封电子邮件之外,还有其他方法吗?

(注意:recipients []是一个包含电子邮件地址的字符串数组。)

javax.mail.internet.InternetAddress[] addressTo = new javax.mail.internet.InternetAddress[recipients.length];

for (int i = 0; i < recipients.length; i++)
{
    addressTo[i] = new javax.mail.internet.InternetAddress(recipients[i]);
}

msg.setRecipients(javax.mail.Message.RecipientType.TO, addressTo); 

9 个答案:

答案 0 :(得分:16)

不,没有办法用电子邮件做到这一点。

您必须明确构建并发送由每个收件人迭代的电子邮件,其中一个是addressTo阵列的唯一成员。

答案 1 :(得分:7)

SMTP协议不关心邮件中列出的人员,并且RCPT TO命令中指定的收件人仅用于确定将邮件传输到的人员。没有什么可以阻止您使用To标头构建RFC822消息,如上所述,然后编写一个自定义SMTP客户端,将您的特定消息发送出去但使用不同的收件人集。只是因为你可以发送邮件并不意味着一路上的垃圾邮件过滤器会注意到不稳定的收件人标题并阻止邮件。

根据我的经验,JavaMail的SMTP客户端非常擅长发送基本邮件,而没有您经常看到邮件列表提供商和垃圾邮件发送者使用的任何邮件技巧。这些公司花了很多精力确保他们能够以他们想要的方式发送消息,但他们也在不断努力确保他们的消息被视为合法的电子邮件。

简短回答:我会求助于BCC,如果这是出于营销目的,请考虑使用专门从事此类事务的公司。

答案 2 :(得分:2)

为什么你担心收件人没有看到自己的地址?他已经知道了他自己的地址,为什么这是一个问题呢? BCC旨在处理您描述的问题。它已存在数十年了。听起来很完美。

答案 3 :(得分:2)

实际上,我们不必为Multi Recepients手动创建InternetAddress对象。 InternetAddress api提供了一个parse()方法来为我们执行此操作。 示例代码如下,

msg.setRecipients(Message.RecipientType.TO,  InternetAddress.parse(toAddress));

如果toAddress包含多个(逗号)分隔的电子邮件地址,则此处parse方法会创建多个InternetAddress对象。

检查以下API以获取更多详细信息。

http://docs.oracle.com/javaee/6/api/javax/mail/internet/InternetAddress.html#parse(java.lang.String)

快乐编码。 :)

答案 4 :(得分:1)

试试这个:

Session session = Session.getInstance(properties);
Transport transport = session.getTransport("smtp");
String recipient = "ex1@mail.com,ex2@mail.";
String[] recipients = recipient.split(",");
transport.connect(server, username, password);

for (String to : recipients) {

   Message message = new MimeMessage(session);
   message.setFrom(new InternetAddress(from));
   InternetAddress[] address = {new InternetAddress(to)};
   message.setRecipients(Message.RecipientType.TO, address);

   message.setSubject(subject);
   message.setText(body);
   message.setContent(body, "text/plain");
   message.saveChanges();
   transport.sendMessage(message, address);

}

transport.close();

答案 5 :(得分:0)

作为Message.RecipientType,你应该使用Message.RecipientType.BCC不向每个收件人显示每个地址

Google关键字:Java Mail BCC

答案 6 :(得分:0)

您可以通过设置以下代码来执行此操作

 foreach (var rec in vSummaryResults.Values)
    {
        // At this point we have access to each individual List<DataRecord>
    foreach(var SingleDataRecordObj in rec)

     Console.WriteLine(ingleDataRecordObj.membervariablename)
      //From here we are able to list the individual variable member names      of values that are in the DataRecord data type, showing all of the information in each list that is stored in the values of the dictionary

    }

而不是

message.setRecipients(Message.RecipientType.BCC, toAddrs);

答案 7 :(得分:0)

将您的会话创建放在循环中。它将为每个用户创建会话,但 时间很复杂。

答案 8 :(得分:-1)

根据javax.mail.Transport的文档:

public static void send(Message msg,
                        Address[] addresses)
                 throws MessagingException

Send the message to the specified addresses, ignoring any recipients specified
in the message itself.

因此,您应该能够将数组参数中的实际传递地址(RCPT TO地址)放到Transport.send,同时通过Message.setRecipient放置您希望收件人在邮件标题中看到的内容, MIMEMessage.addHeader等等。

如果您希望不同的用户组能够看到不同的内容,则必须为每个用户构建并发送单独的消息。