Gửi thư cho nhiều người nhận trong java


80

Tôi muốn gửi một tin nhắn cho nhiều Người nhận bằng phương pháp sau:

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

HOẶC LÀ

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

Nhưng có một sự nhầm lẫn là trong tranh luận thứ hai, làm thế nào để chuyển nhiều địa chỉ như:

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

HOẶC LÀ

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

Tôi cũng có thể gửi tin nhắn bằng các phương pháp thay thế, nhưng tôi muốn biết mục đích của phương pháp trên. Nếu tôi không thể sử dụng nó (vì cho đến nay tôi vẫn chưa có câu trả lời nào cho yêu cầu trên) thì phương thức này cần có trong API thư là gì.

Câu trả lời:


113

Nếu bạn gọi addRecipientnhiều lần, nó sẽ thêm người nhận đã cho vào danh sách những người nhận trong thời gian nhất định (TO, CC, BCC)

Ví dụ:

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

Sẽ thêm 3 địa chỉ vào CC


Nếu bạn muốn thêm tất cả các địa chỉ cùng một lúc, bạn nên sử dụng setRecipientshoặc addRecipientscung cấp cho nó một loạt các địa chỉ

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

Bạn cũng có thể sử dụng InternetAddress.parseđể phân tích cú pháp danh sách địa chỉ

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

1
Trên thực tế, câu hỏi của tôi đặc biệt liên quan đến một phương pháp cụ thể.
Prateek 13/12/12

2
bạn sử dụng addRecipient/ setRecipientvới một địa chỉ duy nhất hoặc addRecipients/ setRecipientsvới một loạt địa chỉ
Aviram Segal

3
javax.mailphiên bản 1.5.5 không có InternetAddress.parse()lợi nhuận đó String. Tất cả các phương thức phân tích cú pháp trả về mảng và do đó không phù hợp với addRecipient. Có (các) phiên bản khác có phương pháp như vậy không?
yurin

2
Khi bạn có javax.mailphiên bản 1.5.5trở lên mà bạn không có phiên bản InternetAddress.parse()trả về đơn lẻ InternetAddressmà chỉ có phiên bản trả về InternetAddress[](mảng), bạn có thể sử dụng giải pháp đầu tiên... message.addRecipient(Message.RecipientType.CC, InternetAddress.parse("abc@def.com")[0]); ... ([0] là quan trọng ở đó) . Trong giải pháp thứ hai: ... new Address[] {InternetAddress.parse("abc@abc.com")[0], ... Giải pháp thứ ba sẽ hoạt động mà không có thay đổi. Tất nhiên [0] ở cuối nên được áp dụng cho tất cả các địa chỉ trong mỗi giải pháp.
luke

1
@luke .. cám ơn, mình đã loay hoay một lúc rồi .. và bình luận của bạn đã giúp mình.
stack0114106

29

Xin chào mọi người, mã này là công việc của tôi, vui lòng thử với mã này để gửi thư cho nhiều người nhận

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

Hãy thử cách này:

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

Chỉ cần sử dụng phương thức message.setRecipient với nhiều địa chỉ được phân tách bằng dấu phẩy:

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

hoạt động tốt với chỉ một địa chỉ

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

11

Bạn có thể có nhiều địa chỉ được phân tách bằng dấu phẩy

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

1
Tại sao bạn không sử dụng InternetAddress.parse()cho cả hai? (Và vâng, tôi biết đây là 4 tuổi)
Sean Bright

2
@seanbright vâng, bạn chỉ có thể có câu lệnh đầu tiên bỏ qua hoàn toàn điều kiện if else. setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));sẽ hoạt động ngay cả khi chỉ có 1 địa chỉ. Đó chỉ là một cách lập trình cá nhân để tăng khả năng đọc.
ThePCWizard

6

Vì vậy, ... đã mất nhiều tháng, nhưng vẫn ... Bạn có thể gửi email đến nhiều người nhận bằng cách sử dụng dấu phân tách ',' và

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

là ok. Ít nhất là trong JavaMail 1.4.5


5

InternetAddress.Parse sẽ là bạn của bạn! Xem ví dụ đã làm dưới đây:

String to = "med@joe.com, maz@frank.com, jezz@jam.com";
String toCommaAndSpaces = "med@joe.com maz@frank.com, jezz@jam.com";
  1. Phân tích cú pháp danh sách địa chỉ email được phân tách bằng dấu phẩy. Nghiêm khắc. Yêu cầu danh sách được phân tách bằng dấu phẩy.
  2. Nếu nghiêm ngặt là đúng, nhiều (nhưng không phải tất cả) quy tắc cú pháp RFC822 cho email sẽ được thực thi.

    msg.setRecipients(Message.RecipientType.CC,
    InternetAddress.parse(to, true));
    
  3. Phân tích cú pháp danh sách được phân tách bằng dấu phẩy / dấu cách. Cắt giảm một số chùng. Chúng tôi cũng cho phép danh sách được phân tách bằng dấu cách, cộng với các định dạng email không hợp lệ.

    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

Định dạng địa chỉ e-mail Internet ( RFC 822)

(,)dãy địa chỉ được phân tách bằng dấu phẩy

javax.mail - 1.4.7 parse( String[] )không được phép. Vì vậy, chúng ta phải cung cấp chuỗi địa chỉ được phân tách bằng dấu phẩy vào InternetAddresscác đối tượng. Địa chỉ phải tuân theo cú pháp RFC822.

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

(;)dãy địa chỉ được phân tách bằng dấu chấm phẩy «Nếu nhóm danh sách địa chỉ được cung cấp với dấu phân cách là"; " sau đó chuyển đổi sang mảng String bằng phương thức split để sử dụng hàm sau.

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

Ví dụ đầy đủ:

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

Sử dụng Appache SimpleEmail-commons-email-1.3.1

Thí dụ: 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

Bạn có thể sử dụng phương pháp n-number người nhận dưới đây:

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

Tôi đã chỉ định một phương pháp cụ thể trong câu hỏi của mình, muốn gửi bằng cách sử dụng đó.
Prateek

@Dhinkar, làm thế nào để gửi thư cho tất cả người đăng ký bằng java?
codepro123

1

Nếu bạn muốn gửi dưới dạng Cc bằng MimeMessageHelper

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

Bạn có thể sử dụng tương tự để thêm nhiều người nhận.


1

Cách dễ dàng để làm

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

for(String cc:listofIDS) {
    message.addRecipients(Message.RecipientType.CC,InternetAddress.parse(cc));
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.