2 * @(#) $Id: AttachmentsExtractor.java,v 1.1.2.2 2005/09/25 12:51:38 otsuka Exp $
3 * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.
5 package com.ozacc.mail.fetch.impl.sk_jp;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.OutputStream;
10 import java.util.ArrayList;
11 import java.util.List;
12 import javax.mail.MessagingException;
13 import javax.mail.Part;
14 import javax.mail.internet.ContentType;
17 * 添付ファイルを抽出するPartHandlerです。
19 * MultipartUtility#process()呼び出し後にgetFileNames()によって、 添付ファイル名の配列を得ることができます。
22 * ファイル名配列のindexを指定してその添付ファイルに対する
23 * InputStreamを得たり、渡されたOutputStreamに対して書き出すことができます。
25 * @version $Revision: 1.1.2.2 $ $Date: 2005/09/25 12:51:38 $
28 public class AttachmentsExtractor implements PartHandler {
30 /** message/*のパートを無視します。 */
31 public static final int MODE_IGNORE_MESSAGE = 1;
33 /** Content-Disposition: inline; パートはfilenameがあっても無視します。 */
34 public static final int MODE_IGNORE_INLINE = 2;
36 private final int mode;
38 private final List<Part> attachmentParts = new ArrayList<>();
41 * 添付ファイル一覧を得るためのPartHandlerを作成します。 message/*のパートやinline且つファイル名指定ありのパートも
44 public AttachmentsExtractor() {
49 * 添付ファイル一覧を得るためのPartHandlerを作成します。
50 * @param mode 動作モード。MODE_で始まる識別子をor指定します。
52 public AttachmentsExtractor(int mode) {
56 /** MultipartUtility#process()から呼びだされるメソッドです。 */
57 public boolean processPart(Part part, ContentType context) throws MessagingException,
60 if (part.getContentType().indexOf("application/applefile") != -1) {
64 if (part.isMimeType("message/*")) {
65 if ((mode & MODE_IGNORE_MESSAGE) != 0) {
68 attachmentParts.add(part);
71 if (MailUtility.getFileName(part) == null) {
74 if ((mode & MODE_IGNORE_INLINE) != 0 && Part.INLINE.equalsIgnoreCase(part.getDisposition())) {
78 attachmentParts.add(part);
85 public int getCount() {
86 return attachmentParts.size();
92 * 添付ファイルが存在しない場合は空の配列を返します。 <BR>
93 * ファイル名は同一のものが複数存在する事もありえます。
96 public String[] getFileNames() throws MessagingException {
97 String[] names = new String[getCount()];
98 for (int i = 0; i < names.length; i++) {
99 names[i] = getFileName(i);
105 * 指定添付ファイルのファイル名を返します。
107 public String getFileName(int index) throws MessagingException {
108 Part part = attachmentParts.get(index);
109 String name = MailUtility.getFileName(part);
111 // 添付ファイル名が取得できない場合は、指定されていなかった場合か、
112 // あるいはmessage/*のパートの場合です。
113 // この場合は仮のファイル名を付けることとします。
114 if (part.isMimeType("message/*")) {
115 // If part is Message, create temporary filename.
116 name = "message" + index + ".eml";
118 name = "file" + index + ".tmp";
125 * 指定添付ファイルのContent-Typeを返します。
127 public String getContentType(int index) throws MessagingException {
128 return MailUtility.unfold((attachmentParts.get(index)).getContentType());
134 public int getSize(int index) throws MessagingException {
135 return (attachmentParts.get(index)).getSize();
139 * 指定添付ファイルを読み込むストリームを返します。
141 public InputStream getInputStream(int index) throws MessagingException, IOException {
142 return (attachmentParts.get(index)).getInputStream();
146 * 指定添付ファイルを指定ストリームに書き出します。
148 public void writeTo(int index, OutputStream out) throws MessagingException, IOException {
149 InputStream in = getInputStream(index);
150 byte[] buf = new byte[1024];
152 while ((len = in.read(buf)) != -1) {
153 out.write(buf, 0, len);
157 public static void main(String[] args) throws Exception {
158 javax.mail.internet.MimeMessage msg = new javax.mail.internet.MimeMessage(
159 javax.mail.Session.getDefaultInstance(System.getProperties(), null), System.in);
160 AttachmentsExtractor h = new AttachmentsExtractor();
161 MultipartUtility.process(msg, h);
162 for (int i = 0; i < h.getCount(); i++) {
163 System.out.println("Attachment no : " + i);
164 System.out.println("Filename = " + h.getFileName(i));
165 System.out.println("******************");
166 h.writeTo(i, System.out);