1 package com.ozacc.mail;
\r
4 import java.io.InputStream;
\r
5 import java.io.UnsupportedEncodingException;
\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
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
21 import com.ozacc.mail.impl.ByteArrayDataSource;
\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
32 /** <code>ISO-2022-JP</code> */
\r
33 public static final String JIS_CHARSET = "ISO-2022-JP";
\r
35 public static final String DOCTYPE_PUBLIC = "-//OZACC//DTD MAIL//EN";
\r
37 public static final String DOCTYPE_SYSTEM = "http://www.ozacc.com/library/dtd/ozacc-mail.dtd";
\r
39 public static final String DOCTYPE_PUBLIC_MULTIPLE = "-//OZACC//DTD MULTIPLE MAILS//EN";
\r
41 public static final String DOCTYPE_SYSTEM_MULTIPLE = "http://www.ozacc.com/library/dtd/ozacc-multiple-mails.dtd";
\r
43 private String charset = JIS_CHARSET;
\r
45 protected String text;
\r
47 protected InternetAddress from;
\r
49 protected String subject;
\r
57 protected List envelopeTo;
\r
59 protected InternetAddress returnPath;
\r
61 protected InternetAddress replyTo;
\r
63 protected String importance;
\r
65 protected Map headers = new HashMap();
\r
67 protected String htmlText;
\r
69 protected List attachmentFiles;
\r
78 * 宛先や差出人の名前をエンコードする時に使用する文字コードを指定します。
\r
80 * 日本語環境で利用する場合は通常設定する必要はありません。
\r
82 * @param charset エンコードに使用する文字コード
\r
84 public Mail(String charset) {
\r
86 this.charset = charset;
\r
91 * シャローコピー(shallow copy)です。
\r
95 * @param original コピー元のMailインスタンス
\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
115 * エンコードに使用する文字コードを返します。コンストラクタで設定されなかった場合はnullを返します。
\r
117 * @return エンコードに使用する文字コード、またはnull
\r
119 public String getCharset() {
\r
125 * 引数で指定可能な値は「high」、「normal」、「low」のいずれかです。
\r
127 * @param importance メールの重要度。「high」、「normal」、「low」のいずれか。
\r
128 * @throws IllegalArgumentException 指定可能な値以外が指定された場合
\r
130 * @see Mail.Importance
\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
136 throw new IllegalArgumentException("'" + importance + "'は、メール重要度には指定できない値です。");
\r
142 * 値は「high」、「normal」、「low」のいずれかです。
\r
144 * @return メールの重要度。「high」、「normal」、「low」のいずれか。
\r
146 public String getImportance() {
\r
151 * メールの送信先アドレスを追加します。
\r
153 * @param address 送信先アドレス
\r
155 public void addTo(InternetAddress address) {
\r
157 to = new ArrayList();
\r
163 * メールの送信先アドレスを追加します。
\r
165 * @param email 送信先アドレス
\r
166 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
168 public void addTo(String email) throws IllegalArgumentException {
\r
170 addTo(new InternetAddress(email));
\r
171 } catch (AddressException e) {
\r
172 throw new IllegalArgumentException(e.getMessage());
\r
177 * メールの送信先名とアドレスを追加します。
\r
179 * @param email 送信先アドレス
\r
181 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
183 public void addTo(String email, String name) throws IllegalArgumentException {
\r
185 addTo(new InternetAddress(email, name, charset));
\r
186 } catch (UnsupportedEncodingException e) {
\r
187 throw new IllegalArgumentException(e.getMessage());
\r
192 * メールの送信先アドレスの配列を返します。
\r
193 * 送信先アドレスが一件もセットされていないときは空の配列を返します。
\r
195 * @return 送信先アドレスの配列
\r
197 public InternetAddress[] getTo() {
\r
199 return new InternetAddress[0];
\r
201 return (InternetAddress[])to.toArray(new InternetAddress[to.size()]);
\r
207 * @param address CCのアドレス
\r
209 public void addCc(InternetAddress address) {
\r
211 cc = new ArrayList();
\r
219 * @param email CCのアドレス
\r
220 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
222 public void addCc(String email) throws IllegalArgumentException {
\r
224 addCc(new InternetAddress(email));
\r
225 } catch (AddressException e) {
\r
226 throw new IllegalArgumentException(e.getMessage());
\r
231 * CCの宛名とアドレスを追加します。
\r
233 * @param email CCのアドレス
\r
234 * @param name CCの宛名
\r
235 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
237 public void addCc(String email, String name) throws IllegalArgumentException {
\r
239 addCc(new InternetAddress(email, name, charset));
\r
240 } catch (UnsupportedEncodingException e) {
\r
241 throw new IllegalArgumentException(e.getMessage());
\r
246 * メールのCCアドレス配列を返します。
\r
247 * CCアドレスが一件もセットされていないときは空の配列を返します。
\r
249 * @return CCアドレスの配列
\r
251 public InternetAddress[] getCc() {
\r
253 return new InternetAddress[0];
\r
255 return (InternetAddress[])cc.toArray(new InternetAddress[cc.size()]);
\r
261 * @param address BCCのアドレス
\r
263 public void addBcc(InternetAddress address) {
\r
265 bcc = new ArrayList();
\r
273 * @param email BCCのアドレス
\r
274 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
276 public void addBcc(String email) throws IllegalArgumentException {
\r
278 addBcc(new InternetAddress(email));
\r
279 } catch (AddressException e) {
\r
280 throw new IllegalArgumentException(e.getMessage());
\r
285 * メールのBCCアドレスの配列を返します。
\r
286 * BCCアドレスが一件もセットされていないときは空の配列を返します。
\r
288 * @return BCCアドレスの配列
\r
290 public InternetAddress[] getBcc() {
\r
292 return new InternetAddress[0];
\r
294 return (InternetAddress[])bcc.toArray(new InternetAddress[bcc.size()]);
\r
298 * メールの差出人アドレスをセットします。
\r
300 * @param address 差出人アドレス
\r
302 public void setFrom(InternetAddress address) {
\r
307 * メールの差出人アドレスをセットします。
\r
309 * @param email 差出人アドレス
\r
310 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
312 public void setFrom(String email) throws IllegalArgumentException {
\r
314 setFrom(new InternetAddress(email));
\r
315 } catch (AddressException e) {
\r
316 throw new IllegalArgumentException(e.getMessage());
\r
321 * メールの差出人名とアドレスをセットします。
\r
323 * @param email 差出人アドレス
\r
325 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
327 public void setFrom(String email, String name) throws IllegalArgumentException {
\r
329 setFrom(new InternetAddress(email, name, charset));
\r
330 } catch (UnsupportedEncodingException e) {
\r
331 throw new IllegalArgumentException(e.getMessage());
\r
336 * メールの差出人アドレスを返します。セットされていない場合はnullを返します。
\r
338 * @return メールの差出人アドレス
\r
340 public InternetAddress getFrom() {
\r
345 * Return-Pathアドレスをセットします。
\r
347 * @param address Return-Pathアドレス
\r
349 public void setReturnPath(InternetAddress address) {
\r
350 returnPath = address;
\r
354 * Return-Pathアドレスをセットします。
\r
356 * @param email Return-Pathアドレス
\r
357 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
359 public void setReturnPath(String email) throws IllegalArgumentException {
\r
361 setReturnPath(new InternetAddress(email));
\r
362 } catch (AddressException e) {
\r
363 throw new IllegalArgumentException(e.getMessage());
\r
368 * Return-Pathアドレスを返します。
\r
370 * @return Return-Pathアドレス
\r
372 public InternetAddress getReturnPath() {
\r
379 * @param address 返信先アドレス
\r
381 public void setReplyTo(InternetAddress address) {
\r
388 * @param email 返信先アドレス
\r
389 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
391 public void setReplyTo(String email) throws IllegalArgumentException {
\r
393 setReplyTo(new InternetAddress(email));
\r
394 } catch (AddressException e) {
\r
395 throw new IllegalArgumentException(e.getMessage());
\r
400 * メールの返信先アドレスを返します。セットされていない場合はnullを返します。
\r
404 public InternetAddress getReplyTo() {
\r
409 * メールの件名を返します。セットされていない場合は空文字列を返します。
\r
413 public String getSubject() {
\r
414 if (subject == null) {
\r
423 * @param subject メールの件名
\r
425 public void setSubject(String subject) {
\r
426 this.subject = subject;
\r
431 * 本文セットされていない場合は空文字列を返します。
\r
435 public String getText() {
\r
436 if (text == null) {
\r
445 * @param text メール本文
\r
447 public void setText(String text) {
\r
452 * メールヘッダに任意のヘッダフィールドを追加します。
\r
453 * 任意ヘッダは「X-key: value」のフォーマットでメールヘッダに組み込まれます。<br>
\r
454 * 同じヘッダ名の値は上書きされます。
\r
456 * @param name 任意ヘッダ名。頭が"X-"で始まっていなければ、自動的に付与されます。
\r
457 * @param value 任意ヘッダの値
\r
459 public void addXHeader(String name, String value) {
\r
460 if (headers == null) {
\r
461 headers = new HashMap();
\r
463 if (name.startsWith("X-")) {
\r
464 headers.put(name, value);
\r
466 headers.put("X-" + name, value);
\r
471 * メールヘッダに任意のヘッダフィールドを追加します。<br>
\r
472 * <b>このメソッドはユーザが使用することを想定していません。</b>
\r
473 * 使用する際は、To や From などのフィールドをセットしないように注意してください。
\r
475 * このメソッドで設定した同じヘッダ名の値は上書きされます。
\r
478 * @param name 任意ヘッダ名
\r
479 * @param value 任意ヘッダの値
\r
481 public void addHeader(String name, String value) {
\r
482 if (headers == null) {
\r
483 headers = new HashMap();
\r
485 headers.put(name, value);
\r
489 * メールの任意ヘッダ名と値のMapインスタンスを返します。
\r
490 * 任意ヘッダが一件もセットされていないときはnullを返します。
\r
492 * このMapインスタンスへの修正はできません。(unmodifiableMapになっています。)
\r
494 * @return メールの任意ヘッダ名と値のMapインスタンス。またはnull。
\r
496 public Map getHeaders() {
\r
497 if (headers == null) {
\r
500 return Collections.unmodifiableMap(headers);
\r
505 * メールのソースに似たフォーマットで出力されます。
\r
507 * @see java.lang.Object#toString()
\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
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
530 if (htmlText != null) {
\r
531 buf.append("\n\n-----\n\n");
\r
532 buf.append(htmlText);
\r
535 return buf.toString();
\r
539 * 指定されたリストの要素をコンマ区切りの文字列に変換します。
\r
540 * nullが指定された場合は「null」文字列を返します。
\r
543 * @return リスト要素のコンマ区切り文字列
\r
545 protected String arrayToCommaDelimitedString(List list) {
\r
546 if (list == null) {
\r
549 StringBuffer sb = new StringBuffer();
\r
550 for (int i = 0, num = list.size(); i < num; i++) {
\r
554 sb.append(((InternetAddress)list.get(i)).toUnicodeString());
\r
556 return sb.toString();
\r
561 * セットされている送信先アドレス(Toアドレス)を全てクリアします。
\r
565 public void clearTo() {
\r
570 * セットされているCCアドレスを全てクリアします。
\r
574 public void clearCc() {
\r
579 * セットされているBCCアドレスを全てクリアします。
\r
583 public void clearBcc() {
\r
592 * @param htmlText HTMLの本文
\r
594 public void setHtmlText(String htmlText) {
\r
595 this.htmlText = htmlText;
\r
603 * @return HTMLの本文。またはnull。
\r
605 public String getHtmlText() {
\r
611 * 添付ファイル名には、指定されたファイルの名前が使用されます。
\r
612 * このファイルの名前は適切な拡張子が付けられている必要があります。
\r
616 * @param file 添付ファイル
\r
618 public void addFile(File file) {
\r
619 if (attachmentFiles == null) {
\r
620 initAttachmentFiles();
\r
622 addFile(file, file.getName());
\r
627 * 指定するファイル名には適切な拡張子が付けられている必要があります。
\r
631 * @param file 添付ファイル
\r
632 * @param fileName ファイル名
\r
634 public void addFile(File file, String fileName) {
\r
635 if (attachmentFiles == null) {
\r
636 initAttachmentFiles();
\r
638 attachmentFiles.add(new AttachmentFile(fileName, file));
\r
642 * 指定されたURLのファイルを添付します。
\r
643 * 指定するファイル名には適切な拡張子が付けられている必要があります。
\r
647 * @param url 添付ファイル
\r
648 * @param fileName ファイル名
\r
650 public void addFile(URL url, String fileName) {
\r
651 if (attachmentFiles == null) {
\r
652 initAttachmentFiles();
\r
654 attachmentFiles.add(new AttachmentFile(fileName, url));
\r
658 * 指定されたInputStreamをファイルとして添付します。
\r
659 * 指定するファイル名には適切な拡張子が付けられている必要があります。
\r
663 * @param is 添付ファイルを生成するInputStream
\r
664 * @param fileName ファイル名
\r
666 public void addFile(InputStream is, String fileName) {
\r
667 if (attachmentFiles == null) {
\r
668 initAttachmentFiles();
\r
670 attachmentFiles.add(new AttachmentFile(fileName, is));
\r
674 * 指定されたbyte配列をファイルとして添付します。
\r
675 * 指定するファイル名には適切な拡張子が付けられている必要があります。
\r
679 * @param bytes 添付ファイルを生成するbyte配列
\r
680 * @param fileName ファイル名
\r
682 public void addFile(byte[] bytes, String fileName) {
\r
683 if (attachmentFiles == null) {
\r
684 initAttachmentFiles();
\r
686 attachmentFiles.add(new AttachmentFile(fileName, bytes));
\r
690 * attachmentFilesプロパティを初期化。
\r
692 private void initAttachmentFiles() {
\r
693 attachmentFiles = new ArrayList();
\r
698 * 添付ファイルがセットされていない場合は、空の配列を返します。
\r
702 * @return 添付ファイルの配列。または空の配列。
\r
704 public AttachmentFile[] getAttachmentFiles() {
\r
705 if (attachmentFiles == null) {
\r
706 return new AttachmentFile[0];
\r
708 return (AttachmentFile[])attachmentFiles
\r
709 .toArray(new AttachmentFile[attachmentFiles.size()]);
\r
713 * HTMLの本文がセットされているかどうか判定します。
\r
717 * @return HTMLの本文がセットされている場合 true
\r
719 public boolean isHtmlMail() {
\r
720 return (htmlText != null);
\r
724 * ファイルが添付されているかどうか判定します。
\r
728 * @return ファイルが添付されている場合 true
\r
730 public boolean isFileAttached() {
\r
731 return attachmentFiles != null && attachmentFiles.size() > 0;
\r
735 * マルチパート・メールかどうか判定します。<br>
\r
736 * HTML本文がセットされているか、ファイルが添付されている場合に true が返されます。
\r
738 * 注: ここで判定されるマルチパートは、厳密な意味でのマルチパートではありません。
\r
742 * @return マルチパート・メールの場合 true
\r
744 public boolean isMultipartMail() {
\r
745 return isHtmlMail() || isFileAttached();
\r
749 * セットされている添付ファイルを全てクリアします。
\r
753 public void clearFile() {
\r
754 initAttachmentFiles();
\r
758 * envelope-toの宛先アドレスを追加します。
\r
760 * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
\r
761 * To、Cc、Bccアドレスには実際には送信されません。
\r
766 public void addEnvelopeTo(InternetAddress address) {
\r
767 if (envelopeTo == null) {
\r
768 envelopeTo = new ArrayList();
\r
770 envelopeTo.add(address);
\r
774 * envelope-toの宛先アドレスを追加します。
\r
776 * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
\r
777 * To、Cc、Bccアドレスには実際には送信されません。
\r
781 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
783 public void addEnvelopeTo(String email) {
\r
785 addEnvelopeTo(new InternetAddress(email));
\r
786 } catch (AddressException e) {
\r
787 throw new IllegalArgumentException(e.getMessage());
\r
792 * envelope-toの宛先アドレスを追加します。
\r
794 * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
\r
795 * To、Cc、Bccアドレスには実際には送信されません。
\r
800 public void addEnvelopeTo(InternetAddress[] addresses) {
\r
801 for (int i = 0; i < addresses.length; i++) {
\r
802 addEnvelopeTo(addresses[i]);
\r
807 * envelope-toの宛先アドレスを追加します。
\r
809 * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
\r
810 * To、Cc、Bccアドレスには実際には送信されません。
\r
814 * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
\r
816 public void addEnvelopeTo(String[] emails) {
\r
817 for (int i = 0; i < emails.length; i++) {
\r
818 addEnvelopeTo(emails[i]);
\r
823 * セットされているenvelope-toアドレスを全てクリアします。
\r
827 public void clearEnvelopeTo() {
\r
832 * envelope-toアドレス配列を返します。
\r
833 * envelope-toアドレスが一件もセットされていないときは空の配列を返します。
\r
836 * @return envelope-toアドレスの配列
\r
838 public InternetAddress[] getEnvelopeTo() {
\r
839 if (envelopeTo == null) {
\r
840 return new InternetAddress[0];
\r
842 return (InternetAddress[])envelopeTo.toArray(new InternetAddress[envelopeTo.size()]);
\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
854 * @author Tomohiro Otsuka
\r
855 * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $
\r
857 public class AttachmentFile {
\r
859 private String name;
\r
863 private InputStream is;
\r
867 private byte[] bytes = null;
\r
870 * ファイル名とファイルを指定して、このクラスのインタンスを生成します。
\r
871 * ファイル名には適切な拡張子が付けられている必要があります。
\r
873 * @param name メールに表示するファイル名
\r
874 * @param file 添付ファイル
\r
876 public AttachmentFile(String name, File file) {
\r
882 * ファイル名とInputStreamを指定して、このクラスのインタンスを生成します。
\r
883 * ファイル名には適切な拡張子が付けられている必要があります。
\r
885 * @param name メールに表示するファイル名
\r
886 * @param is 添付ファイルを生成するInputStream
\r
888 public AttachmentFile(String name, InputStream is) {
\r
894 * ファイル名とファイルロケーションのURLを指定して、このクラスのインタンスを生成します。
\r
895 * ファイル名には適切な拡張子が付けられている必要があります。
\r
897 * @param name メールに表示するファイル名
\r
898 * @param url 添付ファイルのロケーションURL
\r
900 public AttachmentFile(String name, URL url) {
\r
906 * ファイル名とbyte配列を指定して、このクラスのインタンスを生成します。
\r
907 * ファイル名には適切な拡張子が付けられている必要があります。
\r
909 * @param name メールに表示するファイル名
\r
910 * @param bytes 添付ファイルを生成するbyte配列
\r
912 public AttachmentFile(String name, byte[] bytes) {
\r
914 this.bytes = bytes;
\r
918 * 添付ファイルのDataSourceインスタンスを生成して返します。
\r
920 * @return 添付ファイルのDataSourceインスタンス
\r
922 public DataSource getDataSource() {
\r
923 if (file != null) {
\r
924 return new FileDataSource(file);
\r
928 return new URLDataSource(url);
\r
931 // InputStreamからDataSourceを生成
\r
932 String contentType = FileTypeMap.getDefaultFileTypeMap().getContentType(name);
\r
934 // InputStreamからDataSourceを生成
\r
935 return new ByteArrayDataSource(is, contentType);
\r
937 // byte配列からDataSourceを生成
\r
938 return new ByteArrayDataSource(bytes, contentType);
\r
947 public String getName() {
\r
952 * @return セットされたファイル。またはnull。
\r
954 public File getFile() {
\r
959 * @return セットされたInputStream。またはnull。
\r
961 public InputStream getInputStream() {
\r
966 * @return セットされたURL。またはnull。
\r
968 public URL getUrl() {
\r
973 * @return セットされたbyte配列。またはnull。
\r
975 public byte[] getBytes() {
\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
986 public static class Importance {
\r
989 public static final String HIGH = "high";
\r
992 public static final String NORMAL = "normal";
\r
995 public static final String LOW = "low";
\r