Enviar correo a varios destinatarios en java


80

Quiero enviar un mensaje a varios destinatarios siguiendo el método:

message.addRecipient(Message.RecipientType.TO, String arg1);

O

message.setRecipients(Message.RecipientType.TO,String arg1);

Pero una confusión es que en el segundo argumento, cómo pasar múltiples direcciones como:

message.addRecipient(Message.RecipientType.CC, "abc@abc.com,abc@def.com,ghi@abc.com");

O

message.addRecipient(Message.RecipientType.CC, "abc@abc.com;abc@def.com;ghi@abc.com");

También puedo enviar un mensaje utilizando métodos alternativos, pero quiero saber el propósito del método anterior. Si no puedo usarlo (ya que hasta ahora no tengo ninguna respuesta para el requisito anterior), entonces, ¿cuál es la necesidad de que este método esté en la API de correo?

Respuestas:


113

Si lo invoca addRecipientvarias veces, se agregará el destinatario dado a la lista de destinatarios del momento dado (TO, CC, BCC)

Por ejemplo:

message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("abc@abc.com"));
message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("abc@def.com"));
message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("ghi@abc.com"));

Agregará las 3 direcciones a CC


Si desea agregar todas las direcciones a la vez, debe usar setRecipientso addRecipientsy proporcionarle una serie de direcciones

Address[] cc = new Address[] {InternetAddress.parse("abc@abc.com"),
                               InternetAddress.parse("abc@def.com"), 
                               InternetAddress.parse("ghi@abc.com")};
message.addRecipients(Message.RecipientType.CC, cc);

También puede utilizar InternetAddress.parsepara analizar una lista de direcciones

message.addRecipients(Message.RecipientType.CC, 
                      InternetAddress.parse("abc@abc.com,abc@def.com,ghi@abc.com"));

1
En realidad, mi pregunta se refiere específicamente a un método en particular.
Prateek

2
o usa addRecipient/ setRecipientcon una sola dirección o addRecipients/ setRecipientscon una matriz de direcciones
Aviram Segal

3
javax.mailla versión 1.5.5 no tiene InternetAddress.parse()devoluciones String. Todos los métodos de análisis devuelven una matriz y, por lo tanto, no son adecuados para addRecipient. ¿Hay otras versiones que tengan dicho método?
yurin

2
Cuando tiene una javax.mailversión 1.5.5o superior donde no tiene InternetAddress.parse()que devuelve solo, InternetAddresspero solo la que devuelve InternetAddress[](matriz), puede usar la primera solución que tenga ... message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("abc@def.com")[0]); ... ([0] es importante allí) . En la segunda solución: ... new Address[] {InternetAddress.parse("abc@abc.com")[0], ... la tercera solución debería funcionar sin cambios. Por supuesto, [0] al final debe aplicarse a todas las direcciones en cada solución.
luke

1
@luke .. gracias, he estado luchando por un tiempo .. y tu comentario me ayudó.
stack0114106

29

Hola a todos, este código me funciona, intente con esto para enviar correo a varios destinatarios

private String recipient = "yamabs@gmail.com ,priya@gmail.com ";
String[] recipientList = recipient.split(",");
InternetAddress[] recipientAddress = new InternetAddress[recipientList.length];
int counter = 0;
for (String recipient : recipientList) {
    recipientAddress[counter] = new InternetAddress(recipient.trim());
    counter++;
}
message.setRecipients(Message.RecipientType.TO, recipientAddress);

12

Prueba de esta manera:

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("mail3@mail.com"));
String address = "mail@mail.com,mail2@mail.com";
InternetAddress[] iAdressArray = InternetAddress.parse(address);
message.setRecipients(Message.RecipientType.CC, iAdressArray);

12

Simplemente use el método message.setRecipients con varias direcciones separadas por comas:

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("abc@abc.com,abc@def.com,ghi@abc.com"));

