Wyślij pocztę do wielu odbiorców w języku Java

80

Chcę wysłać wiadomość do wielu Odbiorców w następujący sposób:

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

LUB

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

Ale jedno zamieszanie polega na tym, że w drugim sporze, jak przekazać wiele adresów, takich jak:

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

LUB

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

Mogę wysłać wiadomość za pomocą alternatywnych metod, ale chcę poznać cel powyższej metody. Jeśli nie mogę go użyć (ponieważ do tej pory nie mam odpowiedzi na powyższe wymaganie), to jaka jest potrzeba, aby ta metoda była w API poczty.

Prateek
źródło

Odpowiedzi:

113

addRecipientWielokrotne wywołanie doda danego odbiorcę do listy odbiorców danego czasu (DO, DW, UDW)

Na przykład:

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

Doda 3 adresy do CC


Jeśli chcesz dodać wszystkie adresy naraz, użyj setRecipientslub addRecipientsi podaj tablicę adresów

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

Możesz również użyć InternetAddress.parsedo przeanalizowania listy adresów

message.addRecipients(Message.RecipientType.CC, 
                      InternetAddress.parse("[email protected],[email protected],[email protected]"));
Aviram Segal
źródło
1
Właściwie moje pytanie dotyczy konkretnie określonej metody.
Prateek
2
albo używasz addRecipient/ setRecipientz jednym adresem lub addRecipients/ setRecipientsz tablicą adresów
Aviram Segal,
3
javax.mailwersja 1.5.5 nie InternetAddress.parse()zwraca tego String. Wszystkie metody analizy zwracają tablicę, więc nie są odpowiednie dla addRecipient. Czy istnieją inne wersje, które mają taką metodę?
yurin
2
Kiedy masz javax.mailwersję 1.5.5lub nowszą, w której nie masz, InternetAddress.parse()która zwraca single, InternetAddressale tylko tę, która zwraca InternetAddress[](tablicę), możesz użyć pierwszego rozwiązania, mając ... message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("[email protected]")[0]); ... ([0] jest tam ważne) . W drugim rozwiązaniu: ... new Address[] {InternetAddress.parse("[email protected]")[0], ... Trzecie rozwiązanie powinno działać bez zmian. Oczywiście [0] na końcu należy zastosować do wszystkich adresów w każdym rozwiązaniu.
Łukasz
1
@luke .. dzięki, walczę przez jakiś czas .. Twój komentarz mi pomógł.
stack0114106
29

Cześć wszystkim, ten kod działa dla mnie, spróbuj go użyć do wysyłania poczty do wielu odbiorców

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
źródło
12

Spróbuj w ten sposób:

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
źródło
12

Po prostu użyj metody message.setRecipients z wieloma adresami oddzielonymi przecinkami:

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

działa dobrze z tylko jednym adresem

message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]"));
Leyo
źródło
11

Możesz mieć wiele adresów oddzielonych przecinkami

if (cc.indexOf(',') > 0)
    message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));   
else
    message.setRecipient(Message.RecipientType.CC, new InternetAddress(cc));
ThePCWizard
źródło
1
Dlaczego nie używałbyś InternetAddress.parse()do obu? (I tak, wiem, że to ma 4 lata)
Sean Bright,
2
@seanbright tak, możesz po prostu mieć pierwszą instrukcję pomijającą całkowicie warunek if else. setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));powinien działać, nawet jeśli jest tylko 1 adres. To tylko osobisty sposób programowania w celu zwiększenia czytelności.
ThePCWizard,
6

Więc ... zajęło to wiele miesięcy, ale nadal ... Możesz wysłać wiadomość e-mail do wielu odbiorców, używając znaku „,” jako separatora i

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

jest ok Przynajmniej w JavaMail 1.4.5

bes67
źródło
5

InternetAddress.Parse będzie Twoim przyjacielem! Zobacz przykład praktyczny poniżej:

String to = "[email protected], [email protected], [email protected]";
String toCommaAndSpaces = "[email protected] [email protected], [email protected]";
  1. Przeanalizuj listę adresów e-mail oddzielonych przecinkami. Być stanowczym. Wymagaj listy oddzielonej przecinkami.
  2. Jeśli ścisłe jest prawdziwe, egzekwowanych jest wiele (ale nie wszystkie) reguł składni RFC822 dotyczących wiadomości e-mail.

    msg.setRecipients(Message.RecipientType.CC,
    InternetAddress.parse(to, true));
    
  3. Analizuj listę rozdzielaną przecinkami / spacjami. Zwolnij trochę. Dopuszczamy również listy oddzielone spacjami oraz nieprawidłowe formaty wiadomości e-mail.

    msg.setRecipients(Message.RecipientType.BCC,
    InternetAddress.parse(toCommaAndSpaces, false));
    
Matt
źródło
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
źródło
4

Format internetowego adresu e-mail ( RFC 822)

(,)sekwencja adresów oddzielona przecinkami

javax.mail - 1.4.7 parse( String[] )jest niedozwolone. Musimy więc nadać InternetAddressobiektom sekwencję adresów oddzielonych przecinkami . Adresy muszą być zgodne ze składnią RFC822.

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

(;)sekwencja adresów rozdzielona średnikami «Jeśli grupa listy adresów ma separator jako„; ” następnie przekonwertuj na tablicę String przy użyciu metody split, aby użyć następującej funkcji.

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

Pełny przykład:

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

Korzystanie z Appache SimpleEmail-commons-email-1.3.1

Przykład: 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
źródło
1

Możesz użyć n-numeru odbiorcy poniżej metody:

  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
źródło
W swoim pytaniu określiłem konkretną metodę, którą chcę wysłać.
Prateek
@Dhinkar, jak wysłać pocztę do wszystkich subskrybentów za pomocą java?
codepro123
1

Jeśli chcesz wysłać jako DW przy użyciu MimeMessageHelper

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

To samo, którego możesz użyć, aby dodać wielu odbiorców.

Bieg
źródło
1

Łatwy sposób

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

for(String cc:listofIDS) {
    message.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc));
}
Ramasamy
źródło