Addressクラス

広告

ToやCcなどを指定する際に使うAddressクラスについて確認します。

  • java.lang.Object
  • javax.mail.Address
  • public abstract class Address extends java.lang.Object implements java.io.Serializable

Addressクラスはabstractクラスですので、実際にはサブクラスのInternetAddressクラスを利用します。

  • java.lang.Object
  • javax.mail.Address
  • javax.mail.internet.InternetAddress
  • public class InternetAddress extends Address implements java.lang.Cloneable

コンストラクタとしては下記の5つが用意されています。

コンストラクタ
InternetAddress()
Default constructor.
InternetAddress(java.lang.String address)
Constructor.
InternetAddress(java.lang.String address, boolean strict)
Parse the given string and create an InternetAddress.
InternetAddress(java.lang.String address, java.lang.String personal)
Construct an InternetAddress given the address and personal name.
InternetAddress(java.lang.String address, java.lang.String personal, java.lang.String charset)
Construct an InternetAddress given the address and personal name.

それでは順にコンストラクタの内容を確認していきます。

2番目のコンストラクタがサンプルプログラムで使われているものです。

Constructor. 

Parse the given string and create an InternetAddress. See the parse
method for details of the parsing. The address is parsed using 
"strict" parsing.

Parameters:
  address - the address in RFC822 format
Throws:
  AddressException - if the parse failed

引数にRFC822フォーマットに準拠したメールアドレスを表わす文字列を指定すると、JavaMailで扱えるInternetAddress形式に変換してくれます。ちなみにRFC822では電子メールなどのフォーマットが定められているようです。

3番目のコンストラクタはRFC822に準拠しているかどうかのチェックが出来るようになっています。

Parse the given string and create an InternetAddress. If strict is
false, the detailed syntax of the address isn't checked.

Parameters:
  address - the address in RFC822 format
  strict - enforce RFC822 syntax
Throws:
  AddressException - if the parse failed

これは引数に指定したアドレスが不適切な形式の場合エラーとなります。2番目の引数にてチェックを行うかどうかも指定が可能です。では簡単にテストしてみましょう。

msg.setFrom(new InternetAddress(from, true));

サンプルプログラムのsetFromが記述してある所を、上記に変更して下さい。コンパイル後に実行してみます。

D:¥test¥javamail>java msgsendsample to@example.jp from.example.jp smtp.example.
jp false


--Exception handling in msgsendsample.java
javax.mail.internet.AddressException: Missing final '@domain' in string ``from.
example.jp''
        at javax.mail.internet.InternetAddress.checkAddress(InternetAddress.java
:889)
        at javax.mail.internet.InternetAddress.<init>(InternetAddress.java:95)
        at msgsendsample.main(msgsendsample.java:36)

D:¥test¥javamail>

上記のように構文チェックを行うようにすると、変なアドレスを指定した場合エラーとなります。

4番目のコンストラクタはアドレスに別名を付けることができます。

Construct an InternetAddress given the address and personal name.
The address is assumed to be a syntactically valid RFC822 address.

Parameters:
  address - the address in RFC822 format
  personal - the personal name

このコンストラクタを使うと「test<from@example.jp>」のようなメール形式にすることができます。

一度試してみましょう。

msg.setFrom(new InternetAddress(from, "test"));

....

}catch(MessagingException mex){
    System.out.println("¥n--Exception handling in msgsendsample.java");
    mex.printStackTrace();
}catch(java.io.UnsupportedEncodingException uex){
}

上記のようにsetFromの所を変更して下さい(UnsupportedEncodingExceptionも処理するように追加が必要です)。実際に実行してみると次のように表示されます。

Date: Sun, 8 May 2005 19:12:19 +0900 (JST)
From: test <from@example.jp>
To: to@example.jp
Subject: JavaMail APIs Test

5番目のコンストラクタはアドレスに別名にUS-ASCII以外の文字を付けることができます。

Construct an InternetAddress given the address and personal name. 
The address is assumed to be a syntactically valid RFC822 address.

Parameters:
  address - the address in RFC822 format
  personal - the personal name
  charset - the MIME charset for the name

このコンストラクタを使うと「テスト<abcd@example.jp>」のようなメール形式にすることができます。3番目の引数の文字コードには"ISO-2022-JP"を指定して下さい。

一度試してみましょう。

msg.setFrom(new InternetAddress(from, "テスト", "ISO-2022-JP"));

....

}catch(MessagingException mex){
    System.out.println("¥n--Exception handling in msgsendsample.java");
    mex.printStackTrace();
}catch(java.io.UnsupportedEncodingException uex){
}

上記のようにsetFromの所を変更して下さい(UnsupportedEncodingExceptionも処理するように追加が必要です)。実際に実行してみると、

Date: Sun, 8 May 2005 19:17:25 +0900 (JST)
From: テスト <from@example.jp>
To: to@example.jp
Subject: JavaMail APIs Test

上記のように日本語の別名も指定できるようになります。

その他のメソッド

では他にInternetAddressクラスで定義されているメソッドも見てみましょう。

まず複数のアドレスをまとめてInternetAddressクラスのオブジェクトに変換するメソッドです。

Parse the given sequence of addresses into InternetAddress objects. 
If strict is false, simple email addresses separated by spaces are 
also allowed. If strict is true, many (but not all) of the RFC822 
syntax rules are enforced. 
In particular, even if strict is true, addresses composed of simple 
names (with no "@domain" part) are allowed. Such "illegal" addresses
are not uncommon in real messages. 

Non-strict parsing is typically used when parsing a list of mail 
addresses entered by a human. Strict parsing is typically used when
parsing address headers in mail messages.

Parameters:
  addresslist - comma separated address strings
  strict - enforce RFC822 syntax
Returns:
  array of InternetAddress objects
Throws:
  AddressException - if the parse failed

このメソッドはカンマ(,)で区切られた複数のアドレスをまとめてInternetAddressクラスのオブジェクトに変換し、配列に確認します。ToやCcなどで複数のメールアドレスを指定したい場合などに便利です。2番目の引数で構文チェックも行えます。

一度試して見ましょう。

// InternetAddress[] address = {new InternetAddress(args[0])};
   InternetAddress[] address = InternetAddress.parse(args[0]);

サンプルプログラムを上記のように変更します。parseメソッドはstaticメソッドですので上記のような記述ができます。実際に実行してみると、

D:¥test¥javamail>java msgsendsample test@example.jp,test@example.jp,test@examp
le.jp from@example.jp smtpl.example.jp false

D:¥test¥javamail>

Toのところにカンマで区切って複数のメールアドレスを指定しています。送信すると下記のようなメールが届きます。

Date: Sun, 8 May 2005 20:56:30 +0900 (JST)
From: テスト <from@example.jp>
To: test@example.jp,
 test@example.jp,
 test@example.jp
Subject: JavaMail APIs Test

複数のToにメールが送信されます。(上記は同じアドレスを指定したので実際には1個しか来ません)。

次に別名だけ設定したい場合です。

Set the personal name. If the name contains non US-ASCII characters, 
then the name will be encoded using the specified charset as per RFC 
2047. If the name contains only US-ASCII characters, no encoding is 
done and the name is used as is. 

Parameters:
  name - personal name
  charset - MIME charset to be used to encode the name as per RFC 2047
Throws:
  java.io.UnsupportedEncodingException - if the charset encoding fails.

setPersonalメソッドを使うと、別名だけをセット出来ます。また文字コードも指定できるので、US-ASCII以外の文字も設定が可能です(使い方はコンストラクタの場合と同じです)。

( Written by Tatsuo Ikura )