Отправить несколько получателей по электронной почте, не раскрывая других получателей - PullRequest
19 голосов
/ 01 декабря 2010

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

(ПРИМЕЧАНИЕ: receients [] - массив строк, содержащий адреса электронной почты.)

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

Ответы [ 8 ]

16 голосов
/ 01 декабря 2010

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

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

7 голосов
/ 01 декабря 2010

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

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

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

2 голосов
/ 22 апреля 2014

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

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

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

Проверьте API ниже для получения дополнительной информации.

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

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

2 голосов
/ 01 декабря 2010

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

1 голос
/ 06 апреля 2016

Попробуйте это:

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();
0 голосов
/ 03 марта 2016

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

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

вместо

message.setRecipients(Message.RecipientType.TO, toAddrs);
0 голосов
/ 22 февраля 2015

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

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

0 голосов
/ 30 июня 2012

Согласно документации для 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 и т. д.

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

...