web-dev-qa-db-fra.com

Envoyer plusieurs destinataires sans révéler d'autres destinataires

J'utilise javamail pour envoyer des emails à une liste de destinataires, mais je ne veux pas qu'ils puissent voir qui d'autre a reçu l'email. Je ne veux pas non plus l'envoyer en utilisant BCC, car l'utilisateur ne se voit même pas dans la liste TO. Je pensais que ce code le ferait, mais il montre tous les destinataires de la liste TO. Outre la création d'une boucle et l'envoi des emails un à la fois, existe-t-il un autre moyen de le faire?

(REMARQUE: les destinataires [] sont un tableau de chaînes contenant les adresses électroniques.)

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

Non, il n'y a pas moyen de faire cela avec le courrier électronique. 

Vous devez explicitement créer et envoyer un courrier électronique itératif par chacun de vos destinataires, l'un d'eux étant l'unique membre de votre tableau addressTo.

16
Camilo Díaz Repka

Le protocole SMTP ne se soucie pas de savoir qui est répertorié dans le message et les destinataires spécifiés dans la commande RCPT TO servent uniquement à déterminer à qui transférer le message. Rien ne vous empêche de créer le message RFC822 avec l'en-tête To comme vous l'avez défini ci-dessus, puis d'écrire un client SMTP personnalisé qui envoie votre message particulier mais avec un ensemble de destinataires différent. Et ce n'est pas parce que vous pouvez envoyer le message qu'un filtre anti-spam remarquera les en-têtes des destinataires et bloque le message.

D'après mon expérience, le client SMTP de JavaMail est vraiment efficace pour envoyer des messages simples sans les astuces de messagerie que vous voyez souvent utilisées par les fournisseurs de listes de diffusion et les spammeurs. Ces entreprises dépensent beaucoup d’efforts pour s’assurer qu’elles peuvent envoyer des messages comme elles le souhaitent, mais elles se battent constamment pour que leurs messages soient traités comme des courriels légitimes.

Réponse courte: Je ferais appel à BCC et, si c'est à des fins de marketing, envisagez de faire appel à une entreprise spécialisée dans ce genre de choses.

7
dhable

En fait, nous n'avons pas besoin de créer manuellement des objets InternetAddress pour les multi-destinataires . InternetAddress api fournit une méthode parse () pour le faire pour nous . Un exemple de code est le suivant:

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

Ici, la méthode d'analyse crée plusieurs objets InternetAddress si toAddress contient plusieurs adresses électroniques séparées par une virgule.

Vérifiez ci-dessous API pour plus de détails.

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

Bonne codage. :)

2
Manjunath D R

Pourquoi craignez-vous que le destinataire ne voie pas sa propre adresse? Il connaît déjà sa propre adresse, alors pourquoi est-ce un problème? BCC a été conçu pour traiter exactement le problème que vous décrivez. Il existe depuis des décennies et semble être un ajustement parfait.

2
aksarben

Essaye ça:

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

en tant que Message.RecipientType, vous devez utiliser Message.RecipientType.BCC pour ne pas afficher l'adresse chaque à chaque destinataire

Mots-clés Google: Java Mail BCC

0
titi

Vous pouvez le faire en définissant le code comme ci-dessous

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

au lieu de

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