MimeMultipart

広告

ここからはメール送信の際に添付ファイルを付けて送信する場合について見ていきます。JavaMailのサンプルプログラムでいうと"(JavaMailをインストールしたディレクトリ)¥demo¥sendfile.java"をベースに見て行きます。

添付ファイルを付けてメールを送信する場合には、メールの本文と添付ファイルを区別する必要がある為、マルチパートという仕組みを使います。これはJavaMailにだけ特化した話ではなく、MIME (Multipurpose Internet Mail Extensions)の仕組みの中で定義されているものです。

マルチパートでは本文や複数の添付ファイルを区切るために"boundary"という区切りの値を使います。JavaMailを使わない場合には自分で"boundary"を設定するのですが、JavaMailではあまり意識することはありません。具体的には大枠となる"MimeMultipart"クラスのオブジェクトを作成し、本文や添付ファイルなどの数だけ"MimeBodyPart"クラスのオブジェクトを作成して"MimeMultipart"クラスのオブジェクトに追加するだけです。

ここでは"MimeMultipart"クラスについてまず見て行きましょう。

MimeMultipartクラス

JavaMailでマルチパートを実現するために"Multipart"クラスが用意されています。まず下記のクラス図を見てください。

  • java.lang.Object
  • javax.mail.Multipart
  • public abstract class Multipart extends java.lang.Object

このクラスはabstractクラスのため、実際にはサブクラスである"MimeMultipart"クラスを使います。

  • java.lang.Object
  • javax.mail.Multipart
  • javax.mail.internet.MimeMultipart
  • public class MimeMultipart extends Multipart

コンストラクタは3つ用意されていますが、デフォルトコンストラクタだけ知っていればいいかと思います。

Default constructor. An empty MimeMultipart object is created. Its 
content type is set to "multipart/mixed". A unique boundary string
is generated and this string is setup as the "boundary" parameter
for the contentType field. 

MimeBodyParts may be added later.

"MimeMultipart"クラスのオブジェクトを作成してから、その中に収容する本文や添付ファイルなどを表す"MimeBodyPart"クラスのオブジェクト(パートと呼びます)を追加していきます。"MimeBodyPart"クラスについては後ほど見ていきますので、追加方法を先に見ておきましょう。"Multipart"クラスで用意されている"addBodyPart"メソッドを使います。

Adds a Part to the multipart. The BodyPart is appended to the list of
existing Parts.

Parameters:
  part - The Part to be appended
Throws:
  MessagingException -  
  IllegalWriteException - if the underlying implementation does not 
    support modification of existing values

このメソッドを使って、必要な数のパート部分を追加していきます。例外を出すので具体的には下記のような書き方をします。

try {
  MimeBodyPart mbp1 = new MimeBodyPart();
  MimeBodyPart mbp2 = new MimeBodyPart();

  Multipart mp = new MimeMultipart();
  mp.addBodyPart(mbp1);
  mp.addBodyPart(mbp2);
} catch (MessagingException mex) {
  mex.printStackTrace();
  Exception ex = null;
  if ((ex = mex.getNextException()) != null) {
    ex.printStackTrace();
  }
}

では次のページで、パート部分である"MimeBodyPart"クラスについて見て行きます。

( Written by Tatsuo Ikura )