2010-12-01 34 views
18

Estoy usando javamail para enviar correos electrónicos a una lista de destinatarios, pero no quiero que puedan ver quién más recibió el correo electrónico. Tampoco quiero enviarlo usando BCC ya que el usuario ni siquiera se ve a sí mismo en la lista TO. Pensé que este código lo haría, pero muestra todos los destinatarios en la lista TO. Además de crear un bucle y enviar los correos electrónicos de a uno por vez, ¿hay alguna otra manera de hacerlo?Enviar por correo electrónico destinatarios múltiples sin revelar otros destinatarios

(NOTA:. Destinatarios [] es una matriz de cadenas que contiene las direcciones de correo electrónico)

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

Respuesta

15

No, no hay una manera de hacer esto con el correo electrónico.

Tiene que crear explícitamente y enviar un correo electrónico iterativo por cada uno de sus destinatarios, uno de ellos como único miembro de su matriz addressTo.

+3

+1 personas en una lista de correo esperan ver la dirección de la lista en el encabezado "To". Las personas suscritas para los correos electrónicos de "ofertas promocionales especiales" no se preocupan por lo que está en el encabezado "para". Si quieres mantenerlo como algo personal, entonces no lo entiendes. La gente puede sentir cuando un correo electrónico es copiar/pegar en masa enviar BS. Si lo hace bien, el contenido de su mensaje contendrá al menos una variable de $ nombre de usuario y luego deberá enviarla de 1 en 1. –

+0

Así me sentí con respecto a BCC, se ve menos personal cuando no hay nada en el cuadro TO. Así que esperaba mantenerme alejado de eso. – Don

+0

Esta respuesta es incorrecta. Ver mi respuesta del 29 de junio de 2012. –

7

Al protocolo SMTP no le importa quién aparece en la lista en el mensaje y los destinatarios especificados en el comando RCPT TO solo se utilizan para averiguar a quién transportar el mensaje. No hay nada que le impida construir el mensaje RFC822 con el encabezado A como lo definió anteriormente y luego escribir un cliente SMTP personalizado que envíe su mensaje particular pero con un conjunto diferente de destinatarios. Y solo porque puede enviar el mensaje no significa que un filtro de correo no deseado en el camino va a notar los encabezados de los destinatarios wonky y bloquear el mensaje.

En mi experiencia, el cliente SMTP de JavaMail es realmente bueno en el envío de mensajes básicos sin ninguno de los trucos de correo electrónico que a menudo utilizan los proveedores de listas de correo y spammers. Esas compañías se esfuerzan mucho para asegurarse de que puedan enviar mensajes de la manera que quieran, pero también están en una lucha constante para asegurarse de que sus mensajes sean tratados como correos legítimos.

Respuesta corta: recurriría a BCC y si esto es para fines de comercialización, considere utilizar una empresa que se especialice en este tipo de cosas.

+0

+1. Si se omite el encabezado "A", muchos clientes de correo dirán algo así como "Destinatarios no divulgados" en el campo "Para" en el cliente. Además, creo que es increíble que mi upvote hizo que tu representante se convirtiera en 822. – Jeremy

+1

+1 - y tenga en cuenta que la API de JavaMail * es * capaz de configurar los destinatarios de RCPT TO independientemente de los encabezados de los mensajes. Ver mi respuesta –

2

¿Por qué le preocupa que el destinatario no vea su propia dirección? Él ya sabe su propia dirección, entonces ¿por qué es un problema? BCC fue diseñado para manejar exactamente el problema que describes. Ha existido por décadas & suena como un ajuste perfecto.

+0

Porque leí sobre problemas con BCC, que hay formas de ver en los encabezados, etc. También que algunos proveedores de correo electrónico solo pueden manejar algunas direcciones en BCC. – Don

0

De acuerdo con la documentación de 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. 

por lo que debería ser capaz de poner las direcciones de entrega reales (RCPT TO direcciones) en el argumento de matriz a Transport.send, mientras que poner lo que quieran los destinatarios para ver en las cabeceras de los mensajes a través de Message.setRecipient, MIMEMessage.addHeader, etc.

Si desea diferentes grupos de usuarios para ver cosas diferentes, tendrá que construir y enviar un mensaje separado para cada conjunto.

+1

El OP quiere que cada destinatario individual vea SOLAMENTE su dirección en el encabezado TO. Si el OP siguiera sus consejos, el tamaño establecido para la cantidad de destinatarios de cada correo electrónico sería siempre 1. Al final del día, no hay forma de enviar un solo correo electrónico masivo que se vea diferente para cada destinatario. –

2

En realidad, no es necesario crear manualmente objetos InternetAddress para Multi Recepients. InternetAddress api proporciona un método parse() para hacer esto por nosotros. Muestra código de esto es como abajo,

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

Aquí analizar método crea múltiples objetos InternetAddress si a dirección contiene múltiples direcciones de email separadas por, (coma).

Consulte a continuación API para obtener más detalles.

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

Codificación feliz. :)

0

como Message.RecipientType que puedes usar a Message.RecipientType.BCC no muestra la dirección de cada destinatario a cada

Google Palabras clave: Java Mail BCC

0

Puede hacerlo estableciendo el código como a continuación

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

en lugar de

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

OP mencionó que no quiere usar BCC. – 16dots

1

probar este :

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