98 votes

Envoyer du courrier à plusieurs destinataires en Java

Je veux envoyer un message à plusieurs destinataires en utilisant la méthode suivante :

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

Ou

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

Mais une confusion est que dans le deuxième argument, comment passer plusieurs adresses comme :

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

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

Je peux aussi envoyer un message en utilisant d'autres méthodes, mais je veux savoir à quoi sert la méthode ci-dessus.

Si je ne peux pas l'utiliser (car jusqu'à présent, je n'ai pas obtenu de réponse à cette exigence), pourquoi cette méthode doit-elle être intégrée à l'API de messagerie ?

7voto

Yash Points 4565

Format d'adresse électronique Internet ( RFC 822 ):

(,) séquence d'adresses séparées par des virgules

javax.mail - 1.4.7 parse(String[]) n'est pas autorisé. Nous devons donc fournir une séquence d'adresses séparées par des virgules dans le format suivant InternetAddress objets. Les adresses doivent respecter la syntaxe RFC822.

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

(;) séquence d'adresses séparées par des points-virgules " Si un groupe de listes d'adresses est fourni avec le délimiteur " ;", puis converti en un tableau de chaînes de caractères à l'aide de la fonction divisé pour utiliser la fonction suivante.

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

Exemple complet

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

Utilisation d'Appache SimpleEmail - commons-email-1.3.1

Exemple : 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!");
}

6voto

bes67 Points 63

Donc ... ça a pris plusieurs mois, mais quand même ... Vous pouvez envoyer un courrier électronique à plusieurs destinataires en utilisant le ',' comme séparateur et la touche

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

c'est bon. Au moins dans JavaMail 1.4.5.

6voto

Matt Points 159

InternetAddress.Parse va devenir votre ami ! Voir l'exemple travaillé ci-dessous :

String to = "med@joe.com, maz@frank.com, jezz@jam.com";
String toCommaAndSpaces = "med@joe.com maz@frank.com, jezz@jam.com";
  1. Analyse une liste d'adresses électroniques séparées par des virgules. Soyez strict. Exige une liste séparée par des virgules.

  2. Si strict est vrai, beaucoup (mais pas tous) de la RFC822 les règles de syntaxe pour les e-mails sont appliquées.

    msg.setRecipients(Message.RecipientType.CC,
    InternetAddress.parse(to, true));
  3. Analyse une liste séparée par des virgules ou des espaces. Soyez indulgent. Nous acceptons également les listes séparées par des espaces, ainsi que les formats d'e-mail non valides.

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

3voto

user2389095 Points 41
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];

2voto

Ramasamy Points 27

Un moyen facile de le faire :

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

for(String cc:listofIDS) {
    message.addRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X