Enviar correo a múltiples destinatarios en Java

6 minutos de lectura

avatar de usuario
Prateek

Quiero enviar un mensaje a varios Destinatarios utilizando el siguiente 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.example,abc@def.example,ghi@abc.example");

O

mensaje.addRecipient(Message.RecipientType.CC, “abc@abc.example;abc@def.example;ghi@abc.example”);

También puedo enviar un mensaje usando 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?

  • Demasiadas de las respuestas son respuestas de “pruebe esto” sin ninguna explicación (por ejemplo, perder la intención (el pensamiento detrás de esto), la esencia, las limitaciones, el sistema probado (incluidas las versiones), etc.) y tienen muy poco valor. ¿Qué pasa si no funcionan por algún motivo (por ejemplo, debido a dependencias de la versión oa un contexto particular)? Si va a agregar una nueva respuesta, no solo descargue un código sin explicación. Gracias por adelantado.

    -Peter Mortensen

    21 de mayo a las 20:18


  • El Centro de ayuda dice: “…explica siempre por qué la solución que presentas es apropiada y cómo funciona”.

    -Peter Mortensen

    21 de mayo a las 20:19

avatar de usuario
Aviram Segal

si invocas addRecipient varias veces, agregará el destinatario dado a la lista de destinatarios del momento dado (TO, CCy CCO).

Por ejemplo:

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

Agregará las tres direcciones a CC.


Si desea agregar todas las direcciones a la vez, debe usar setRecipients o addRecipients y proporcionarle una serie de direcciones

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

También puedes usar InternetAddress.parse para analizar una lista de direcciones:

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

  • En realidad, mi pregunta es específicamente sobre un método en particular.

    – Prateek

    13 de diciembre de 2012 a las 6:42

  • o usas addRecipient/setRecipient con una sola dirección o addRecipients/setRecipients con una serie de direcciones

    – Aviram Segal

    13 de diciembre de 2012 a las 6:53

  • javax.mail la versión 1.5.5 no tiene InternetAddress.parse() que regresa String. Todos los métodos de análisis devuelven una matriz y, por lo tanto, no son adecuados para addRecipient. ¿Hay otra(s) versión(es) que tenga tal método?

    – yurin

    16 de enero de 2017 a las 8:42


  • Cuando tengas javax.mail versión 1.5.5 o mayor donde no tienes InternetAddress.parse() que vuelve sola InternetAddress pero solo el que vuelve InternetAddress[] (matriz) puede usar el la primera solucion tener ... 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.

    – lucas

    22 de junio de 2017 a las 11:03

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

    – pila0114106

    9 de agosto de 2019 a las 10:42

avatar de usuario
G K

Este código está funcionando para mí. Intente con esto para enviar correo a múltiples 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);

avatar de usuario
leyo

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

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

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

Funciona bien con una sola dirección también:

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

avatar de usuario
El asistente de PC

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

avatar de usuario
usuario3734721

Prueba de esta manera:

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

avatar de usuario
Esteban Ostermiller

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

(,)secuencia de direcciones separadas por comas

javax.correo – 1.4.7 parse(String[]) No se permite. Así que tenemos que dar una secuencia de direcciones separadas por comas en InternetAddress objetos. Las direcciones deben seguir la sintaxis RFC822.

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

(;) secuencia de direcciones separadas por punto y coma « Si un grupo de lista de direcciones se proporciona con un delimitador como “;”, luego conviértalo en una matriz de cadenas usando el separar método para usar la siguiente función.

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

String toGroup = "mail@mail.example;mail2@mail.example";
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 SimpleEmailcommons-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.example", "Yash");
    String[] toAddressList = { "mail@mail.example", "mail2@mail.example" }
    email.addTo(addressList);

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

avatar de usuario
Esteban Ostermiller

Así que… tomó muchos meses, pero aun así… Puede enviar correos electrónicos a múltiples destinatarios usando el ‘,’ como separador y

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

está bien Al menos en JavaMail 1.4.5

¿Ha sido útil esta solución?