Messageクラス

広告

ここでは実際に送信するメールの中身を入れるMessageクラスについて見ていきます。

  • java.lang.Object
  • javax.mail.Message
  • public abstract class Message extends java.lang.Object implements Part

このクラスはabstractクラスですので、そのままインスタンスを作ることはできないのですが、サブクラスとしてMimeMessageクラス用意されています。その為、実際にはMimeMessageを使います。

  • java.lang.Object
  • javax.mail.Message
  • javax.mail.internet.MimeMessage
  • public class MimeMessage extends Message implements MimePart

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

コンストラクタ
protected MimeMessage(Folder folder, java.io.InputStream is, int msgnum)
Constructs a MimeMessage by reading and parsing the data from the specified MIME InputStream.
protected MimeMessage(Folder folder, int msgnum)
Constructs an empty MimeMessage object with the given Folder and message number.
protected MimeMessage(Folder folder, InternetHeaders headers, byte[] content, int msgnum)
Constructs a MimeMessage from the given InternetHeaders object and content.
MimeMessage(MimeMessage source)
Constructs a new MimeMessage with content initialized from the source MimeMessage.
MimeMessage(Session session)
Default constructor.
MimeMessage(Session session, java.io.InputStream is)
Constructs a MimeMessage by reading and parsing the data from the specified MIME InputStream.

色々ありますが、取りあえず必要なのは5番目のMimeMessage(Session session)になります。

Default constructor. An empty message object is created. The headers 
field is set to an empty InternetHeaders object. The flags field is 
set to an empty Flags object. The modified flag is set to true.

引数に指定されているSessionクラスについては別の頁で説明しますので取りあえず忘れて下さい。

コンストラクタでインスタンスを作成したら必要な情報を入れていきます。その為のメソッドが色々用意されていますので、1つ1つ見ていきましょう。

setFromメソッド

まずsetFromメソッドです。

Set the RFC 822 "From" header field. Any existing values are replaced 
with the given address. If address is null, this header is removed.

Parameters:
  address - the sender of this message
Throws:
  IllegalWriteException - if the underlying implementation does not support 
    modification of existing values
  IllegalStateException - if this message is obtained from a READ_ONLY folder.
  MessagingException -  

setFromメソッドはヘッダーのFromに表示される値を指定します。(Propertiesでmail.smtp.fromを指定するとenvelope-fromを別に指定できるようですが、指定しなければsetFromで指定したアドレスがenvelop-fromになると思います)。

引数にはAddressクラスのオブジェクトを指定します。Addressクラスについては次の頁で詳しく見ますのでここでは省略しますが、メールアドレスを表わす文字列からJavaMailで利用できる形式に変換してくれるものになります。

setRecipientsメソッド

次にsetRecipientsメソッドです。

Set the specified recipient type to the given addresses. If the 
address parameter is null, the corresponding recipient field is 
removed.

Parameters:
  type - Recipient type
  addresses - Addresses
Throws:
  IllegalWriteException - if the underlying implementation does not 
    support  modification of existing values
  IllegalStateException - if this message is obtained from a 
    READ_ONLY folder.
  MessagingException -  

setRecipientsメソッドはヘッダーのTo、Cc、Bccに表示される値を指定します。それぞれ別々に指定する必要があり、Message.RecipientTypeの値を使ってどのタイプの値を指定しているかを指定します。typeに指定できる値はMessage.RecipientTypeクラスで定義されています。

static Message.RecipientType  BCC
static Message.RecipientType  CC
static Message.RecipientType  TO

上記3つの中から指定します。2番目の引数にはsetFromと同じようにAddressクラスの値を指定しますが、Toなどには複数のアドレスを指定できるので、Addressクラスの配列にて指定しています。

setSubjectメソッド

次にsetSubjectメソッドです。このメソッドは文字コード指定するかどうかで2つメソッドがあります。

Set the "Subject" header field. If the subject contains non US-ASCII
characters, it will be encoded using the platform's default charset. 
If the subject contains only US-ASCII characters, no encoding is done 
and it is used as-is. If the subject is null, the existing "Subject"
field is removed. 

The application must ensure that the subject does not contain any 
line breaks. 

Note that if the charset encoding process fails, a MessagingException 
is thrown, and an UnsupportedEncodingException is included in the 
chain of nested exceptions within the MessagingException.

Parameters:
  subject - The subject
Throws:
  IllegalWriteException - if the underlying implementation does not 
    support  modification of existing values
  IllegalStateException - if this message is obtained from a READ_ONLY
    folder.
  MessagingException. - An UnsupportedEncodingException may be included
    in the exception chain if the charset conversion fails.

文字コードを指定する場合は次のメソッドを使います。

Set the "Subject" header field. If the subject contains non US-ASCII 
characters, it will be encoded using the specified charset. If the 
subject contains only US-ASCII characters, no encoding is done and 
it is used as-is. If the subject is null, the existing "Subject" 
header field is removed. 