message.setRecipients(Message.RecipientType.CC, InternetAddress.parse("abc@abc.com,abc@def.com,ghi@abc.com"));

también funciona bien con una sola dirección

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("abc@abc.com"));

11

Puede tener varias direcciones separadas por comas

if (cc.indexOf(',') > 0)
    message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));   
else
    message.setRecipient(Message.RecipientType.CC, new InternetAddress(cc));

1
¿Por qué no usarías InternetAddress.parse()para ambos? (Y sí, sé que esto tiene 4 años)
Sean Bright

2
@seanbright sí, puede hacer que la primera declaración omita la condición if else por completo. setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));debería funcionar incluso si solo hay una dirección. Es solo una forma personal de programación para aumentar la legibilidad.
ThePCWizard

6

Entonces ... tomó muchos meses, pero aún así ... Puede enviar correos electrónicos a múltiples destinatarios usando ',' como separador y

message.setRecipients(Message.RecipientType.CC, "abc@abc.com,abc@def.com,ghi@abc.com");

está bien. Al menos en JavaMail 1.4.5


5

InternetAddress.Parse va a ser tu amigo! Vea el ejemplo trabajado a continuación:

String to = "med@joe.com, maz@frank.com, jezz@jam.com";
String toCommaAndSpaces = "med@joe.com maz@frank.com, jezz@jam.com";
  1. Analice una lista de direcciones de correo electrónico separadas por comas. Ser estricto. Requiere lista separada por comas.
  2. Si estricto es verdadero, se aplican muchas (pero no todas) las reglas de sintaxis RFC822 para correos electrónicos.

    msg.setRecipients(Message.RecipientType.CC,
    InternetAddress.parse(to, true));
    
  3. Analizar lista separada por comas / espacios. Corte algo de holgura. También permitimos espacios en la lista separada, además de formatos de correo electrónico no válidos.

    msg.setRecipients(Message.RecipientType.BCC,
    InternetAddress.parse(toCommaAndSpaces, false));
    

4
String[] mailAddressTo = new String[3];    
mailAddressTo[0] = emailId_1;    
mailAddressTo[1] = emailId_2;    
mailAddressTo[2] = "xyz@gmail.com";

InternetAddress[] mailAddress_TO = new InternetAddress[mailAddressTo.length];

for (int i = 0; i < mailAddressTo.length; i++)
{
    mailAddress_TO[i] = new InternetAddress(mailAddressTo[i]);
}

message.addRecipients(Message.RecipientType.TO, mailAddress_TO);ress_TO = new InternetAddress[mailAddressTo.length]; 

4

Formato de dirección de correo electrónico de Internet ( RFC 822)

(,)secuencia de direcciones separada por comas

javax.mail - 1.4.7 parse( String[] )no está permitido. Entonces tenemos que dar una secuencia de direcciones separada por comas en InternetAddressobjetos. Las direcciones deben seguir la sintaxis RFC822.

String toAddress = "mail@mail.com,mail2@mail.com";
InternetAddress.parse( toAddress );

(;)secuencia de direcciones separada por punto y coma «Si el grupo de la lista de direcciones se proporciona con delimitador como"; " luego conviértalo a una matriz de cadenas usando el método de división para usar la siguiente función.

String[] addressList = { "mail@mail.com", "mail2@mail.com" };

String toGroup = "mail@mail.com;mail2@mail.com";
String[] addressList2 = toGroup.split(";");

setRecipients(message, addressList);
public static void setRecipients(Message message, Object addresslist) throws AddressException, MessagingException {
    if ( addresslist instanceof String ) { // CharSequence
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse( (String) addresslist  ));
    } else if ( addresslist instanceof String[] ) { // String[] « Array with collection of Strings/
        String[] toAddressList = (String[]) addresslist;
        InternetAddress[] mailAddress_TO = new InternetAddress[ toAddressList.length ];
        for (int i = 0; i < toAddressList.length; i++) {
            mailAddress_TO[i] = new InternetAddress( toAddressList[i] );
        }
        message.setRecipients(Message.RecipientType.TO, mailAddress_TO);
    }
}

