OSDN Git Service

CVS最新版の全ファイルを追加
[spring-ext/ozacc-mail.git] / src / java / com / ozacc / mail / fetch / impl / sk_jp / AttachmentsExtractor.java
1 /*\r
2  * @(#) $Id: AttachmentsExtractor.java,v 1.1.2.2 2005/09/25 12:51:38 otsuka Exp $\r
3  * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.\r
4  */\r
5 package com.ozacc.mail.fetch.impl.sk_jp;\r
6 \r
7 import java.io.IOException;\r
8 import java.io.InputStream;\r
9 import java.io.OutputStream;\r
10 import java.util.ArrayList;\r
11 import java.util.List;\r
12 import javax.mail.MessagingException;\r
13 import javax.mail.Part;\r
14 import javax.mail.internet.ContentType;\r
15 \r
16 /**\r
17  * 添付ファイルを抽出するPartHandlerです。\r
18  * <p>\r
19  * MultipartUtility#process()呼び出し後にgetFileNames()によって、 添付ファイル名の配列を得ることができます。\r
20  * </p>\r
21  * <p>\r
22  * ファイル名配列のindexを指定してその添付ファイルに対する\r
23  * InputStreamを得たり、渡されたOutputStreamに対して書き出すことができます。\r
24  * </p>\r
25  * @version $Revision: 1.1.2.2 $ $Date: 2005/09/25 12:51:38 $\r
26  * @author Shin\r
27  */\r
28 public class AttachmentsExtractor implements PartHandler {\r
29 \r
30         /** message/*のパートを無視します。 */\r
31         public static final int MODE_IGNORE_MESSAGE = 1;\r
32 \r
33         /** Content-Disposition: inline; パートはfilenameがあっても無視します。 */\r
34         public static final int MODE_IGNORE_INLINE = 2;\r
35 \r
36         private final int mode;\r
37 \r
38         private final List attachmentParts = new ArrayList();\r
39 \r
40         /**\r
41          * 添付ファイル一覧を得るためのPartHandlerを作成します。 message/*のパートやinline且つファイル名指定ありのパートも\r
42          * 添付ファイルとして扱います。\r
43          */\r
44         public AttachmentsExtractor() {\r
45                 this(0);\r
46         }\r
47 \r
48         /**\r
49          * 添付ファイル一覧を得るためのPartHandlerを作成します。\r
50          * @param mode 動作モード。MODE_で始まる識別子をor指定します。\r
51          */\r
52         public AttachmentsExtractor(int mode) {\r
53                 this.mode = mode;\r
54         }\r
55 \r
56         /** MultipartUtility#process()から呼びだされるメソッドです。 */\r
57         public boolean processPart(Part part, ContentType context) throws MessagingException,\r
58                                                                                                                                 IOException {\r
59                 // Apple Mail対策\r
60                 if (part.getContentType().indexOf("application/applefile") != -1) {\r
61                         return true;\r
62                 }\r
63 \r
64                 if (part.isMimeType("message/*")) {\r
65                         if ((mode & MODE_IGNORE_MESSAGE) != 0) {\r
66                                 return true;\r
67                         }\r
68                         attachmentParts.add(part);\r
69                         return true;\r
70                 }\r
71                 if (MailUtility.getFileName(part) == null) {\r
72                         return true;\r
73                 }\r
74                 if ((mode & MODE_IGNORE_INLINE) != 0 && Part.INLINE.equalsIgnoreCase(part.getDisposition())) {\r
75                         return true;\r
76                 }\r
77 \r
78                 attachmentParts.add(part);\r
79                 return true;\r
80         }\r
81 \r
82         /**\r
83          * 添付ファイル個数を返します。\r
84          */\r
85         public int getCount() {\r
86                 return attachmentParts.size();\r
87         }\r
88 \r
89         /**\r
90          * 添付ファイル名の配列を返します。\r
91          * <P>\r
92          * 添付ファイルが存在しない場合は空の配列を返します。 <BR>\r
93          * ファイル名は同一のものが複数存在する事もありえます。\r
94          * </P>\r
95          */\r
96         public String[] getFileNames() throws MessagingException {\r
97                 String[] names = new String[getCount()];\r
98                 for (int i = 0; i < names.length; i++) {\r
99                         names[i] = getFileName(i);\r
100                 }\r
101                 return names;\r
102         }\r
103 \r
104         /**\r
105          * 指定添付ファイルのファイル名を返します。\r
106          */\r
107         public String getFileName(int index) throws MessagingException {\r
108                 Part part = (Part)attachmentParts.get(index);\r
109                 String name = MailUtility.getFileName(part);\r
110                 if (name == null) {\r
111                         // 添付ファイル名が取得できない場合は、指定されていなかった場合か、\r
112                         // あるいはmessage/*のパートの場合です。\r
113                         // この場合は仮のファイル名を付けることとします。\r
114                         if (part.isMimeType("message/*")) {\r
115                                 // If part is Message, create temporary filename.\r
116                                 name = "message" + index + ".eml";\r
117                         } else {\r
118                                 name = "file" + index + ".tmp";\r
119                         }\r
120                 }\r
121                 return name;\r
122         }\r
123 \r
124         /**\r
125          * 指定添付ファイルのContent-Typeを返します。\r
126          */\r
127         public String getContentType(int index) throws MessagingException {\r
128                 return MailUtility.unfold(((Part)attachmentParts.get(index)).getContentType());\r
129         }\r
130 \r
131         /**\r
132          * 指定添付ファイルのサイズを返します。\r
133          */\r
134         public int getSize(int index) throws MessagingException {\r
135                 return ((Part)attachmentParts.get(index)).getSize();\r
136         }\r
137 \r
138         /**\r
139          * 指定添付ファイルを読み込むストリームを返します。\r
140          */\r
141         public InputStream getInputStream(int index) throws MessagingException, IOException {\r
142                 return ((Part)attachmentParts.get(index)).getInputStream();\r
143         }\r
144 \r
145         /**\r
146          * 指定添付ファイルを指定ストリームに書き出します。\r
147          */\r
148         public void writeTo(int index, OutputStream out) throws MessagingException, IOException {\r
149                 InputStream in = getInputStream(index);\r
150                 byte[] buf = new byte[1024];\r
151                 int len;\r
152                 while ((len = in.read(buf)) != -1) {\r
153                         out.write(buf, 0, len);\r
154                 }\r
155         }\r
156 \r
157         public static void main(String[] args) throws Exception {\r
158                 javax.mail.internet.MimeMessage msg = new javax.mail.internet.MimeMessage(\r
159                                 javax.mail.Session.getDefaultInstance(System.getProperties(), null), System.in);\r
160                 AttachmentsExtractor h = new AttachmentsExtractor();\r
161                 MultipartUtility.process(msg, h);\r
162                 for (int i = 0; i < h.getCount(); i++) {\r
163                         System.out.println("Attachment no : " + i);\r
164                         System.out.println("Filename = " + h.getFileName(i));\r
165                         System.out.println("******************");\r
166                         h.writeTo(i, System.out);\r
167                 }\r
168         }\r
169 }