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

LUB

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

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.

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

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

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("abc@def.com")[0]); ... ([0] jest tam ważne) . W drugim rozwiązaniu: ... new Address[] {InternetAddress.parse("abc@abc.com")[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 = "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

Spróbuj w ten sposób:

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

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

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

działa dobrze z tylko jednym adresem

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

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

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

jest ok Przynajmniej w JavaMail 1.4.5


5

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

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

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

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

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

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

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

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.


1

Łatwy sposób

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

for(String cc:listofIDS) {
    message.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc));
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.