|
プログラムの解説をしておきます。
// メール情報を表示する
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を使ったものに変更してみます。
|