【问题标题】:Email multiple recipients without revealing other recipients在不透露其他收件人的情况下向多个收件人发送电子邮件
【发布时间】:2011-05-18 05:35:18
【问题描述】:

我正在使用 javamail 向收件人列表发送电子邮件,但不希望他们能够看到还有谁收到了电子邮件。我也不想使用密件抄送发送它,因为那时用户甚至在 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); 

【问题讨论】:

    标签: java email jakarta-mail


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

        【解决方案3】:

        您可以通过如下设置代码来做到这一点

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

        而不是

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

        【讨论】:

        • OP 提到他不想使用密件抄送。
        【解决方案4】:

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

        Google 关键字:Java 邮件密件抄送

        【讨论】:

          【解决方案5】:

          实际上,我们不必为 Multi Recepient 手动创建 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)

          快乐编码。 :)

          【讨论】:

            【解决方案6】:

            根据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 将您希望收件人看到的任何内容放入邮件标题中,等等

            如果您希望不同组的用户看到不同的东西,您将必须为每组构建并发送单独的消息。

            【讨论】:

            • OP 希望每个单独的收件人在 TO 标头中只看到他们的地址。如果 OP 遵循您的建议,则每封电子邮件的收件人数量的设置大小将始终为 1。归根结底,没有办法发送一封对每个收件人看起来都不同的批量电子邮件。
            【解决方案7】:

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

            【讨论】:

            • 因为我读到了密件抄送的问题,有一些方法可以在标题等中看到。另外,一些电子邮件提供商只能处理密件抄送中的几个地址。
            【解决方案8】:

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

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

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

            【讨论】:

            • +1。如果省略了“收件人”标头,那么许多邮件客户端会在客户端的“收件人”字段中显示“未公开收件人”之类的内容。另外,我觉得我的点赞让你的代表变成 822 真是太棒了!
            • +1 -- 请注意,JavaMail API 能够独立于邮件头设置 RCPT TO 收件人。看我的回答。
            【解决方案9】:

            不,没有办法通过电子邮件执行此操作。

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

            【讨论】:

            • +1 邮件列表中的人希望在“收件人”标题中看到邮件列表地址。订阅“特别促销优惠”电子邮件的人并不关心“收件人”标题中的内容。如果你想让它保持个人化,那么你就没有得到它。人们可以感觉到电子邮件何时被复制/粘贴批量发送 BS。如果您操作正确,您的消息内容将包含至少一个 $username 变量,然后您必须一一发送。
            • 这就是我对 BCC 的感受,当 TO 框中没有任何内容时,它看起来不那么个人化。所以我希望远离那个。
            • @TimBender:尽管邮件已发送到用户的地址,但用户在“收件人:”标题中看到邮件列表地址,这正是 OP 正在尝试做的事情。你认为邮件列表守护进程是做什么的?
            • 大声笑@Maxy-B,它绝对不会在交货前将每个收件人的地址单独放在“收件人:”标题中,这样每个收件人只能看到自己的地址。
            猜你喜欢
            • 2012-05-18
            • 1970-01-01
            • 2017-12-05
            • 2015-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多