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

我正在使用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); 

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

您必须显式构建并发送由每个收件人迭代的电子邮件,其中一个作为addressTo数组的唯一成员。

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

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

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

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

实际上,我们不必为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)

快乐的编码。 🙂

尝试这个:

 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(); 

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

Google关键字:Java Mail BCC

您可以通过设置如下代码来完成此操作

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

代替

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

根据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.setRecipientMIMEMessage.addHeader等将您希望收件人在邮件头中看到的内容放入其中。

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