Senden Sie E-Mails an mehrere Empfänger in Java

80

Ich möchte eine Nachricht mit der folgenden Methode an mehrere Empfänger senden:

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

ODER

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

Eine Verwirrung ist jedoch, dass im zweiten Streit, wie mehrere Adressen übergeben werden sollen, wie:

message.addRecipient(Message.RecipientType.CC, "[email protected],[email protected],[email protected]");

ODER

message.addRecipient(Message.RecipientType.CC, "[email protected];[email protected];[email protected]");

Ich kann eine Nachricht auch mit alternativen Methoden senden, möchte aber den Zweck der obigen Methode kennen. Wenn ich es nicht verwenden kann (da ich bis jetzt keine Antwort auf die oben genannte Anforderung habe), was ist dann die Notwendigkeit für diese Methode, in der Mail-API zu sein.

Prateek
quelle

Antworten:

113

Wenn Sie addRecipientmehrmals aufrufen , wird der angegebene Empfänger zur Liste der Empfänger der angegebenen Zeit hinzugefügt (TO, CC, BCC).

Zum Beispiel:

message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("[email protected]"));
message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("[email protected]"));
message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("[email protected]"));

Fügt die 3 Adressen zu CC hinzu


Wenn Sie alle Adressen gleichzeitig hinzufügen möchten, sollten Sie setRecipientsoder verwenden addRecipientsund ein Array von Adressen bereitstellen

Address[] cc = new Address[] {InternetAddress.parse("[email protected]"),
                               InternetAddress.parse("[email protected]"), 
                               InternetAddress.parse("[email protected]")};
message.addRecipients(Message.RecipientType.CC, cc);

Sie können auch InternetAddress.parseeine Adressliste analysieren

message.addRecipients(Message.RecipientType.CC, 
                      InternetAddress.parse("[email protected],[email protected],[email protected]"));
Aviram Segal
quelle
1
Eigentlich bezieht sich meine Frage speziell auf eine bestimmte Methode.
Prateek
2
Sie verwenden entweder addRecipient/ setRecipientmit einer einzelnen Adresse oder addRecipients/ setRecipientsmit einem Array von Adressen
Aviram Segal
3
javax.mailVersion 1.5.5 hat InternetAddress.parse()diese Rückgabe nicht String. Alle Analysemethoden geben ein Array zurück und sind daher nicht für geeignet addRecipient. Gibt es andere Versionen mit einer solchen Methode?
Yurin
2
Wenn Sie eine javax.mailVersion 1.5.5oder höher haben, bei der Sie keine InternetAddress.parse()Single zurückgeben, InternetAddresssondern nur die, die zurückgibt InternetAddress[](Array), können Sie die erste Lösung mit ... message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("[email protected]")[0]); ... ([0] ist dort wichtig) verwenden . In der zweiten Lösung: ... new Address[] {InternetAddress.parse("[email protected]")[0], ... Die dritte Lösung sollte ohne Änderungen funktionieren. Natürlich sollte [0] am Ende auf alle Adressen in jeder Lösung angewendet werden.
Luke
1
@luke .. danke, ich habe eine Weile gekämpft .. und dein Kommentar hat mir geholfen.
stack0114106
29

Hallo allerseits, dieser Code funktioniert für mich. Bitte versuchen Sie es damit, um E-Mails an mehrere Empfänger zu senden

private String recipient = "[email protected] ,[email protected] ";
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);
GK
quelle
12

Versuchen Sie Folgendes:

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]"));
String address = "[email protected],[email protected]";
InternetAddress[] iAdressArray = InternetAddress.parse(address);
message.setRecipients(Message.RecipientType.CC, iAdressArray);
user3734721
quelle
12

Verwenden Sie einfach die Methode message.setRecipients mit mehreren durch Kommas getrennten Adressen:

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected],[email protected],[email protected]"));

message.setRecipients(Message.RecipientType.CC, InternetAddress.parse("[email protected],[email protected],[email protected]"));

