Подтвердить что ты не робот

Отправляйте адреса электронной почты нескольким получателям без выявления других получателей.

Я использую 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); 
4b9b3361

Ответ 1

Нет, нет способа сделать это с помощью электронной почты.

Вы должны явно создавать и отправлять итерации по электронной почте каждым из ваших получателей, один из которых является единственным членом вашего массива addressTo.

Ответ 2

Протокол SMTP не заботится о том, кто указан в сообщении, а получатели, указанные в команде RCPT TO, используются только для определения того, кому отправлять сообщение. Там ничего не мешает вам строить сообщение RFC822 с заголовком To, как вы определили выше, а затем писать пользовательский SMTP-клиент, который отправляет ваше конкретное сообщение, но с другим набором получателей. И только потому, что вы можете отправить сообщение, не означает, что спам-фильтр по пути будет замечать заголовки получателей и блокировать сообщение.

По моему опыту, JavaMail SMTP-клиент действительно хорош в отправке основных сообщений без каких-либо почтовых трюков, которые вы часто видели, используемыми поставщиками списков рассылки и спамерами. Эти компании прилагают много усилий, чтобы удостовериться, что они могут отправлять сообщения так, как они хотят, но они также постоянно борются за то, чтобы убедиться, что они являются сообщениями как законными.

Короткий ответ: я бы прибегнул к BCC, и если это для маркетинговых целей, подумайте о том, чтобы использовать компанию, которая специализируется на таких вещах.

Ответ 3

Почему вы обеспокоены тем, что получатель не видит свой адрес? Он уже знает свой собственный адрес, так почему это проблема? BCC был разработан так, чтобы точно описать проблему, которую вы описываете. Это было в течение десятилетий и звучит как идеальная подгонка.

Ответ 4

На самом деле нам не нужно вручную создавать объекты InternetAddress для Multi Recepients. InternetAddress api предоставляет метод parse() для этого. Пример кода для этого, как показано ниже,

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

Здесь метод parse создает несколько объектов InternetAddress, если toAddress содержит несколько адресов электронной почты, разделенных запятой.

Для получения более подробной информации ознакомьтесь с нижеприведенным API.

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

Счастливое кодирование.:)

Ответ 5

Попробуйте следующее:

Session session = Session.getInstance(properties);
Transport transport = session.getTransport("smtp");
String recipient = "[email protected],[email protected]";
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();

Ответ 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.setRecipient, MIMEMessage.addHeader, и др.

Если вы хотите, чтобы разные наборы пользователей видели разные вещи, вам нужно будет создать и отправить отдельное сообщение для каждого набора.

Ответ 7

как Message.RecipientType, вы должны использовать Message.RecipientType.BCC, чтобы не показывать каждый адрес для каждого получателя

Ключевые слова Google: Java Mail BCC

Ответ 8

Вы можете сделать это, установив код ниже

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

вместо

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