OSDN Git Service

CVS最新版の全ファイルを追加
[spring-ext/ozacc-mail.git] / src / java / com / ozacc / mail / Mail.java
1 package com.ozacc.mail;\r
2 \r
3 import java.io.File;\r
4 import java.io.InputStream;\r
5 import java.io.UnsupportedEncodingException;\r
6 import java.net.URL;\r
7 import java.util.ArrayList;\r
8 import java.util.Collections;\r
9 import java.util.HashMap;\r
10 import java.util.Iterator;\r
11 import java.util.List;\r
12 import java.util.Map;\r
13 \r
14 import javax.activation.DataSource;\r
15 import javax.activation.FileDataSource;\r
16 import javax.activation.FileTypeMap;\r
17 import javax.activation.URLDataSource;\r
18 import javax.mail.internet.AddressException;\r
19 import javax.mail.internet.InternetAddress;\r
20 \r
21 import com.ozacc.mail.impl.ByteArrayDataSource;\r
22 \r
23 /**\r
24  * メール。\r
25  * \r
26  * @since 1.0\r
27  * @author Tomohiro Otsuka\r
28  * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $\r
29  */\r
30 public class Mail {\r
31 \r
32         /** <code>ISO-2022-JP</code> */\r
33         public static final String JIS_CHARSET = "ISO-2022-JP";\r
34 \r
35         public static final String DOCTYPE_PUBLIC = "-//OZACC//DTD MAIL//EN";\r
36 \r
37         public static final String DOCTYPE_SYSTEM = "http://www.ozacc.com/library/dtd/ozacc-mail.dtd";\r
38 \r
39         public static final String DOCTYPE_PUBLIC_MULTIPLE = "-//OZACC//DTD MULTIPLE MAILS//EN";\r
40 \r
41         public static final String DOCTYPE_SYSTEM_MULTIPLE = "http://www.ozacc.com/library/dtd/ozacc-multiple-mails.dtd";\r
42 \r
43         private String charset = JIS_CHARSET;\r
44 \r
45         protected String text;\r
46 \r
47         protected InternetAddress from;\r
48 \r
49         protected String subject;\r
50 \r
51         protected List to;\r
52 \r
53         protected List cc;\r
54 \r
55         protected List bcc;\r
56 \r
57         protected List envelopeTo;\r
58 \r
59         protected InternetAddress returnPath;\r
60 \r
61         protected InternetAddress replyTo;\r
62 \r
63         protected String importance;\r
64 \r
65         protected Map headers = new HashMap();\r
66 \r
67         protected String htmlText;\r
68 \r
69         protected List attachmentFiles;\r
70 \r
71         /**\r
72          * コンストラクタ。\r
73          */\r
74         public Mail() {}\r
75 \r
76         /**\r
77          * コンストラクタ。\r
78          * 宛先や差出人の名前をエンコードする時に使用する文字コードを指定します。\r
79          * <p>\r
80          * 日本語環境で利用する場合は通常設定する必要はありません。\r
81          * \r
82          * @param charset エンコードに使用する文字コード\r
83          */\r
84         public Mail(String charset) {\r
85                 this();\r
86                 this.charset = charset;\r
87         }\r
88 \r
89         /**\r
90          * コピーコンストラクタ。\r
91          * シャローコピー(shallow copy)です。\r
92          * \r
93          * @since 1.0.2\r
94          * \r
95          * @param original コピー元のMailインスタンス\r
96          */\r
97         public Mail(Mail original) {\r
98                 this.bcc = original.bcc;\r
99                 this.cc = original.cc;\r
100                 this.charset = original.charset;\r
101                 this.from = original.from;\r
102                 this.importance = original.importance;\r
103                 this.replyTo = original.replyTo;\r
104                 this.returnPath = original.returnPath;\r
105                 this.subject = original.subject;\r
106                 this.text = original.text;\r
107                 this.to = original.to;\r
108                 this.headers = original.headers;\r
109                 this.htmlText = original.htmlText;\r
110                 this.attachmentFiles = original.attachmentFiles;\r
111                 this.envelopeTo = original.envelopeTo;\r
112         }\r
113 \r
114         /**\r
115          * エンコードに使用する文字コードを返します。コンストラクタで設定されなかった場合はnullを返します。\r
116          * \r
117          * @return エンコードに使用する文字コード、またはnull\r
118          */\r
119         public String getCharset() {\r
120                 return charset;\r
121         }\r
122 \r
123         /**\r
124          * メールの重要度をセットします。\r
125          * 引数で指定可能な値は「high」、「normal」、「low」のいずれかです。\r
126          * \r
127          * @param importance メールの重要度。「high」、「normal」、「low」のいずれか。\r
128          * @throws IllegalArgumentException 指定可能な値以外が指定された場合\r
129          * \r
130          * @see Mail.Importance\r
131          */\r
132         public void setImportance(String importance) throws IllegalArgumentException {\r
133                 if ("high".equals(importance) || "normal".equals(importance) || "low".equals(importance)) {\r
134                         this.importance = importance;\r
135                 } else {\r
136                         throw new IllegalArgumentException("'" + importance + "'は、メール重要度には指定できない値です。");\r
137                 }\r
138         }\r
139 \r
140         /**\r
141          * メールの重要度を返します。\r
142          * 値は「high」、「normal」、「low」のいずれかです。\r
143          * \r
144          * @return メールの重要度。「high」、「normal」、「low」のいずれか。\r
145          */\r
146         public String getImportance() {\r
147                 return importance;\r
148         }\r
149 \r
150         /**\r
151          * メールの送信先アドレスを追加します。\r
152          * \r
153          * @param address 送信先アドレス\r
154          */\r
155         public void addTo(InternetAddress address) {\r
156                 if (to == null) {\r
157                         to = new ArrayList();\r
158                 }\r
159                 to.add(address);\r
160         }\r
161 \r
162         /**\r
163          * メールの送信先アドレスを追加します。\r
164          * \r
165          * @param email 送信先アドレス\r
166          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
167          */\r
168         public void addTo(String email) throws IllegalArgumentException {\r
169                 try {\r
170                         addTo(new InternetAddress(email));\r
171                 } catch (AddressException e) {\r
172                         throw new IllegalArgumentException(e.getMessage());\r
173                 }\r
174         }\r
175 \r
176         /**\r
177          * メールの送信先名とアドレスを追加します。\r
178          * \r
179          * @param email 送信先アドレス\r
180          * @param name 送信先名\r
181          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
182          */\r
183         public void addTo(String email, String name) throws IllegalArgumentException {\r
184                 try {\r
185                         addTo(new InternetAddress(email, name, charset));\r
186                 } catch (UnsupportedEncodingException e) {\r
187                         throw new IllegalArgumentException(e.getMessage());\r
188                 }\r
189         }\r
190 \r
191         /**\r
192          * メールの送信先アドレスの配列を返します。\r
193          * 送信先アドレスが一件もセットされていないときは空の配列を返します。\r
194          * \r
195          * @return 送信先アドレスの配列\r
196          */\r
197         public InternetAddress[] getTo() {\r
198                 if (to == null) {\r
199                         return new InternetAddress[0];\r
200                 }\r
201                 return (InternetAddress[])to.toArray(new InternetAddress[to.size()]);\r
202         }\r
203 \r
204         /**\r
205          * CCアドレスを追加します。\r
206          * \r
207          * @param address CCのアドレス\r
208          */\r
209         public void addCc(InternetAddress address) {\r
210                 if (cc == null) {\r
211                         cc = new ArrayList();\r
212                 }\r
213                 cc.add(address);\r
214         }\r
215 \r
216         /**\r
217          * CCアドレスを追加します。\r
218          * \r
219          * @param email CCのアドレス\r
220          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
221          */\r
222         public void addCc(String email) throws IllegalArgumentException {\r
223                 try {\r
224                         addCc(new InternetAddress(email));\r
225                 } catch (AddressException e) {\r
226                         throw new IllegalArgumentException(e.getMessage());\r
227                 }\r
228         }\r
229 \r
230         /**\r
231          * CCの宛名とアドレスを追加します。\r
232          * \r
233          * @param email CCのアドレス\r
234          * @param name CCの宛名\r
235          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
236          */\r
237         public void addCc(String email, String name) throws IllegalArgumentException {\r
238                 try {\r
239                         addCc(new InternetAddress(email, name, charset));\r
240                 } catch (UnsupportedEncodingException e) {\r
241                         throw new IllegalArgumentException(e.getMessage());\r
242                 }\r
243         }\r
244 \r
245         /**\r
246          * メールのCCアドレス配列を返します。\r
247          * CCアドレスが一件もセットされていないときは空の配列を返します。\r
248          * \r
249          * @return CCアドレスの配列\r
250          */\r
251         public InternetAddress[] getCc() {\r
252                 if (cc == null) {\r
253                         return new InternetAddress[0];\r
254                 }\r
255                 return (InternetAddress[])cc.toArray(new InternetAddress[cc.size()]);\r
256         }\r
257 \r
258         /**\r
259          * BCCアドレスを追加します。\r
260          * \r
261          * @param address BCCのアドレス\r
262          */\r
263         public void addBcc(InternetAddress address) {\r
264                 if (bcc == null) {\r
265                         bcc = new ArrayList();\r
266                 }\r
267                 bcc.add(address);\r
268         }\r
269 \r
270         /**\r
271          * BCCアドレスを追加します。\r
272          * \r
273          * @param email BCCのアドレス\r
274          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
275          */\r
276         public void addBcc(String email) throws IllegalArgumentException {\r
277                 try {\r
278                         addBcc(new InternetAddress(email));\r
279                 } catch (AddressException e) {\r
280                         throw new IllegalArgumentException(e.getMessage());\r
281                 }\r
282         }\r
283 \r
284         /**\r
285          * メールのBCCアドレスの配列を返します。\r
286          * BCCアドレスが一件もセットされていないときは空の配列を返します。\r
287          * \r
288          * @return BCCアドレスの配列\r
289          */\r
290         public InternetAddress[] getBcc() {\r
291                 if (bcc == null) {\r
292                         return new InternetAddress[0];\r
293                 }\r
294                 return (InternetAddress[])bcc.toArray(new InternetAddress[bcc.size()]);\r
295         }\r
296 \r
297         /**\r
298          * メールの差出人アドレスをセットします。\r
299          * \r
300          * @param address 差出人アドレス\r
301          */\r
302         public void setFrom(InternetAddress address) {\r
303                 from = address;\r
304         }\r
305 \r
306         /**\r
307          * メールの差出人アドレスをセットします。\r
308          * \r
309          * @param email 差出人アドレス\r
310          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
311          */\r
312         public void setFrom(String email) throws IllegalArgumentException {\r
313                 try {\r
314                         setFrom(new InternetAddress(email));\r
315                 } catch (AddressException e) {\r
316                         throw new IllegalArgumentException(e.getMessage());\r
317                 }\r
318         }\r
319 \r
320         /**\r
321          * メールの差出人名とアドレスをセットします。\r
322          * \r
323          * @param email 差出人アドレス\r
324          * @param name 差出人名\r
325          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
326          */\r
327         public void setFrom(String email, String name) throws IllegalArgumentException {\r
328                 try {\r
329                         setFrom(new InternetAddress(email, name, charset));\r
330                 } catch (UnsupportedEncodingException e) {\r
331                         throw new IllegalArgumentException(e.getMessage());\r
332                 }\r
333         }\r
334 \r
335         /**\r
336          * メールの差出人アドレスを返します。セットされていない場合はnullを返します。\r
337          * \r
338          * @return メールの差出人アドレス\r
339          */\r
340         public InternetAddress getFrom() {\r
341                 return from;\r
342         }\r
343 \r
344         /**\r
345          * Return-Pathアドレスをセットします。\r
346          * \r
347          * @param address Return-Pathアドレス\r
348          */\r
349         public void setReturnPath(InternetAddress address) {\r
350                 returnPath = address;\r
351         }\r
352 \r
353         /**\r
354          * Return-Pathアドレスをセットします。\r
355          * \r
356          * @param email Return-Pathアドレス\r
357          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
358          */\r
359         public void setReturnPath(String email) throws IllegalArgumentException {\r
360                 try {\r
361                         setReturnPath(new InternetAddress(email));\r
362                 } catch (AddressException e) {\r
363                         throw new IllegalArgumentException(e.getMessage());\r
364                 }\r
365         }\r
366 \r
367         /**\r
368          * Return-Pathアドレスを返します。\r
369          * \r
370          * @return Return-Pathアドレス\r
371          */\r
372         public InternetAddress getReturnPath() {\r
373                 return returnPath;\r
374         }\r
375 \r
376         /**\r
377          * 返信先アドレスをセットします。\r
378          * \r
379          * @param address 返信先アドレス\r
380          */\r
381         public void setReplyTo(InternetAddress address) {\r
382                 replyTo = address;\r
383         }\r
384 \r
385         /**\r
386          * 返信先アドレスをセットします。\r
387          * \r
388          * @param email 返信先アドレス\r
389          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
390          */\r
391         public void setReplyTo(String email) throws IllegalArgumentException {\r
392                 try {\r
393                         setReplyTo(new InternetAddress(email));\r
394                 } catch (AddressException e) {\r
395                         throw new IllegalArgumentException(e.getMessage());\r
396                 }\r
397         }\r
398 \r
399         /**\r
400          * メールの返信先アドレスを返します。セットされていない場合はnullを返します。\r
401          * \r
402          * @return 返信先アドレス\r
403          */\r
404         public InternetAddress getReplyTo() {\r
405                 return replyTo;\r
406         }\r
407 \r
408         /**\r
409          * メールの件名を返します。セットされていない場合は空文字列を返します。\r
410          * \r
411          * @return メールの件名\r
412          */\r
413         public String getSubject() {\r
414                 if (subject == null) {\r
415                         return "";\r
416                 }\r
417                 return subject;\r
418         }\r
419 \r
420         /**\r
421          * メールの件名をセットします。\r
422          * \r
423          * @param subject メールの件名\r
424          */\r
425         public void setSubject(String subject) {\r
426                 this.subject = subject;\r
427         }\r
428 \r
429         /**\r
430          * メール本文を返します。\r
431          * 本文セットされていない場合は空文字列を返します。\r
432          * \r
433          * @return メール本文\r
434          */\r
435         public String getText() {\r
436                 if (text == null) {\r
437                         return "";\r
438                 }\r
439                 return text;\r
440         }\r
441 \r
442         /**\r
443          * メール本文をセットします。\r
444          * \r
445          * @param text メール本文\r
446          */\r
447         public void setText(String text) {\r
448                 this.text = text;\r
449         }\r
450 \r
451         /**\r
452          * メールヘッダに任意のヘッダフィールドを追加します。\r
453          * 任意ヘッダは「X-key: value」のフォーマットでメールヘッダに組み込まれます。<br>\r
454          * 同じヘッダ名の値は上書きされます。\r
455          *  \r
456          * @param name 任意ヘッダ名。頭が"X-"で始まっていなければ、自動的に付与されます。\r
457          * @param value 任意ヘッダの値\r
458          */\r
459         public void addXHeader(String name, String value) {\r
460                 if (headers == null) {\r
461                         headers = new HashMap();\r
462                 }\r
463                 if (name.startsWith("X-")) {\r
464                         headers.put(name, value);\r
465                 } else {\r
466                         headers.put("X-" + name, value);\r
467                 }\r
468         }\r
469 \r
470         /**\r
471          * メールヘッダに任意のヘッダフィールドを追加します。<br>\r
472          * <b>このメソッドはユーザが使用することを想定していません。</b>\r
473          * 使用する際は、To や From などのフィールドをセットしないように注意してください。\r
474          * <p>\r
475          * このメソッドで設定した同じヘッダ名の値は上書きされます。\r
476          * \r
477          * @since 1.2\r
478          * @param name 任意ヘッダ名\r
479          * @param value 任意ヘッダの値\r
480          */\r
481         public void addHeader(String name, String value) {\r
482                 if (headers == null) {\r
483                         headers = new HashMap();\r
484                 }\r
485                 headers.put(name, value);\r
486         }\r
487 \r
488         /**\r
489          * メールの任意ヘッダ名と値のMapインスタンスを返します。\r
490          * 任意ヘッダが一件もセットされていないときはnullを返します。\r
491          * <p>\r
492          * このMapインスタンスへの修正はできません。(unmodifiableMapになっています。)\r
493          * \r
494          * @return メールの任意ヘッダ名と値のMapインスタンス。またはnull。\r
495          */\r
496         public Map getHeaders() {\r
497                 if (headers == null) {\r
498                         return null;\r
499                 }\r
500                 return Collections.unmodifiableMap(headers);\r
501         }\r
502 \r
503         /**\r
504          * メール内容を出力します。<br>\r
505          * メールのソースに似たフォーマットで出力されます。\r
506          * \r
507          * @see java.lang.Object#toString()\r
508          */\r
509         public String toString() {\r
510                 StringBuffer buf = new StringBuffer(1000);\r
511                 buf.append("Mail\n");\r
512                 buf.append("Return-Path: ").append(returnPath).append("\n");\r
513                 buf.append("From: ").append(from != null ? from.toUnicodeString() : null).append("\n");\r
514                 buf.append("To: ").append(arrayToCommaDelimitedString(to)).append("\n");\r
515                 buf.append("Cc: ").append(arrayToCommaDelimitedString(cc)).append("\n");\r
516                 buf.append("Bcc: ").append(arrayToCommaDelimitedString(bcc)).append("\n");\r
517                 buf.append("Subject: ").append(subject).append("\n");\r
518 \r
519                 if (headers != null) {\r
520                         for (Iterator itr = headers.keySet().iterator(); itr.hasNext();) {\r
521                                 String header = (String)itr.next();\r
522                                 String value = (String)headers.get(header);\r
523                                 buf.append(header).append(": ").append(value).append("\n");\r
524                         }\r
525                 }\r
526 \r
527                 buf.append("\n");\r
528                 buf.append(text);\r
529 \r
530                 if (htmlText != null) {\r
531                         buf.append("\n\n-----\n\n");\r
532                         buf.append(htmlText);\r
533                 }\r
534 \r
535                 return buf.toString();\r
536         }\r
537 \r
538         /**\r
539          * 指定されたリストの要素をコンマ区切りの文字列に変換します。\r
540          * nullが指定された場合は「null」文字列を返します。\r
541          * \r
542          * @param list\r
543          * @return リスト要素のコンマ区切り文字列\r
544          */\r
545         protected String arrayToCommaDelimitedString(List list) {\r
546                 if (list == null) {\r
547                         return "null";\r
548                 } else {\r
549                         StringBuffer sb = new StringBuffer();\r
550                         for (int i = 0, num = list.size(); i < num; i++) {\r
551                                 if (i > 0) {\r
552                                         sb.append(", ");\r
553                                 }\r
554                                 sb.append(((InternetAddress)list.get(i)).toUnicodeString());\r
555                         }\r
556                         return sb.toString();\r
557                 }\r
558         }\r
559 \r
560         /**\r
561          * セットされている送信先アドレス(Toアドレス)を全てクリアします。\r
562          *\r
563          * @since 1.0.2\r
564          */\r
565         public void clearTo() {\r
566                 to = null;\r
567         }\r
568 \r
569         /**\r
570          * セットされているCCアドレスを全てクリアします。\r
571          *\r
572          * @since 1.0.2\r
573          */\r
574         public void clearCc() {\r
575                 cc = null;\r
576         }\r
577 \r
578         /**\r
579          * セットされているBCCアドレスを全てクリアします。\r
580          *\r
581          * @since 1.0.2\r
582          */\r
583         public void clearBcc() {\r
584                 bcc = null;\r
585         }\r
586 \r
587         /**\r
588          * HTMLの本文をセットします。\r
589          * \r
590          * @since 1.1\r
591          * \r
592          * @param htmlText HTMLの本文\r
593          */\r
594         public void setHtmlText(String htmlText) {\r
595                 this.htmlText = htmlText;\r
596         }\r
597 \r
598         /**\r
599          * HTMLの本文を返します。\r
600          * \r
601          * @since 1.1\r
602          * \r
603          * @return HTMLの本文。またはnull。\r
604          */\r
605         public String getHtmlText() {\r
606                 return htmlText;\r
607         }\r
608 \r
609         /**\r
610          * 指定されたファイルを添付します。\r
611          * 添付ファイル名には、指定されたファイルの名前が使用されます。\r
612          * このファイルの名前は適切な拡張子が付けられている必要があります。\r
613          * \r
614          * @since 1.1\r
615          * \r
616          * @param file 添付ファイル\r
617          */\r
618         public void addFile(File file) {\r
619                 if (attachmentFiles == null) {\r
620                         initAttachmentFiles();\r
621                 }\r
622                 addFile(file, file.getName());\r
623         }\r
624 \r
625         /**\r
626          * 指定されたファイルを添付します。\r
627          * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
628          * \r
629          * @since 1.1\r
630          * \r
631          * @param file 添付ファイル\r
632          * @param fileName ファイル名\r
633          */\r
634         public void addFile(File file, String fileName) {\r
635                 if (attachmentFiles == null) {\r
636                         initAttachmentFiles();\r
637                 }\r
638                 attachmentFiles.add(new AttachmentFile(fileName, file));\r
639         }\r
640 \r
641         /**\r
642          * 指定されたURLのファイルを添付します。\r
643          * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
644          * \r
645          * @since 1.1\r
646          * \r
647          * @param url 添付ファイル\r
648          * @param fileName ファイル名\r
649          */\r
650         public void addFile(URL url, String fileName) {\r
651                 if (attachmentFiles == null) {\r
652                         initAttachmentFiles();\r
653                 }\r
654                 attachmentFiles.add(new AttachmentFile(fileName, url));\r
655         }\r
656 \r
657         /**\r
658          * 指定されたInputStreamをファイルとして添付します。\r
659          * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
660          * \r
661          * @since 1.1\r
662          * \r
663          * @param is 添付ファイルを生成するInputStream\r
664          * @param fileName ファイル名\r
665          */\r
666         public void addFile(InputStream is, String fileName) {\r
667                 if (attachmentFiles == null) {\r
668                         initAttachmentFiles();\r
669                 }\r
670                 attachmentFiles.add(new AttachmentFile(fileName, is));\r
671         }\r
672 \r
673         /**\r
674          * 指定されたbyte配列をファイルとして添付します。\r
675          * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
676          * \r
677          * @since 1.2\r
678          * \r
679          * @param bytes 添付ファイルを生成するbyte配列\r
680          * @param fileName ファイル名\r
681          */\r
682         public void addFile(byte[] bytes, String fileName) {\r
683                 if (attachmentFiles == null) {\r
684                         initAttachmentFiles();\r
685                 }\r
686                 attachmentFiles.add(new AttachmentFile(fileName, bytes));\r
687         }\r
688 \r
689         /**\r
690          * attachmentFilesプロパティを初期化。\r
691          */\r
692         private void initAttachmentFiles() {\r
693                 attachmentFiles = new ArrayList();\r
694         }\r
695 \r
696         /**\r
697          * 添付ファイルの配列を返します。\r
698          * 添付ファイルがセットされていない場合は、空の配列を返します。\r
699          * \r
700          * @since 1.1\r
701          * \r
702          * @return 添付ファイルの配列。または空の配列。\r
703          */\r
704         public AttachmentFile[] getAttachmentFiles() {\r
705                 if (attachmentFiles == null) {\r
706                         return new AttachmentFile[0];\r
707                 }\r
708                 return (AttachmentFile[])attachmentFiles\r
709                                 .toArray(new AttachmentFile[attachmentFiles.size()]);\r
710         }\r
711 \r
712         /**\r
713          * HTMLの本文がセットされているかどうか判定します。\r
714          * \r
715          * @since 1.1\r
716          * \r
717          * @return HTMLの本文がセットされている場合 true\r
718          */\r
719         public boolean isHtmlMail() {\r
720                 return (htmlText != null);\r
721         }\r
722 \r
723         /**\r
724          * ファイルが添付されているかどうか判定します。\r
725          * \r
726          * @since 1.1\r
727          * \r
728          * @return ファイルが添付されている場合 true\r
729          */\r
730         public boolean isFileAttached() {\r
731                 return attachmentFiles != null && attachmentFiles.size() > 0;\r
732         }\r
733 \r
734         /**\r
735          * マルチパート・メールかどうか判定します。<br>\r
736          * HTML本文がセットされているか、ファイルが添付されている場合に true が返されます。\r
737          * <p>\r
738          * 注: ここで判定されるマルチパートは、厳密な意味でのマルチパートではありません。\r
739          * \r
740          * @since 1.1\r
741          * \r
742          * @return マルチパート・メールの場合 true\r
743          */\r
744         public boolean isMultipartMail() {\r
745                 return isHtmlMail() || isFileAttached();\r
746         }\r
747 \r
748         /**\r
749          * セットされている添付ファイルを全てクリアします。\r
750          * \r
751          * @since 1.1\r
752          */\r
753         public void clearFile() {\r
754                 initAttachmentFiles();\r
755         }\r
756 \r
757         /**\r
758          * envelope-toの宛先アドレスを追加します。\r
759          * <p>\r
760          * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
761          * To、Cc、Bccアドレスには実際には送信されません。\r
762          * \r
763          * @since 1.2\r
764          * @param address\r
765          */\r
766         public void addEnvelopeTo(InternetAddress address) {\r
767                 if (envelopeTo == null) {\r
768                         envelopeTo = new ArrayList();\r
769                 }\r
770                 envelopeTo.add(address);\r
771         }\r
772 \r
773         /**\r
774          * envelope-toの宛先アドレスを追加します。\r
775          * <p>\r
776          * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
777          * To、Cc、Bccアドレスには実際には送信されません。\r
778          * \r
779          * @since 1.2\r
780          * @param email\r
781          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
782          */\r
783         public void addEnvelopeTo(String email) {\r
784                 try {\r
785                         addEnvelopeTo(new InternetAddress(email));\r
786                 } catch (AddressException e) {\r
787                         throw new IllegalArgumentException(e.getMessage());\r
788                 }\r
789         }\r
790 \r
791         /**\r
792          * envelope-toの宛先アドレスを追加します。\r
793          * <p>\r
794          * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
795          * To、Cc、Bccアドレスには実際には送信されません。\r
796          * \r
797          * @since 1.2\r
798          * @param addresses\r
799          */\r
800         public void addEnvelopeTo(InternetAddress[] addresses) {\r
801                 for (int i = 0; i < addresses.length; i++) {\r
802                         addEnvelopeTo(addresses[i]);\r
803                 }\r
804         }\r
805 \r
806         /**\r
807          * envelope-toの宛先アドレスを追加します。\r
808          * <p>\r
809          * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
810          * To、Cc、Bccアドレスには実際には送信されません。\r
811          * \r
812          * @since 1.2\r
813          * @param emails\r
814          * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
815          */\r
816         public void addEnvelopeTo(String[] emails) {\r
817                 for (int i = 0; i < emails.length; i++) {\r
818                         addEnvelopeTo(emails[i]);\r
819                 }\r
820         }\r
821 \r
822         /**\r
823          * セットされているenvelope-toアドレスを全てクリアします。\r
824          *\r
825          * @since 1.2\r
826          */\r
827         public void clearEnvelopeTo() {\r
828                 envelopeTo = null;\r
829         }\r
830 \r
831         /**\r
832          * envelope-toアドレス配列を返します。\r
833          * envelope-toアドレスが一件もセットされていないときは空の配列を返します。\r
834          * \r
835          * @since 1.2\r
836          * @return envelope-toアドレスの配列\r
837          */\r
838         public InternetAddress[] getEnvelopeTo() {\r
839                 if (envelopeTo == null) {\r
840                         return new InternetAddress[0];\r
841                 }\r
842                 return (InternetAddress[])envelopeTo.toArray(new InternetAddress[envelopeTo.size()]);\r
843         }\r
844 \r
845         /**\r
846          * 添付ファイル。\r
847          * <p>\r
848          * 受信メール(ReceivedMail)の添付ファイルは、常に<code>getFile()</code>メソッドで取得します。\r
849          * <code>getInputStream()</code>、<code>getUrl()</code>メソッドはnullを返します。\r
850          * 受信メールに対しては、<code>ReceivedMail.getFiles()</code>メソッドを使うと添付ファイルの\r
851          * <code>File</code>インスタンス配列を取得することができます。\r
852          * \r
853          * @since 1.1\r
854          * @author Tomohiro Otsuka\r
855          * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $\r
856          */\r
857         public class AttachmentFile {\r
858 \r
859                 private String name;\r
860 \r
861                 private File file;\r
862 \r
863                 private InputStream is;\r
864 \r
865                 private URL url;\r
866 \r
867                 private byte[] bytes = null;\r
868 \r
869                 /**\r
870                  * ファイル名とファイルを指定して、このクラスのインタンスを生成します。\r
871                  * ファイル名には適切な拡張子が付けられている必要があります。\r
872                  * \r
873                  * @param name メールに表示するファイル名\r
874                  * @param file 添付ファイル\r
875                  */\r
876                 public AttachmentFile(String name, File file) {\r
877                         this.name = name;\r
878                         this.file = file;\r
879                 }\r
880 \r
881                 /**\r
882                  * ファイル名とInputStreamを指定して、このクラスのインタンスを生成します。\r
883                  * ファイル名には適切な拡張子が付けられている必要があります。\r
884                  * \r
885                  * @param name メールに表示するファイル名\r
886                  * @param is 添付ファイルを生成するInputStream\r
887                  */\r
888                 public AttachmentFile(String name, InputStream is) {\r
889                         this.name = name;\r
890                         this.is = is;\r
891                 }\r
892 \r
893                 /**\r
894                  * ファイル名とファイルロケーションのURLを指定して、このクラスのインタンスを生成します。\r
895                  * ファイル名には適切な拡張子が付けられている必要があります。\r
896                  * \r
897                  * @param name メールに表示するファイル名\r
898                  * @param url 添付ファイルのロケーションURL\r
899                  */\r
900                 public AttachmentFile(String name, URL url) {\r
901                         this.name = name;\r
902                         this.url = url;\r
903                 }\r
904 \r
905                 /**\r
906                  * ファイル名とbyte配列を指定して、このクラスのインタンスを生成します。\r
907                  * ファイル名には適切な拡張子が付けられている必要があります。\r
908                  * \r
909                  * @param name メールに表示するファイル名\r
910                  * @param bytes 添付ファイルを生成するbyte配列\r
911                  */\r
912                 public AttachmentFile(String name, byte[] bytes) {\r
913                         this.name = name;\r
914                         this.bytes = bytes;\r
915                 }\r
916 \r
917                 /**\r
918                  * 添付ファイルのDataSourceインスタンスを生成して返します。\r
919                  * \r
920                  * @return 添付ファイルのDataSourceインスタンス\r
921                  */\r
922                 public DataSource getDataSource() {\r
923                         if (file != null) {\r
924                                 return new FileDataSource(file);\r
925                         }\r
926 \r
927                         if (url != null) {\r
928                                 return new URLDataSource(url);\r
929                         }\r
930 \r
931                         // InputStreamからDataSourceを生成\r
932                         String contentType = FileTypeMap.getDefaultFileTypeMap().getContentType(name);\r
933                         if (is != null) {\r
934                                 // InputStreamからDataSourceを生成\r
935                                 return new ByteArrayDataSource(is, contentType);\r
936                         } else {\r
937                                 // byte配列からDataSourceを生成\r
938                                 return new ByteArrayDataSource(bytes, contentType);\r
939                         }\r
940                 }\r
941 \r
942                 /**\r
943                  * 添付ファイル名を返します。\r
944                  * \r
945                  * @return 添付ファイル名\r
946                  */\r
947                 public String getName() {\r
948                         return name;\r
949                 }\r
950 \r
951                 /**\r
952                  * @return セットされたファイル。またはnull。\r
953                  */\r
954                 public File getFile() {\r
955                         return file;\r
956                 }\r
957 \r
958                 /**\r
959                  * @return セットされたInputStream。またはnull。\r
960                  */\r
961                 public InputStream getInputStream() {\r
962                         return is;\r
963                 }\r
964 \r
965                 /**\r
966                  * @return セットされたURL。またはnull。\r
967                  */\r
968                 public URL getUrl() {\r
969                         return url;\r
970                 }\r
971 \r
972                 /**\r
973                  * @return セットされたbyte配列。またはnull。\r
974                  */\r
975                 public byte[] getBytes() {\r
976                         return bytes;\r
977                 }\r
978         }\r
979 \r
980         /**\r
981          * メールの重要度。定数のみを定義。\r
982          * \r
983          * @author Tomohiro Otsuka\r
984          * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $\r
985          */\r
986         public static class Importance {\r
987 \r
988                 /** 重要度「高」 */\r
989                 public static final String HIGH = "high";\r
990 \r
991                 /** 重要度「中」 */\r
992                 public static final String NORMAL = "normal";\r
993 \r
994                 /** 重要度「低」 */\r
995                 public static final String LOW = "low";\r
996 \r
997         }\r
998 }