Надіслати пошту кільком одержувачам у Java


80

Я хочу надіслати повідомлення кільком одержувачам, використовуючи такий спосіб:

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

АБО

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

Але одна плутанина полягає в тому, що в другому аргументі, як передавати кілька адрес, таких як:

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

АБО

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

Я також можу надіслати повідомлення, використовуючи альтернативні методи, але хочу знати мету вищевказаного методу. Якщо я не можу його використовувати (як і дотепер, я не отримав жодної відповіді на вищезазначену вимогу), то яка необхідність, щоб цей метод був у поштовому API.

Відповіді:


113

Якщо ви викликаєте addRecipientкілька разів, він додасть даного одержувача до списку одержувачів даного часу (TO, CC, BCC)

Наприклад:

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

Додасть 3 адреси до CC


Якщо ви хочете додати всі адреси відразу, вам слід скористатися setRecipientsабо addRecipientsі надати йому масив адрес

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

Ви також можете використовувати InternetAddress.parseдля аналізу списку адрес

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

1
Насправді моє запитання стосується конкретного методу.
Prateek

2
ви або використовуєте addRecipient/ setRecipientз однією адресою, або addRecipients/ setRecipientsз масивом адрес
Aviram Segal

3
javax.mailверсія 1.5.5 не має InternetAddress.parse()такої віддачі String. Усі методи аналізу повертають масив і тому не підходять для addRecipient. Чи існують інші версії, які мають такий метод?
yurin

2
Якщо у вас є javax.mailверсія 1.5.5або новіша, де у вас немає InternetAddress.parse()повертає одиночний, InternetAddressа лише той, який повертає InternetAddress[](масив), ви можете використовувати перше рішення, яке має ... message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("abc@def.com")[0]); ... ([0] там важливо) . У другому рішенні: ... new Address[] {InternetAddress.parse("abc@abc.com")[0], ... Третє рішення має працювати без змін. Звичайно, [0] в кінці слід застосовувати до всіх адрес у кожному рішенні.
luke

1
@luke .. дякую, я боровся якийсь час .. і твій коментар мені допоміг.
stack0114106

29

Привіт кожному, цей код для мене працює, будь ласка, спробуйте це для надсилання пошти кільком одержувачам

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

Спробуйте так:

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

Просто використовуйте метод message.setRecipients з кількома адресами, розділеними комами:

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

чудово працює лише з однією адресою

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

11

Ви можете мати кілька адрес, розділених комами

if (cc.indexOf(',') > 0)
    message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));   
else
    message.setRecipient(Message.RecipientType.CC, new InternetAddress(cc));

1
Чому б вам не використовувати InternetAddress.parse()для обох? (І так, я знаю, що цьому 4 роки)
Шон Брайт

2
@seanbright так, ви можете просто перше твердження взагалі пропустити умову if else. setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));має працювати, навіть якщо є лише 1 адреса. Це просто особистий спосіб програмування для підвищення читабельності.
ThePCWizard

6

Отже ... це зайняло багато місяців, але все ж ... Ви можете надіслати електронне повідомлення кільком одержувачам, використовуючи ',' як роздільник та

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

це нормально Принаймні в JavaMail 1.4.5


5

InternetAddress.Parse стане вашим другом! Дивіться працюючий приклад нижче:

String to = "med@joe.com, maz@frank.com, jezz@jam.com";
String toCommaAndSpaces = "med@joe.com maz@frank.com, jezz@jam.com";
  1. Проаналізуйте список адрес електронної пошти, розділених комами. Будьте суворими. Потрібен список, відокремлений комами.
  2. Якщо суворість відповідає істині, застосовуються багато (але не всі) правил синтаксису RFC822 для електронних листів.

    msg.setRecipients(Message.RecipientType.CC,
    InternetAddress.parse(to, true));
    
  3. Розбір списку, розділеного комами / пробілами. Виріжте трохи слабини. Ми також допускаємо розділений пробілами список, а також недійсні формати електронної пошти.

    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

Формат адреси електронної пошти в Інтернеті ( RFC 822)

(,)Послідовність адрес, розділених комами

javax.mail - 1.4.7 parse( String[] )заборонено. Отже, ми повинні вказати послідовність адрес, розділених комами, на InternetAddressоб’єкти. Адреси повинні відповідати синтаксису RFC822.

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

(;)послідовність адрес, розділених крапкою з комою «Якщо група адресного списку має деліметр як"; " потім перетворити на масив рядків, використовуючи метод split, щоб використовувати наступну функцію.

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

Повний приклад:

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 SimpleEmail-commons-email-1.3.1

Приклад: 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

Ви можете використовувати n-номер одержувача нижче методу:

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

я вказав конкретний метод у своєму питанні, хочу надіслати, використовуючи це.
Prateek

@Dhinkar, як надіслати пошту всім передплатникам з java?
codepro123

1

Якщо ви хочете надіслати як копію, використовуючи MimeMessageHelper

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

Те саме ви можете використовувати для додавання кількох одержувачів.


1

Простий спосіб зробити

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

for(String cc:listofIDS) {
    message.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.