Ответ 1
Нет, нет способа сделать это с помощью электронной почты.
Вы должны явно создавать и отправлять итерации по электронной почте каждым из ваших получателей, один из которых является единственным членом вашего массива addressTo
.
Я использую 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, используются только для определения того, кому отправлять сообщение. Там ничего не мешает вам строить сообщение RFC822 с заголовком To, как вы определили выше, а затем писать пользовательский SMTP-клиент, который отправляет ваше конкретное сообщение, но с другим набором получателей. И только потому, что вы можете отправить сообщение, не означает, что спам-фильтр по пути будет замечать заголовки получателей и блокировать сообщение.
По моему опыту, JavaMail SMTP-клиент действительно хорош в отправке основных сообщений без каких-либо почтовых трюков, которые вы часто видели, используемыми поставщиками списков рассылки и спамерами. Эти компании прилагают много усилий, чтобы удостовериться, что они могут отправлять сообщения так, как они хотят, но они также постоянно борются за то, чтобы убедиться, что они являются сообщениями как законными.
Короткий ответ: я бы прибегнул к BCC, и если это для маркетинговых целей, подумайте о том, чтобы использовать компанию, которая специализируется на таких вещах.
Почему вы обеспокоены тем, что получатель не видит свой адрес? Он уже знает свой собственный адрес, так почему это проблема? BCC был разработан так, чтобы точно описать проблему, которую вы описываете. Это было в течение десятилетий и звучит как идеальная подгонка.
На самом деле нам не нужно вручную создавать объекты InternetAddress для Multi Recepients. InternetAddress api предоставляет метод parse() для этого. Пример кода для этого, как показано ниже,
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddress));
Здесь метод parse создает несколько объектов InternetAddress, если toAddress содержит несколько адресов электронной почты, разделенных запятой.
Для получения более подробной информации ознакомьтесь с нижеприведенным API.
Счастливое кодирование.:)
Попробуйте следующее:
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();
В соответствии с документацией для 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
, и др.
Если вы хотите, чтобы разные наборы пользователей видели разные вещи, вам нужно будет создать и отправить отдельное сообщение для каждого набора.
как Message.RecipientType, вы должны использовать Message.RecipientType.BCC, чтобы не показывать каждый адрес для каждого получателя
Ключевые слова Google: Java Mail BCC
Вы можете сделать это, установив код ниже
message.setRecipients(Message.RecipientType.BCC, toAddrs);
вместо
message.setRecipients(Message.RecipientType.TO, toAddrs);