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, "abc@abc.com,abc@def.com,ghi@abc.com");

ODER

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

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.

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("abc@abc.com"));
message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("abc@def.com"));
message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("ghi@abc.com"));

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("abc@abc.com"),
                               InternetAddress.parse("abc@def.com"), 
                               InternetAddress.parse("ghi@abc.com")};
message.addRecipients(Message.RecipientType.CC, cc);

Sie können auch InternetAddress.parseeine Adressliste analysieren

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

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("abc@def.com")[0]); ... ([0] ist dort wichtig) verwenden . In der zweiten Lösung: ... new Address[] {InternetAddress.parse("abc@abc.com")[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 = "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

Versuchen Sie Folgendes:

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

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

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

funktioniert auch mit nur einer Adresse

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

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

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, "abc@abc.com,abc@def.com,ghi@abc.com");

ist in Ordnung. Zumindest in JavaMail 1.4.5


5

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

String to = "med@joe.com, maz@frank.com, jezz@jam.com";
String toCommaAndSpaces = "med@joe.com maz@frank.com, jezz@jam.com";
  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));
    

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

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 = "mail@mail.com,mail2@mail.com";
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 = { "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);
    }
}

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( "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

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

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

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.


1

Einfacher Weg zu tun

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

for(String cc:listofIDS) {
    message.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc));
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.