funktioniert auch mit nur einer Adresse

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]"));
Leyo
quelle
11

Sie können mehrere Adressen durch Komma trennen

if (cc.indexOf(',') > 0)
    message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));   
else
    message.setRecipient(Message.RecipientType.CC, new InternetAddress(cc));
Der PCWizard
quelle
1
Warum würden Sie nicht InternetAddress.parse()für beide verwenden? (Und ja, ich weiß, dass dies 4 Jahre alt ist)
Sean Bright
2
@seanbright Ja, Sie können einfach die erste Anweisung haben, die die if else-Bedingung insgesamt überspringt. setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));sollte funktionieren, auch wenn es nur 1 Adresse gibt. Es ist nur eine persönliche Art zu programmieren, um die Lesbarkeit zu verbessern.
ThePCWizard
6

Also ... es hat viele Monate gedauert, aber trotzdem ... Sie können E-Mails an mehrere Empfänger senden, indem Sie das ',' als Trennzeichen und verwenden

message.setRecipients(Message.RecipientType.CC, "[email protected],[email protected],[email protected]");

ist in Ordnung. Zumindest in JavaMail 1.4.5

bes67
quelle
5

InternetAddress.Parse wird dein Freund sein! Siehe das Beispiel unten:

String to = "[email protected], [email protected], [email protected]";
String toCommaAndSpaces = "[email protected] [email protected], [email protected]";
  1. Analysieren Sie eine durch Kommas getrennte Liste von E-Mail-Adressen. Sei streng. Kommagetrennte Liste erforderlich.
  2. Wenn strict wahr ist, werden viele (aber nicht alle) der RFC822- Syntaxregeln für E-Mails erzwungen.

    msg.setRecipients(Message.RecipientType.CC,
    InternetAddress.parse(to, true));
    
  3. Analysieren Sie die durch Kommas / Leerzeichen getrennte Liste. Schneiden Sie etwas locker. Wir erlauben auch eine durch Leerzeichen getrennte Liste sowie ungültige E-Mail-Formate.

    msg.setRecipients(Message.RecipientType.BCC,
    InternetAddress.parse(toCommaAndSpaces, false));
    
Matt
quelle
4
String[] mailAddressTo = new String[3];    
mailAddressTo[0] = emailId_1;    
mailAddressTo[1] = emailId_2;    
mailAddressTo[2] = "[email protected]";

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]; 
user2389095
quelle
3

Internet-E-Mail-Adressformat ( RFC 822)

(,)durch Kommas getrennte Folge von Adressen

javax.mail - 1.4.7 parse( String[] )ist nicht erlaubt. Wir müssen also InternetAddressObjekten eine durch Kommas getrennte Folge von Adressen geben . Adressen müssen der RFC822-Syntax folgen.

String toAddress = "[email protected],[email protected]";
InternetAddress.parse( toAddress );

(;)Semikolon -getrennte Adressfolge «Wenn die Adressgruppengruppe mit einem Delimeter als"; " Konvertieren Sie dann mit der Split-Methode in ein String-Array, um die folgende Funktion zu verwenden.

String[] addressList = { "[email protected]", "[email protected]" };

String toGroup = "[email protected];[email protected]";
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);
    }
}

Vollständiges Beispiel:

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

Appache verwenden SimpleEmail-commons-email-1.3.1

Beispiel: 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( "[email protected]", "Yash" );
    String[] toAddressList = { "[email protected]", "[email protected]" }
    email.addTo( addressList );

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

Sie können die folgende n-Nummer des Empfängers verwenden:

  String to[] = {"[email protected]"} //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);
Dhinakar
quelle
Ich habe in meiner Frage eine bestimmte Methode angegeben, die ich damit senden möchte.
Prateek
1

Wenn Sie mit MimeMessageHelper als Cc senden möchten

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

Gleiches können Sie verwenden, um mehrere Empfänger hinzuzufügen.

Arun
quelle
1

Einfacher Weg zu tun

String[] listofIDS={"[email protected]","[email protected]"};

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