- 2.1. HTMLメールを送る
- 2.2. 画像ファイルを送る
- 2.3. メールにファイルを添付する
2.3. メールにファイルを添付する
前節までの方法では、1つのメールで1種類のデータしか送る事ができませんでした。しかし実際のメーラでは、本文に加えて画像ファイルを送るなど、1つのメールに何種類ものデータを「添付」する事ができます。これは MIME を更に拡張した「MIME マルチパート(MIME Multi-part)」と呼ばれる仕様によって実現されているものです。MIME マルチパートに従ったメールでは、本文が区切り文字によって複数の部分(パート)に分割され、各パートにはそれぞれ他とは独立したデータを格納する事ができます(下図参照)。1つのパートを、別の区切り文字によって更に分割する、MIME マルチパートの入れ子構造も可能です。
JavaMail で MIME マルチパートを実現するには、「javax.mail.internet.MimeMultipart」「java.mail.internet.MimeBodyPart」(それぞれ「javax.mail.Multipart」「javax.mail.BodyPart」のサブクラス)を使用します。MimeMultipart は 区切り文字や各パートを管理するクラスで、MimeMessage クラス(や MimeBodyPart クラス)に設定する事により、Mime マルチパートを実現します。MimeBodyPart は、区切り文字で区切られた1つ1つのパートを表すクラスで、内部に送信したいテキストや画像ファイルを設定します。MimeBodyPart に MimeMultipart を設定する事によって、MIME マルチパートの入れ子構造も実現できます。以下は本文に画像ファイルを添付する例です。
MimeMessage mimeMessage=new MimeMessage(session); ... MimeMultipart multipart=new MimeMultipart(); // パート1に本文を設定 MimeBodyPart bodyPart1=new MimeBodyPart(); bodyPart1.setText("このメールには画像ファイルが添付されています。", "iso-2022-jp"); multipart.addBodyPart(bodyPart1); // マルチパートにパート1を追加 // パート2に画像ファイルを設定 MimeBodyPart bodyPart2=new MimeBodyPart(); DataSource dataSource=new FileDataSource("sample.jpeg"); DataHandler dataHandler=new DataHandler(dataSource); bodyPart2.setDataHandler(dataHandler); multipart.addBodyPart(bodyPart2); // マルチパートにパート2を追加 // メールにマルチパートを設定 mimeMessage.setContent(multipart);
プログラムの流れを大雑把に説明しますと、引数の無いコンストラクタで MimeMultipart を作成し、MimeBodyPart を「addBodyPart」メソッドで追加、最後に MimeMessage に「setContent」メソッドで設定するという流れになっています。各 MimeBodyPart にデータを設定する方法は、MimeMessage における方法と同じです。テキストの場合は「setText」か「setContent」メソッド、画像ファイルの場合には「setDataHandler」メソッドを使用します。なお MimeMessage や MimeBodyPart に MimeMultipart を設定する場合のメソッドも「setContent」ですが、こちらは引数に「javax.mail.Multipart」を取るものを使用します。
void setContent(javax.mail.Multipart multipart) throws javax.mail.MessagingException
(実習課題3)
以下のコンソールアプリケーションを作成しなさい。
- 指定したアドレスに対して、画像ファイルを添付して、メールを送信する。
- 宛先アドレスは1つ目のプログラム引数で指定する。
- 2つ目以降のプログラム引数で、添付する画像ファイルを指定する。3つ指定された場合には、3つとも添付する事。
- メールの本文については、コンソールから入力する。引数で指定する形式にはしない。