Отправка почты нескольким получателям в 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.

Prateek
источник

Ответы:

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с массивом адресов
Авирам Сигал
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] в конце должен применяться ко всем адресам в каждом решении.
Лука
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);
GK
источник
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);
user3734721
источник
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 08
6

Итак ... это заняло много месяцев, но все же ... Вы можете отправлять электронную почту нескольким получателям, используя ',' в качестве разделителя и

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

в порядке. По крайней мере, в JavaMail 1.4.5

bes67
источник
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. Если strict истинно, применяются многие (но не все) синтаксические правила 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]; 
user2389095
источник
4

Формат адреса электронной почты в Интернете ( RFC 822)

(,)последовательность адресов, разделенных запятыми

javax.mail - 1.4.7 parse( String[] )не допускается. Таким образом, мы должны указать последовательность адресов в InternetAddressобъектах через запятую . Адреса должны соответствовать синтаксису RFC822.

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

(;)Последовательность адресов, разделенных точкой с запятой «Если группа списка адресов указана разделителем в виде"; " затем преобразуйте его в массив String, используя метод 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-number получателя ниже:

  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

Если вы хотите отправить как Cc, используя 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));
}
Рамасами
источник