View Javadoc

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