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

CC에 3 개의 주소를 추가합니다.


한 번에 모든 주소를 추가하려면 주소 배열을 사용 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 시걸

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] 중요 있습니다) . 에서는 제 2 용액 : ... 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));주소가 하나 뿐인 경우에도 작동합니다. 가독성을 높이기위한 개인적인 프로그래밍 방법입니다.
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. strict가 true이면 전자 메일에 대한 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 배열로 변환하여 다음 함수를 사용하십시오.

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

MimeMessageHelper를 사용하여 Cc로 보내려면

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));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.