The application must ensure that the subject does not contain any 
line breaks. 

Note that if the charset encoding process fails, a MessagingException 
is thrown, and an UnsupportedEncodingException is included in the
chain of nested exceptions within the MessagingException.

Parameters:
  subject - The subject
  charset - The charset
Throws:
  IllegalWriteException - if the underlying implementation does not 
    support modification of existing values
  IllegalStateException - if this message is obtained from a READ_ONLY 
    folder.
  MessagingException. - An UnsupportedEncodingException may be included 
    in the exception chain if the charset conversion fails.

サブジェクトにUS-ASCIIだけ使う場合には上のメソッドを、それ以外の日本語なども使う場合には下のメソッドを使います。基本的には2番目のメソッドを使っておけばいいかと思います。

1番目の引数にはSubjectに表示したい文字列を指定します。2番目の引数には、メールの場合には必ず"ISO-2022-JP"を指定します。

MimeMessage msg = new MimeMessage(session);
msg.setSubject("日本語が入ったサブジェクト", "ISO-2022-JP");

setTextメソッド

次にsetTextメソッドです。このメソッドは文字コード指定するかどうかで2つメソッドがあります。

Convenience method that sets the given String as this part's 
content, with a MIME type of "text/plain". If the string contains 
non US-ASCII characters. 
it will be encoded using the platform's default charset. The charset
is also used to set the "charset" parameter.

Note that there may be a performance penalty if text is large, since
this method may have to scan all the characters to determine what 
charset to use. 

If the charset is already known, use the setText method that takes 
the charset parameter.

文字コードを指定する場合は次のメソッドを使います。

Convenience method that sets the given String as this part's content,
with a MIME type of "text/plain" and the specified charset. The 
given Unicode string will be charset-encoded using the specified 
charset. The charset is also used to set the "charset" parameter.

setTextメソッドは本文の内容を指定するのに使います。このメソッドを使った場合は"text/plain"タイプの本文を格納する場合のメソッドです。setSubjectの場合と同じようにUS-ASCII以外の文字を使う場合には2番目の方のメソッドを使います。

1番目の引数には本文に入れたい文字列を、2番目の引数にはメールの場合は必ず"ISO-2022-JP"を指定します。

String msgText = "日本語が含まれたメール本文";

MimeMessage msg = new MimeMessage(session);
msg.setText(msgText, "ISO-2022-JP");

setSentDateメソッド

次にsetSentDateメソッドです。

Set the RFC 822 "Date" header field. This is the date on which the 
creator of the message indicates that the message is complete and 
ready for delivery. 
If the date parameter is null, the existing "Date" field is removed.

Throws:
  IllegalWriteException - if the underlying implementation does not
    support modification
  IllegalStateException - if this message is obtained from a READ_ONLY
    folder.
  MessagingException - 

setSentDateメソッドは、メールの作成日時を指定します。ただ実際はメール送信日時の時間くらいしか入れれません。引数にはjava.util.Dateの値を入れますので、msg.setSentDate(new Date());のような記載方法になります。

setReplyToメソッド

次にsetReplyToメソッドです。

Set the RFC 822 "Reply-To" header field. If the address parameter 
is null, this header is removed.

Throws:
  IllegalWriteException - if the underlying implementation does not 
    support modification of existing values
  IllegalStateException - if this message is obtained from a READ_ONLY
    folder.
  MessagingException -  

setReplyToメソッドは、ヘッダーにReplyToを指定するために使います。ReplyToが書かれている場合は、メールを受け取った方が返信する場合などにReplyTo宛てに通常は返すようにされます。

引数にはAddress型の配列の値を指定します。FromやToなどと同じように、メールアドレスを表わす文字列などからAddress型の値を作成して指定します。

setHeaderメソッド

次にsetHeaderメソッドです。

Set the value for this header_name. Replaces all existing header values 
with this new value. Note that RFC 822 headers must contain only US-ASCII 
characters, so a header that contains non US-ASCII characters must have 
been encoded by the caller as per the rules of RFC 2047.

Parameters:
  name - header name
  value - header value
Throws:
  IllegalWriteException - if the underlying implementation does not 
    support modification
  IllegalStateException - if this message is obtained from a READ_ONLY 
    folder.
  MessagingException -  

setHeaderメソッドは、他にヘッダーに値を設定したい場合に使います。基本的にはUS-ASCIIでしか記載できません。例えばメール送信クライアントソフトを表わすような、"X-Mailer"ヘッダーなどをヘッダーに書きたい時は、引数のnameに"X-Mailer"を、valueに"Java Mail Client"などのように指定します。

実際に試してみると次のようにメールのヘッダに表示されます。

Subject: JavaMail APIs Test
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Mailer: Java Mail Client

このメソッドは何回使っても構いません。

他にもいくつかメソッドが用意されているのですが、取り合えずここまでにしておきます。

( Written by Tatsuo Ikura )