Seafort's Room あなたは、 の来場者です.
本日は、 人目の来場者です.
昨日は、 人の来場者がありました.

メニュー

 添付ファイルはどう受信する?

前回は、テキストだけのメールを受信するプログラムでしたが、今回は、前回のプログラムを改造して、添付ファイルがあるメールを受信するプログラムを作ってみようと思います。

下のソースファイルをダウンロードして、コンパイルしてください。

 ReceiveMail02.java

添付ファイル付きのメールを自分宛に送ってください。

Subjectほげほげ
本文てすとメール
添付ファイルHello.txt

プログラムを実行してメールを受信してみましょう。

> java ReceiveMail02 [popサーバ] [アカウント] [password]
メール: 1 通
==== No.1
Subject : ほげほげ
Date : [送信日付]
Size : [サイズ]
From : [自分のメールアドレス]
To : [自分のメールアドレス]
---- MultiPart 1
本文 :
てすとメール

---- MultiPart 2
Hello.txtを保存しました。
========

きちんと表示できましたか?

 ちょっと解説

プログラムの解説をしておきます。

// メール情報を表示する
if (part instanceof Message){
 viewMail((Message)part);
}

PartがMessageの場合は、メッセージの内容(SubjectやToなど)を表示します。

// このPartの処置を取得
disposition = part.getDisposition();
// このPartに関連付けられたファイル名を取得
filename = part.getFileName();

このPartが添付であるか内包であるか取得します。添付である場合は Part.ATTACHMENT、内包である場合は Part.INLINE が取得できます。
Partに関連付けられているファイル名を取得します。

以下は、受信したメッセージによって処理内容を変える部分です。
添付ファイルがある場合は、マルチパートメッセージとなります。マルチパートメッセージとは、一つのメッセージに複数種類のコンテンツが含まれるメッセージのことになります。
受信したメッセージがマルチパートメッセージかどうかは Content-Type : で判断することが可能です。

// MimeTypeが "text/plain"
if (part.isMimeType("text/plain")){
 // このPartの処理がない
 if (disposition == null) {
  // 本文を表示する
  Object body = part.getContent();
  if (body != null) {
   System.out.println("本文 : ");
   System.out.println(body.toString());
  }
 }else{
  // Partを添付ファイルとして扱う
  attachment = true;
 }

Content-Type : text/plain なら本文を表示するだけで良いのですが、text/plainでありながら添付ファイルを持つメールが送られてくる場合があるため、Partの状態で処理を分けています。

// MimeTypeが "multipart/"
}else if (part.isMimeType("multipart/*")){
 // コンテンツをMultipartとして扱う
 Multipart mpart = (Multipart)part.getContent();
 int mcount = mpart.getCount();
 
 // 各Partの表示処理を行う
 for (int i=0; i<mcount; i++) {
  System.out.println("---- MultiPart " + Integer.toString(i+1));
  viewPart(mpart.getBodyPart(i));
 }

Content-Type : multipart/* なら各Partを取得し、Part毎に表示処理を行います。

// MimeTypeが "message/rfc822"
}else if (part.isMimeType("message/rfc822")){
 // コンテンツの表示処理を行う
 viewPart((Part)part.getContent());

Content-Type : message/rfc882 ならPartのコンテンツを取得し、表示処理を行います。

// MimeTypeが "text/html"
}else if (part.isMimeType("text/html")){
 // Partを添付ファイルとして扱う
 attachment = true;
 // 添付ファイルの拡張子を html とする
 html = ".html";

Content-Type : text/html なら Partを添付ファイルとして扱います。

// MimeTypeが 上記以外
}else{
 // Partを添付ファイルとして扱う
 attachment = true;
}

Content-Type が他の場合はすべて添付ファイルとして扱います。

// 添付ファイルを処理する
if (attachment) {
 // Partの処理が ない または 添付 である
 if (disposition == null ||
   disposition.equalsIgnoreCase(Part.ATTACHMENT)){
  
  // 添付ファイル名を決める
  if (filename != null) {
   filename = MimeUtility.decodeText(filename);
  }else{
   filename = "添付ファイル" + attachnum++ + html;
  }
  
  // Part内のデータを添付ファイルに保存する
  try{
   File f = new File(filename);
   if (f.exists()) {
    throw new IOException("同名のファイルが存在します。");
   }
   OutputStream os = new BufferedOutputStream(new FileOutputStream(f));
   InputStream is = part.getInputStream();
   int c;
   while ((c=is.read()) != -1) {
    os.write(c);
   }
   os.close();
   System.out.println(filename + "を保存しました。");
  } catch (IOException ex) {
   System.out.println("添付ファイルの保存に失敗しました。" + ex);
  }
 }
}

Partの状態、ファイル名に合わせて、添付ファイルを保存します。

今回は、添付ファイルがある場合でした。
プログラム中でPartやMessageを使用していますが、MIME形式に対応したMimePartやMimeMessageを使うともう少し便利になります。

次回は、今回のプログラムをMimePart,MimeMessageを使ったものに変更してみます。

Since : 2000/10/19
Copyright (C) 2000-2003 by seafort All Rights Reserved