Ejemplo completo:

public static Properties getMailProperties( boolean addExteraProps ) {
    Properties props = new Properties();
    props.put("mail.transport.protocol", MAIL_TRNSPORT_PROTOCOL);
    props.put("mail.smtp.host", MAIL_SERVER_NAME);
    props.put("mail.smtp.port", MAIL_PORT);

    // Sending Email to the GMail SMTP server requires authentication and SSL.
    props.put("mail.smtp.auth", true);
    if( ENCRYPTION_METHOD.equals("STARTTLS") ) {
        props.put("mail.smtp.starttls.enable", true);
        props.put("mail.smtp.socketFactory.port", SMTP_STARTTLS_PORT); // 587
    } else {
        props.put("mail.smtps.ssl.enable", true);
        props.put("mail.smtp.socketFactory.port", SMTP_SSL_PORT); // 465
    }
    props.put("mail.smtp.socketFactory", SOCKETFACTORY_CLASS);
    return props;
}

public static boolean sendMail(String subject, String contentType, String msg, Object recipients) throws Exception {

    Properties props = getMailProperties( false );
    Session mailSession = Session.getInstance(props, null);
    mailSession.setDebug(true);

    Message message = new MimeMessage( mailSession );
    message.setFrom( new InternetAddress( USER_NAME ) );

    setRecipients(message, recipients);

    message.setSubject( subject );

    String htmlData = "<h1>This is actual message embedded in HTML tags</h1>";
    message.setContent( htmlData, "text/html");

    Transport transport = mailSession.getTransport( MAIL_TRNSPORT_PROTOCOL );
    transport.connect(MAIL_SERVER_NAME, Integer.valueOf(MAIL_PORT), USER_NAME, PASSWORD);
    message.saveChanges(); // don't forget this

    transport.sendMessage(message, message.getAllRecipients());
    transport.close();
}

Usando Appache SimpleEmail-commons-email-1.3.1

Ejemplo: email.addTo( addressList );

public static void sendSimpleMail() throws Exception {
    Email email = new SimpleEmail();
    email.setSmtpPort(587);

    DefaultAuthenticator defaultAuthenticator = new DefaultAuthenticator( USER_NAME, PASSWORD );

    email.setAuthenticator( defaultAuthenticator );
    email.setDebug(false);
    email.setHostName( MAIL_SERVER_NAME );
    email.setFrom( USER_NAME );
    email.setSubject("Hi");
    email.setMsg("This is a test mail ... :-)");

    //email.addTo( "mail@mail.com", "Yash" );
    String[] toAddressList = { "mail@mail.com", "mail2@mail.com" }
    email.addTo( addressList );

    email.setTLS(true);
    email.setStartTLSEnabled( true );
    email.send();
    System.out.println("Mail sent!");
}

1

Puede utilizar n-número de destinatarios a continuación método:

  String to[] = {"a@gmail.com"} //Mail id you want to send;
  InternetAddress[] address = new InternetAddress[to.length];
  for(int i =0; i< to.length; i++)
  {
      address[i] = new InternetAddress(to[i]);
  }

   msg.setRecipients(Message.RecipientType.TO, address);

Especifiqué un método particular en mi pregunta, quiero enviar usando eso.
Prateek

@Dhinkar, ¿cómo enviar correo a todos los suscriptores con java?
codepro123

1

Si desea enviar como Cc usando MimeMessageHelper

List<String> emails= new ArrayList();
email.add("email1");
email.add("email2");
for (String string : emails) {
message.addCc(string);
}

Lo mismo puede usar para agregar varios destinatarios.


1

Manera fácil de hacer

String[] listofIDS={"ramasamygms@gmail.com","ramasamycse94@gmail.com"};

for(String cc:listofIDS) {
    message.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc));
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.