Javaで複数の受信者にメールを送信する


80

次の方法で複数の受信者にメッセージを送信したい:

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

または

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

しかし、1つの混乱は、2番目の議論で、次のような複数のアドレスを渡す方法です。

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 2012

2
あなたのいずれかを使用addRecipient/setRecipient単一のアドレスまたはでaddRecipients/setRecipientsアドレスの配列を持つ
Aviramシーガル

3
javax.mailバージョン1.5.5にはInternetAddress.parse()、を返すものはありませんString。すべての解析メソッドは配列を返すため、には適していませんaddRecipient。そのような方法を持つ他のバージョンはありますか?
yurin 2017年

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]は、各ソリューションのすべてのアドレスに適用する必要があります。
ルーク2017年

1
@luke ..ありがとう、私はしばらく苦労してきました..そしてあなたのコメントは私を助けました。
stack01141 0619

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

1つのアドレスでも問題なく動作します

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はい、最初のステートメントでifelse条件を完全にスキップすることができます。setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));アドレスが1つしかない場合でも機能するはずです。これは、読みやすさを向上させるためのプログラミングの単なる個人的な方法です。
thePCWizard 2016

6

だから...それは何ヶ月もかかりましたが、それでも...あなたは '、'を区切り文字として使用して複数の受信者に電子メールを送信することができます

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

大丈夫です。少なくともJavaMail1.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.7parse( 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 2012

@ Dhinkar、Javaですべてのサブスクライバーにメールを送信する方法は?
codepro1 2320

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.