- Home ›
- JavaMailでメール送信 ›
- メールの送信 ›
- HERE
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番目のコンストラクタがサンプルプログラムで使われているものです。
InternetAddress public InternetAddress(java.lang.String address) throws AddressException
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に準拠しているかどうかのチェックが出来るようになっています。
InternetAddress public InternetAddress(java.lang.String address, boolean strict) throws AddressException
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番目のコンストラクタはアドレスに別名を付けることができます。
InternetAddress public InternetAddress(java.lang.String address, java.lang.String personal) throws java.io.UnsupportedEncodingException
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以外の文字を付けることができます。
InternetAddress public InternetAddress(java.lang.String address, java.lang.String personal, java.lang.String charset) throws java.io.UnsupportedEncodingException
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 public static InternetAddress[] parse(java.lang.String addresslist, boolean strict) throws AddressException
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個しか来ません)。
次に別名だけ設定したい場合です。
setPersonal public void setPersonal(java.lang.String name, java.lang.String charset) throws java.io.UnsupportedEncodingException
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 )