OSDN Git Service

文字コードを UTF-8、改行コードをLFに統一
authorIwao AVE! <harawata@gmail.com>
Mon, 21 Nov 2011 16:08:13 +0000 (01:08 +0900)
committerIwao AVE! <harawata@gmail.com>
Mon, 21 Nov 2011 16:08:13 +0000 (01:08 +0900)
109 files changed:
sandbox/src/com/ozacc/mail/util/MXCheck.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/Mail.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/MailAuthenticationException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/MailBuildException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/MailBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/MailException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/MailSendException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/MultipleMailBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/NotConnectedException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/SendMail.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/SendMailPro.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/VelocityMailBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/VelocityMultipleMailBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/FetchMail.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/FetchMailPro.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/MailConverter.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/MailFetchException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/ReceivedMail.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/FetchMailImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/FetchMailProImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/MailConverterImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/AttachmentsExtractor.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/CorrectedContentTypeDataSource.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/CorrectedContentTypeDataSourceUTF7Support.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/FirstPlainPartExtractor.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/HtmlPartExtractor.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/JISDataSource.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/MailUtility.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/MultipartUtility.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/PartHandler.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/PlainPartExtractor.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/io/ByteToCharUTF7.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/io/CharCodeConverter.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/io/FromCP932Corrector.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/io/ToCP932Corrector.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/io/UnicodeCorrector.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/text/EntityRefEncoder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/text/Translator.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/impl/sk_jp/util/StringValues.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/fetch/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/AbstractXMLMailBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/ByteArrayDataSource.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/Cp932.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/DTDEntityResolver.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/JDomXMLMailBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/MimeMessageBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/OMLMimeMessage.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/SendMailImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/SendMailProImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/VelocityLogSystem.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/XMLMailBuilderImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/XMLVelocityMailBuilderImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/impl/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mailet/Mailet.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mailet/MailetRunner.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mailet/MailetWrapper.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mailet/Matcher.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mailet/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mock/AssertionFailedException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mock/EqualityCheck.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mock/MockFetchMail.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mock/MockFetchMailPro.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mock/MockMail.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mock/MockSendMail.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/mock/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/ozacc-mail.dtd [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/ozacc-multiple-mails.dtd [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/spring/MailetRunnerJob.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/spring/XMLMailFactoryBean.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/spring/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/xml/XMLBuildException.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/xml/XMLBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/xml/impl/JDomXMLBuilder.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/xml/impl/XMLBuilderImpl.java [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/xml/impl/package.html [changed mode: 0755->0644]
src/main/java/com/ozacc/mail/xml/package.html [changed mode: 0755->0644]
src/test/java/com/dumbster/smtp/SimpleSmtpServer.java [changed mode: 0755->0644]
src/test/java/com/dumbster/smtp/SmtpActionType.java [changed mode: 0755->0644]
src/test/java/com/dumbster/smtp/SmtpMessage.java [changed mode: 0755->0644]
src/test/java/com/dumbster/smtp/SmtpRequest.java [changed mode: 0755->0644]
src/test/java/com/dumbster/smtp/SmtpResponse.java [changed mode: 0755->0644]
src/test/java/com/dumbster/smtp/SmtpState.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/fetch/impl/FetchMailImplRealTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/fetch/impl/FetchMailProImplRealTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/impl/JDomXMLMailBuilderTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/impl/OMLMimeMessageTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/impl/SendMailImplRealTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/impl/SendMailImplTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/impl/SendMailProImplRealTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/impl/XMLMailBuilderImplTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/impl/XMLVelocityMailBuilderImplTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/mailet/MailetRunnerTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/mock/MockFetchMailTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/mock/MockSendMailTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/spring/XMLMailFactoryBeanTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/spring/testContext.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/test-mail1.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/test-mail2-invalid.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/test-mail3-velocity.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/test-mail4.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/test-mail5-html.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/test-mail6-cdata.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/test-mail7-multiple.xml [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/xml/impl/JDomXMLBuilderTest.java [changed mode: 0755->0644]
src/test/java/com/ozacc/mail/xml/impl/XMLBuilderImplTest.java [changed mode: 0755->0644]
xdocs/index.xml [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index b0b74bc..389c739
@@ -1,89 +1,89 @@
-package com.ozacc.mail.util;\r
-\r
-import javax.mail.internet.AddressException;\r
-import javax.mail.internet.InternetAddress;\r
-import javax.naming.NamingEnumeration;\r
-import javax.naming.NamingException;\r
-import javax.naming.directory.Attributes;\r
-import javax.naming.directory.DirContext;\r
-import javax.naming.directory.InitialDirContext;\r
-\r
-/**\r
- * DNS ¤Ë MX ¥ì¥³¡¼¥É¤¬ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë¥¯¥é¥¹¡£\r
- * Sun JDK 1.4 °Ê¾å¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\r
- * <p>\r
- * TODO: Ì¤´°À®¡£Àµ¤·¤¯Æ°ºî¤·¤Þ¤»¤ó¡£\r
- * \r
- * @since 1.1\r
- * @version $Id: MXCheck.java,v 1.1 2004/09/14 22:27:57 otsuka Exp $\r
- * @author Tomohiro Otsuka\r
- */\r
-public class MXCheck {\r
-\r
-       public static boolean isValidEmailAddress(String email, String dns) {\r
-               try {\r
-                       new InternetAddress(email, true);\r
-               } catch (AddressException e) {\r
-                       return false;\r
-               }\r
-\r
-               int pos = email.lastIndexOf("@");\r
-               String hostName = email.substring(pos + 1);\r
-               return hasMXRecord(hostName, dns);\r
-       }\r
-\r
-       /**\r
-        * »ØÄꤵ¤ì¤¿ host ¤Ë MX ¥ì¥³¡¼¥É¤¬´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë¤«\r
-        * ¤É¤¦¤«È½Äꤷ¤Þ¤¹¡£\r
-        * \r
-        * @param hostName ¸¡ºº¤¹¤ë¥Û¥¹¥È̾\r
-        * @param dns ¸¡ºº¤Ë»ÈÍѤ¹¤ë DNS ¥µ¡¼¥Ð\r
-        * @return MX ¥ì¥³¡¼¥É¤¬Â¸ºß¤¹¤ì¤Ð true\r
-        */\r
-       public static boolean hasMXRecord(String hostName, String dns) {\r
-               String name = "dns://" + dns + "/" + hostName;\r
-               try {\r
-                       DirContext ictx = new InitialDirContext();\r
-                       Attributes attrs = ictx.getAttributes(name, new String[] { "MX" });\r
-                       NamingEnumeration namingEnumeration = attrs.getAll();\r
-                       if (namingEnumeration.hasMore()) {\r
-                               return true;\r
-                       }\r
-               } catch (NamingException e) {\r
-                       return false;\r
-               }\r
-\r
-               return false;\r
-       }\r
-\r
-       /**\r
-        * »ØÄꤵ¤ì¤¿ host ¤Ë MX ¥ì¥³¡¼¥É¤¬´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«È½Äꤷ¤Þ¤¹¡£\r
-        * ¸¡ºº¤Ë»ÈÍѤ¹¤ë DNS ¥µ¡¼¥Ð¤Ï localhost ¤Ç¤¹¡£\r
-        * \r
-        * @param hostName ¸¡ºº¤¹¤ë¥Û¥¹¥È̾\r
-        * @return MX ¥ì¥³¡¼¥É¤¬Â¸ºß¤¹¤ì¤Ð true\r
-        */\r
-       public static boolean hasMXRecord(String hostName) {\r
-               return hasMXRecord(hostName, "localhost");\r
-       }\r
-\r
-       /**\r
-        * ¼¡¤Î¥³¥Þ¥ó¥É¤Ç¡¢¥Û¥¹¥È̾¤Ë MX ¥ì¥³¡¼¥É¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«Ä´¤Ù¤Þ¤¹¡£\r
-        * <p>\r
-        * <code>java com.ozacc.mail.util.MXChecker [¥Û¥¹¥È̾] [»ÈÍѤ¹¤ëDNS¥µ¡¼¥Ð]</code>\r
-        * \r
-        */\r
-       public static void main(String[] args) {\r
-               boolean result = false;\r
-               if (args.length == 1) {\r
-                       result = hasMXRecord(args[0]);\r
-               } else {\r
-                       result = hasMXRecord(args[0], args[1]);\r
-               }\r
-\r
-               if (result)\r
-                       System.out.println(args[0] + " ¤Î MX ¥ì¥³¡¼¥É¤Ï¸ºß¤·¤Þ¤¹¡£");\r
-               else\r
-                       System.out.println(args[0] + " ¤Î MX ¥ì¥³¡¼¥É¤ÏÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");\r
-       }\r
+package com.ozacc.mail.util;
+
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+
+/**
+ * DNS に MX レコードが登録されているかをチェックするクラス。
+ * Sun JDK 1.4 以上で使用できます。
+ * <p>
+ * TODO: 未完成。正しく動作しません。
+ * 
+ * @since 1.1
+ * @version $Id: MXCheck.java,v 1.1 2004/09/14 22:27:57 otsuka Exp $
+ * @author Tomohiro Otsuka
+ */
+public class MXCheck {
+
+       public static boolean isValidEmailAddress(String email, String dns) {
+               try {
+                       new InternetAddress(email, true);
+               } catch (AddressException e) {
+                       return false;
+               }
+
+               int pos = email.lastIndexOf("@");
+               String hostName = email.substring(pos + 1);
+               return hasMXRecord(hostName, dns);
+       }
+
+       /**
+        * 指定された host に MX レコードが関連付けられているか
+        * どうか判定します。
+        * 
+        * @param hostName 検査するホスト名
+        * @param dns 検査に使用する DNS サーバ
+        * @return MX レコードが存在すれば true
+        */
+       public static boolean hasMXRecord(String hostName, String dns) {
+               String name = "dns://" + dns + "/" + hostName;
+               try {
+                       DirContext ictx = new InitialDirContext();
+                       Attributes attrs = ictx.getAttributes(name, new String[] { "MX" });
+                       NamingEnumeration namingEnumeration = attrs.getAll();
+                       if (namingEnumeration.hasMore()) {
+                               return true;
+                       }
+               } catch (NamingException e) {
+                       return false;
+               }
+
+               return false;
+       }
+
+       /**
+        * 指定された host に MX レコードが関連付けられているかどうか判定します。
+        * 検査に使用する DNS サーバは localhost です。
+        * 
+        * @param hostName 検査するホスト名
+        * @return MX レコードが存在すれば true
+        */
+       public static boolean hasMXRecord(String hostName) {
+               return hasMXRecord(hostName, "localhost");
+       }
+
+       /**
+        * 次のコマンドで、ホスト名に MX レコードが存在するかどうか調べます。
+        * <p>
+        * <code>java com.ozacc.mail.util.MXChecker [ホスト名] [使用するDNSサーバ]</code>
+        * 
+        */
+       public static void main(String[] args) {
+               boolean result = false;
+               if (args.length == 1) {
+                       result = hasMXRecord(args[0]);
+               } else {
+                       result = hasMXRecord(args[0], args[1]);
+               }
+
+               if (result)
+                       System.out.println(args[0] + " の MX レコードは存在します。");
+               else
+                       System.out.println(args[0] + " の MX レコードは登録されていません。");
+       }
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index f86d3be..c2f70f3
-package com.ozacc.mail;\r
-\r
-import java.io.File;\r
-import java.io.InputStream;\r
-import java.io.UnsupportedEncodingException;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.activation.DataSource;\r
-import javax.activation.FileDataSource;\r
-import javax.activation.FileTypeMap;\r
-import javax.activation.URLDataSource;\r
-import javax.mail.internet.AddressException;\r
-import javax.mail.internet.InternetAddress;\r
-\r
-import com.ozacc.mail.impl.ByteArrayDataSource;\r
-\r
-/**\r
- * メール。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $\r
- */\r
-public class Mail {\r
-\r
-       /** <code>ISO-2022-JP</code> */\r
-       public static final String JIS_CHARSET = "ISO-2022-JP";\r
-\r
-       public static final String DOCTYPE_PUBLIC = "-//OZACC//DTD MAIL//EN";\r
-\r
-       public static final String DOCTYPE_SYSTEM = "http://www.ozacc.com/library/dtd/ozacc-mail.dtd";\r
-\r
-       public static final String DOCTYPE_PUBLIC_MULTIPLE = "-//OZACC//DTD MULTIPLE MAILS//EN";\r
-\r
-       public static final String DOCTYPE_SYSTEM_MULTIPLE = "http://www.ozacc.com/library/dtd/ozacc-multiple-mails.dtd";\r
-\r
-       private String charset = JIS_CHARSET;\r
-\r
-       protected String text;\r
-\r
-       protected InternetAddress from;\r
-\r
-       protected String subject;\r
-\r
-       protected List to;\r
-\r
-       protected List cc;\r
-\r
-       protected List bcc;\r
-\r
-       protected List envelopeTo;\r
-\r
-       protected InternetAddress returnPath;\r
-\r
-       protected InternetAddress replyTo;\r
-\r
-       protected String importance;\r
-\r
-       protected Map headers = new HashMap();\r
-\r
-       protected String htmlText;\r
-\r
-       protected List attachmentFiles;\r
-\r
-       /**\r
-        * コンストラクタ。\r
-        */\r
-       public Mail() {}\r
-\r
-       /**\r
-        * コンストラクタ。\r
-        * 宛先や差出人の名前をエンコードする時に使用する文字コードを指定します。\r
-        * <p>\r
-        * 日本語環境で利用する場合は通常設定する必要はありません。\r
-        * \r
-        * @param charset エンコードに使用する文字コード\r
-        */\r
-       public Mail(String charset) {\r
-               this();\r
-               this.charset = charset;\r
-       }\r
-\r
-       /**\r
-        * コピーコンストラクタ。\r
-        * シャローコピー(shallow copy)です。\r
-        * \r
-        * @since 1.0.2\r
-        * \r
-        * @param original コピー元のMailインスタンス\r
-        */\r
-       public Mail(Mail original) {\r
-               this.bcc = original.bcc;\r
-               this.cc = original.cc;\r
-               this.charset = original.charset;\r
-               this.from = original.from;\r
-               this.importance = original.importance;\r
-               this.replyTo = original.replyTo;\r
-               this.returnPath = original.returnPath;\r
-               this.subject = original.subject;\r
-               this.text = original.text;\r
-               this.to = original.to;\r
-               this.headers = original.headers;\r
-               this.htmlText = original.htmlText;\r
-               this.attachmentFiles = original.attachmentFiles;\r
-               this.envelopeTo = original.envelopeTo;\r
-       }\r
-\r
-       /**\r
-        * エンコードに使用する文字コードを返します。コンストラクタで設定されなかった場合はnullを返します。\r
-        * \r
-        * @return エンコードに使用する文字コード、またはnull\r
-        */\r
-       public String getCharset() {\r
-               return charset;\r
-       }\r
-\r
-       /**\r
-        * メールの重要度をセットします。\r
-        * 引数で指定可能な値は「high」、「normal」、「low」のいずれかです。\r
-        * \r
-        * @param importance メールの重要度。「high」、「normal」、「low」のいずれか。\r
-        * @throws IllegalArgumentException 指定可能な値以外が指定された場合\r
-        * \r
-        * @see Mail.Importance\r
-        */\r
-       public void setImportance(String importance) throws IllegalArgumentException {\r
-               if ("high".equals(importance) || "normal".equals(importance) || "low".equals(importance)) {\r
-                       this.importance = importance;\r
-               } else {\r
-                       throw new IllegalArgumentException("'" + importance + "'は、メール重要度には指定できない値です。");\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの重要度を返します。\r
-        * 値は「high」、「normal」、「low」のいずれかです。\r
-        * \r
-        * @return メールの重要度。「high」、「normal」、「low」のいずれか。\r
-        */\r
-       public String getImportance() {\r
-               return importance;\r
-       }\r
-\r
-       /**\r
-        * メールの送信先アドレスを追加します。\r
-        * \r
-        * @param address 送信先アドレス\r
-        */\r
-       public void addTo(InternetAddress address) {\r
-               if (to == null) {\r
-                       to = new ArrayList();\r
-               }\r
-               to.add(address);\r
-       }\r
-\r
-       /**\r
-        * メールの送信先アドレスを追加します。\r
-        * \r
-        * @param email 送信先アドレス\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void addTo(String email) throws IllegalArgumentException {\r
-               try {\r
-                       addTo(new InternetAddress(email));\r
-               } catch (AddressException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの送信先名とアドレスを追加します。\r
-        * \r
-        * @param email 送信先アドレス\r
-        * @param name 送信先名\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void addTo(String email, String name) throws IllegalArgumentException {\r
-               try {\r
-                       addTo(new InternetAddress(email, name, charset));\r
-               } catch (UnsupportedEncodingException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの送信先アドレスの配列を返します。\r
-        * 送信先アドレスが一件もセットされていないときは空の配列を返します。\r
-        * \r
-        * @return 送信先アドレスの配列\r
-        */\r
-       public InternetAddress[] getTo() {\r
-               if (to == null) {\r
-                       return new InternetAddress[0];\r
-               }\r
-               return (InternetAddress[])to.toArray(new InternetAddress[to.size()]);\r
-       }\r
-\r
-       /**\r
-        * CCアドレスを追加します。\r
-        * \r
-        * @param address CCのアドレス\r
-        */\r
-       public void addCc(InternetAddress address) {\r
-               if (cc == null) {\r
-                       cc = new ArrayList();\r
-               }\r
-               cc.add(address);\r
-       }\r
-\r
-       /**\r
-        * CCアドレスを追加します。\r
-        * \r
-        * @param email CCのアドレス\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void addCc(String email) throws IllegalArgumentException {\r
-               try {\r
-                       addCc(new InternetAddress(email));\r
-               } catch (AddressException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * CCの宛名とアドレスを追加します。\r
-        * \r
-        * @param email CCのアドレス\r
-        * @param name CCの宛名\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void addCc(String email, String name) throws IllegalArgumentException {\r
-               try {\r
-                       addCc(new InternetAddress(email, name, charset));\r
-               } catch (UnsupportedEncodingException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールのCCアドレス配列を返します。\r
-        * CCアドレスが一件もセットされていないときは空の配列を返します。\r
-        * \r
-        * @return CCアドレスの配列\r
-        */\r
-       public InternetAddress[] getCc() {\r
-               if (cc == null) {\r
-                       return new InternetAddress[0];\r
-               }\r
-               return (InternetAddress[])cc.toArray(new InternetAddress[cc.size()]);\r
-       }\r
-\r
-       /**\r
-        * BCCアドレスを追加します。\r
-        * \r
-        * @param address BCCのアドレス\r
-        */\r
-       public void addBcc(InternetAddress address) {\r
-               if (bcc == null) {\r
-                       bcc = new ArrayList();\r
-               }\r
-               bcc.add(address);\r
-       }\r
-\r
-       /**\r
-        * BCCアドレスを追加します。\r
-        * \r
-        * @param email BCCのアドレス\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void addBcc(String email) throws IllegalArgumentException {\r
-               try {\r
-                       addBcc(new InternetAddress(email));\r
-               } catch (AddressException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールのBCCアドレスの配列を返します。\r
-        * BCCアドレスが一件もセットされていないときは空の配列を返します。\r
-        * \r
-        * @return BCCアドレスの配列\r
-        */\r
-       public InternetAddress[] getBcc() {\r
-               if (bcc == null) {\r
-                       return new InternetAddress[0];\r
-               }\r
-               return (InternetAddress[])bcc.toArray(new InternetAddress[bcc.size()]);\r
-       }\r
-\r
-       /**\r
-        * メールの差出人アドレスをセットします。\r
-        * \r
-        * @param address 差出人アドレス\r
-        */\r
-       public void setFrom(InternetAddress address) {\r
-               from = address;\r
-       }\r
-\r
-       /**\r
-        * メールの差出人アドレスをセットします。\r
-        * \r
-        * @param email 差出人アドレス\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void setFrom(String email) throws IllegalArgumentException {\r
-               try {\r
-                       setFrom(new InternetAddress(email));\r
-               } catch (AddressException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの差出人名とアドレスをセットします。\r
-        * \r
-        * @param email 差出人アドレス\r
-        * @param name 差出人名\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void setFrom(String email, String name) throws IllegalArgumentException {\r
-               try {\r
-                       setFrom(new InternetAddress(email, name, charset));\r
-               } catch (UnsupportedEncodingException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの差出人アドレスを返します。セットされていない場合はnullを返します。\r
-        * \r
-        * @return メールの差出人アドレス\r
-        */\r
-       public InternetAddress getFrom() {\r
-               return from;\r
-       }\r
-\r
-       /**\r
-        * Return-Pathアドレスをセットします。\r
-        * \r
-        * @param address Return-Pathアドレス\r
-        */\r
-       public void setReturnPath(InternetAddress address) {\r
-               returnPath = address;\r
-       }\r
-\r
-       /**\r
-        * Return-Pathアドレスをセットします。\r
-        * \r
-        * @param email Return-Pathアドレス\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void setReturnPath(String email) throws IllegalArgumentException {\r
-               try {\r
-                       setReturnPath(new InternetAddress(email));\r
-               } catch (AddressException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Return-Pathアドレスを返します。\r
-        * \r
-        * @return Return-Pathアドレス\r
-        */\r
-       public InternetAddress getReturnPath() {\r
-               return returnPath;\r
-       }\r
-\r
-       /**\r
-        * 返信先アドレスをセットします。\r
-        * \r
-        * @param address 返信先アドレス\r
-        */\r
-       public void setReplyTo(InternetAddress address) {\r
-               replyTo = address;\r
-       }\r
-\r
-       /**\r
-        * 返信先アドレスをセットします。\r
-        * \r
-        * @param email 返信先アドレス\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void setReplyTo(String email) throws IllegalArgumentException {\r
-               try {\r
-                       setReplyTo(new InternetAddress(email));\r
-               } catch (AddressException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの返信先アドレスを返します。セットされていない場合はnullを返します。\r
-        * \r
-        * @return 返信先アドレス\r
-        */\r
-       public InternetAddress getReplyTo() {\r
-               return replyTo;\r
-       }\r
-\r
-       /**\r
-        * メールの件名を返します。セットされていない場合は空文字列を返します。\r
-        * \r
-        * @return メールの件名\r
-        */\r
-       public String getSubject() {\r
-               if (subject == null) {\r
-                       return "";\r
-               }\r
-               return subject;\r
-       }\r
-\r
-       /**\r
-        * メールの件名をセットします。\r
-        * \r
-        * @param subject メールの件名\r
-        */\r
-       public void setSubject(String subject) {\r
-               this.subject = subject;\r
-       }\r
-\r
-       /**\r
-        * メール本文を返します。\r
-        * 本文セットされていない場合は空文字列を返します。\r
-        * \r
-        * @return メール本文\r
-        */\r
-       public String getText() {\r
-               if (text == null) {\r
-                       return "";\r
-               }\r
-               return text;\r
-       }\r
-\r
-       /**\r
-        * メール本文をセットします。\r
-        * \r
-        * @param text メール本文\r
-        */\r
-       public void setText(String text) {\r
-               this.text = text;\r
-       }\r
-\r
-       /**\r
-        * メールヘッダに任意のヘッダフィールドを追加します。\r
-        * 任意ヘッダは「X-key: value」のフォーマットでメールヘッダに組み込まれます。<br>\r
-        * 同じヘッダ名の値は上書きされます。\r
-        *  \r
-        * @param name 任意ヘッダ名。頭が"X-"で始まっていなければ、自動的に付与されます。\r
-        * @param value 任意ヘッダの値\r
-        */\r
-       public void addXHeader(String name, String value) {\r
-               if (headers == null) {\r
-                       headers = new HashMap();\r
-               }\r
-               if (name.startsWith("X-")) {\r
-                       headers.put(name, value);\r
-               } else {\r
-                       headers.put("X-" + name, value);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールヘッダに任意のヘッダフィールドを追加します。<br>\r
-        * <b>このメソッドはユーザが使用することを想定していません。</b>\r
-        * 使用する際は、To や From などのフィールドをセットしないように注意してください。\r
-        * <p>\r
-        * このメソッドで設定した同じヘッダ名の値は上書きされます。\r
-        * \r
-        * @since 1.2\r
-        * @param name 任意ヘッダ名\r
-        * @param value 任意ヘッダの値\r
-        */\r
-       public void addHeader(String name, String value) {\r
-               if (headers == null) {\r
-                       headers = new HashMap();\r
-               }\r
-               headers.put(name, value);\r
-       }\r
-\r
-       /**\r
-        * メールの任意ヘッダ名と値のMapインスタンスを返します。\r
-        * 任意ヘッダが一件もセットされていないときはnullを返します。\r
-        * <p>\r
-        * このMapインスタンスへの修正はできません。(unmodifiableMapになっています。)\r
-        * \r
-        * @return メールの任意ヘッダ名と値のMapインスタンス。またはnull。\r
-        */\r
-       public Map getHeaders() {\r
-               if (headers == null) {\r
-                       return null;\r
-               }\r
-               return Collections.unmodifiableMap(headers);\r
-       }\r
-\r
-       /**\r
-        * メール内容を出力します。<br>\r
-        * メールのソースに似たフォーマットで出力されます。\r
-        * \r
-        * @see java.lang.Object#toString()\r
-        */\r
-       public String toString() {\r
-               StringBuffer buf = new StringBuffer(1000);\r
-               buf.append("Mail\n");\r
-               buf.append("Return-Path: ").append(returnPath).append("\n");\r
-               buf.append("From: ").append(from != null ? from.toUnicodeString() : null).append("\n");\r
-               buf.append("To: ").append(arrayToCommaDelimitedString(to)).append("\n");\r
-               buf.append("Cc: ").append(arrayToCommaDelimitedString(cc)).append("\n");\r
-               buf.append("Bcc: ").append(arrayToCommaDelimitedString(bcc)).append("\n");\r
-               buf.append("Subject: ").append(subject).append("\n");\r
-\r
-               if (headers != null) {\r
-                       for (Iterator itr = headers.keySet().iterator(); itr.hasNext();) {\r
-                               String header = (String)itr.next();\r
-                               String value = (String)headers.get(header);\r
-                               buf.append(header).append(": ").append(value).append("\n");\r
-                       }\r
-               }\r
-\r
-               buf.append("\n");\r
-               buf.append(text);\r
-\r
-               if (htmlText != null) {\r
-                       buf.append("\n\n-----\n\n");\r
-                       buf.append(htmlText);\r
-               }\r
-\r
-               return buf.toString();\r
-       }\r
-\r
-       /**\r
-        * 指定されたリストの要素をコンマ区切りの文字列に変換します。\r
-        * nullが指定された場合は「null」文字列を返します。\r
-        * \r
-        * @param list\r
-        * @return リスト要素のコンマ区切り文字列\r
-        */\r
-       protected String arrayToCommaDelimitedString(List list) {\r
-               if (list == null) {\r
-                       return "null";\r
-               } else {\r
-                       StringBuffer sb = new StringBuffer();\r
-                       for (int i = 0, num = list.size(); i < num; i++) {\r
-                               if (i > 0) {\r
-                                       sb.append(", ");\r
-                               }\r
-                               sb.append(((InternetAddress)list.get(i)).toUnicodeString());\r
-                       }\r
-                       return sb.toString();\r
-               }\r
-       }\r
-\r
-       /**\r
-        * セットされている送信先アドレス(Toアドレス)を全てクリアします。\r
-        *\r
-        * @since 1.0.2\r
-        */\r
-       public void clearTo() {\r
-               to = null;\r
-       }\r
-\r
-       /**\r
-        * セットされているCCアドレスを全てクリアします。\r
-        *\r
-        * @since 1.0.2\r
-        */\r
-       public void clearCc() {\r
-               cc = null;\r
-       }\r
-\r
-       /**\r
-        * セットされているBCCアドレスを全てクリアします。\r
-        *\r
-        * @since 1.0.2\r
-        */\r
-       public void clearBcc() {\r
-               bcc = null;\r
-       }\r
-\r
-       /**\r
-        * HTMLの本文をセットします。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @param htmlText HTMLの本文\r
-        */\r
-       public void setHtmlText(String htmlText) {\r
-               this.htmlText = htmlText;\r
-       }\r
-\r
-       /**\r
-        * HTMLの本文を返します。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @return HTMLの本文。またはnull。\r
-        */\r
-       public String getHtmlText() {\r
-               return htmlText;\r
-       }\r
-\r
-       /**\r
-        * 指定されたファイルを添付します。\r
-        * 添付ファイル名には、指定されたファイルの名前が使用されます。\r
-        * このファイルの名前は適切な拡張子が付けられている必要があります。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @param file 添付ファイル\r
-        */\r
-       public void addFile(File file) {\r
-               if (attachmentFiles == null) {\r
-                       initAttachmentFiles();\r
-               }\r
-               addFile(file, file.getName());\r
-       }\r
-\r
-       /**\r
-        * 指定されたファイルを添付します。\r
-        * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @param file 添付ファイル\r
-        * @param fileName ファイル名\r
-        */\r
-       public void addFile(File file, String fileName) {\r
-               if (attachmentFiles == null) {\r
-                       initAttachmentFiles();\r
-               }\r
-               attachmentFiles.add(new AttachmentFile(fileName, file));\r
-       }\r
-\r
-       /**\r
-        * 指定されたURLのファイルを添付します。\r
-        * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @param url 添付ファイル\r
-        * @param fileName ファイル名\r
-        */\r
-       public void addFile(URL url, String fileName) {\r
-               if (attachmentFiles == null) {\r
-                       initAttachmentFiles();\r
-               }\r
-               attachmentFiles.add(new AttachmentFile(fileName, url));\r
-       }\r
-\r
-       /**\r
-        * 指定されたInputStreamをファイルとして添付します。\r
-        * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @param is 添付ファイルを生成するInputStream\r
-        * @param fileName ファイル名\r
-        */\r
-       public void addFile(InputStream is, String fileName) {\r
-               if (attachmentFiles == null) {\r
-                       initAttachmentFiles();\r
-               }\r
-               attachmentFiles.add(new AttachmentFile(fileName, is));\r
-       }\r
-\r
-       /**\r
-        * 指定されたbyte配列をファイルとして添付します。\r
-        * 指定するファイル名には適切な拡張子が付けられている必要があります。\r
-        * \r
-        * @since 1.2\r
-        * \r
-        * @param bytes 添付ファイルを生成するbyte配列\r
-        * @param fileName ファイル名\r
-        */\r
-       public void addFile(byte[] bytes, String fileName) {\r
-               if (attachmentFiles == null) {\r
-                       initAttachmentFiles();\r
-               }\r
-               attachmentFiles.add(new AttachmentFile(fileName, bytes));\r
-       }\r
-\r
-       /**\r
-        * attachmentFilesプロパティを初期化。\r
-        */\r
-       private void initAttachmentFiles() {\r
-               attachmentFiles = new ArrayList();\r
-       }\r
-\r
-       /**\r
-        * 添付ファイルの配列を返します。\r
-        * 添付ファイルがセットされていない場合は、空の配列を返します。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @return 添付ファイルの配列。または空の配列。\r
-        */\r
-       public AttachmentFile[] getAttachmentFiles() {\r
-               if (attachmentFiles == null) {\r
-                       return new AttachmentFile[0];\r
-               }\r
-               return (AttachmentFile[])attachmentFiles\r
-                               .toArray(new AttachmentFile[attachmentFiles.size()]);\r
-       }\r
-\r
-       /**\r
-        * HTMLの本文がセットされているかどうか判定します。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @return HTMLの本文がセットされている場合 true\r
-        */\r
-       public boolean isHtmlMail() {\r
-               return (htmlText != null);\r
-       }\r
-\r
-       /**\r
-        * ファイルが添付されているかどうか判定します。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @return ファイルが添付されている場合 true\r
-        */\r
-       public boolean isFileAttached() {\r
-               return attachmentFiles != null && attachmentFiles.size() > 0;\r
-       }\r
-\r
-       /**\r
-        * マルチパート・メールかどうか判定します。<br>\r
-        * HTML本文がセットされているか、ファイルが添付されている場合に true が返されます。\r
-        * <p>\r
-        * 注: ここで判定されるマルチパートは、厳密な意味でのマルチパートではありません。\r
-        * \r
-        * @since 1.1\r
-        * \r
-        * @return マルチパート・メールの場合 true\r
-        */\r
-       public boolean isMultipartMail() {\r
-               return isHtmlMail() || isFileAttached();\r
-       }\r
-\r
-       /**\r
-        * セットされている添付ファイルを全てクリアします。\r
-        * \r
-        * @since 1.1\r
-        */\r
-       public void clearFile() {\r
-               initAttachmentFiles();\r
-       }\r
-\r
-       /**\r
-        * envelope-toの宛先アドレスを追加します。\r
-        * <p>\r
-        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
-        * To、Cc、Bccアドレスには実際には送信されません。\r
-        * \r
-        * @since 1.2\r
-        * @param address\r
-        */\r
-       public void addEnvelopeTo(InternetAddress address) {\r
-               if (envelopeTo == null) {\r
-                       envelopeTo = new ArrayList();\r
-               }\r
-               envelopeTo.add(address);\r
-       }\r
-\r
-       /**\r
-        * envelope-toの宛先アドレスを追加します。\r
-        * <p>\r
-        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
-        * To、Cc、Bccアドレスには実際には送信されません。\r
-        * \r
-        * @since 1.2\r
-        * @param email\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void addEnvelopeTo(String email) {\r
-               try {\r
-                       addEnvelopeTo(new InternetAddress(email));\r
-               } catch (AddressException e) {\r
-                       throw new IllegalArgumentException(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * envelope-toの宛先アドレスを追加します。\r
-        * <p>\r
-        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
-        * To、Cc、Bccアドレスには実際には送信されません。\r
-        * \r
-        * @since 1.2\r
-        * @param addresses\r
-        */\r
-       public void addEnvelopeTo(InternetAddress[] addresses) {\r
-               for (int i = 0; i < addresses.length; i++) {\r
-                       addEnvelopeTo(addresses[i]);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * envelope-toの宛先アドレスを追加します。\r
-        * <p>\r
-        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、\r
-        * To、Cc、Bccアドレスには実際には送信されません。\r
-        * \r
-        * @since 1.2\r
-        * @param emails\r
-        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合\r
-        */\r
-       public void addEnvelopeTo(String[] emails) {\r
-               for (int i = 0; i < emails.length; i++) {\r
-                       addEnvelopeTo(emails[i]);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * セットされているenvelope-toアドレスを全てクリアします。\r
-        *\r
-        * @since 1.2\r
-        */\r
-       public void clearEnvelopeTo() {\r
-               envelopeTo = null;\r
-       }\r
-\r
-       /**\r
-        * envelope-toアドレス配列を返します。\r
-        * envelope-toアドレスが一件もセットされていないときは空の配列を返します。\r
-        * \r
-        * @since 1.2\r
-        * @return envelope-toアドレスの配列\r
-        */\r
-       public InternetAddress[] getEnvelopeTo() {\r
-               if (envelopeTo == null) {\r
-                       return new InternetAddress[0];\r
-               }\r
-               return (InternetAddress[])envelopeTo.toArray(new InternetAddress[envelopeTo.size()]);\r
-       }\r
-\r
-       /**\r
-        * 添付ファイル。\r
-        * <p>\r
-        * 受信メール(ReceivedMail)の添付ファイルは、常に<code>getFile()</code>メソッドで取得します。\r
-        * <code>getInputStream()</code>、<code>getUrl()</code>メソッドはnullを返します。\r
-        * 受信メールに対しては、<code>ReceivedMail.getFiles()</code>メソッドを使うと添付ファイルの\r
-        * <code>File</code>インスタンス配列を取得することができます。\r
-        * \r
-        * @since 1.1\r
-        * @author Tomohiro Otsuka\r
-        * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $\r
-        */\r
-       public class AttachmentFile {\r
-\r
-               private String name;\r
-\r
-               private File file;\r
-\r
-               private InputStream is;\r
-\r
-               private URL url;\r
-\r
-               private byte[] bytes = null;\r
-\r
-               /**\r
-                * ファイル名とファイルを指定して、このクラスのインタンスを生成します。\r
-                * ファイル名には適切な拡張子が付けられている必要があります。\r
-                * \r
-                * @param name メールに表示するファイル名\r
-                * @param file 添付ファイル\r
-                */\r
-               public AttachmentFile(String name, File file) {\r
-                       this.name = name;\r
-                       this.file = file;\r
-               }\r
-\r
-               /**\r
-                * ファイル名とInputStreamを指定して、このクラスのインタンスを生成します。\r
-                * ファイル名には適切な拡張子が付けられている必要があります。\r
-                * \r
-                * @param name メールに表示するファイル名\r
-                * @param is 添付ファイルを生成するInputStream\r
-                */\r
-               public AttachmentFile(String name, InputStream is) {\r
-                       this.name = name;\r
-                       this.is = is;\r
-               }\r
-\r
-               /**\r
-                * ファイル名とファイルロケーションのURLを指定して、このクラスのインタンスを生成します。\r
-                * ファイル名には適切な拡張子が付けられている必要があります。\r
-                * \r
-                * @param name メールに表示するファイル名\r
-                * @param url 添付ファイルのロケーションURL\r
-                */\r
-               public AttachmentFile(String name, URL url) {\r
-                       this.name = name;\r
-                       this.url = url;\r
-               }\r
-\r
-               /**\r
-                * ファイル名とbyte配列を指定して、このクラスのインタンスを生成します。\r
-                * ファイル名には適切な拡張子が付けられている必要があります。\r
-                * \r
-                * @param name メールに表示するファイル名\r
-                * @param bytes 添付ファイルを生成するbyte配列\r
-                */\r
-               public AttachmentFile(String name, byte[] bytes) {\r
-                       this.name = name;\r
-                       this.bytes = bytes;\r
-               }\r
-\r
-               /**\r
-                * 添付ファイルのDataSourceインスタンスを生成して返します。\r
-                * \r
-                * @return 添付ファイルのDataSourceインスタンス\r
-                */\r
-               public DataSource getDataSource() {\r
-                       if (file != null) {\r
-                               return new FileDataSource(file);\r
-                       }\r
-\r
-                       if (url != null) {\r
-                               return new URLDataSource(url);\r
-                       }\r
-\r
-                       // InputStreamからDataSourceを生成\r
-                       String contentType = FileTypeMap.getDefaultFileTypeMap().getContentType(name);\r
-                       if (is != null) {\r
-                               // InputStreamからDataSourceを生成\r
-                               return new ByteArrayDataSource(is, contentType);\r
-                       } else {\r
-                               // byte配列からDataSourceを生成\r
-                               return new ByteArrayDataSource(bytes, contentType);\r
-                       }\r
-               }\r
-\r
-               /**\r
-                * 添付ファイル名を返します。\r
-                * \r
-                * @return 添付ファイル名\r
-                */\r
-               public String getName() {\r
-                       return name;\r
-               }\r
-\r
-               /**\r
-                * @return セットされたファイル。またはnull。\r
-                */\r
-               public File getFile() {\r
-                       return file;\r
-               }\r
-\r
-               /**\r
-                * @return セットされたInputStream。またはnull。\r
-                */\r
-               public InputStream getInputStream() {\r
-                       return is;\r
-               }\r
-\r
-               /**\r
-                * @return セットされたURL。またはnull。\r
-                */\r
-               public URL getUrl() {\r
-                       return url;\r
-               }\r
-\r
-               /**\r
-                * @return セットされたbyte配列。またはnull。\r
-                */\r
-               public byte[] getBytes() {\r
-                       return bytes;\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの重要度。定数のみを定義。\r
-        * \r
-        * @author Tomohiro Otsuka\r
-        * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $\r
-        */\r
-       public static class Importance {\r
-\r
-               /** 重要度「高」 */\r
-               public static final String HIGH = "high";\r
-\r
-               /** 重要度「中」 */\r
-               public static final String NORMAL = "normal";\r
-\r
-               /** 重要度「低」 */\r
-               public static final String LOW = "low";\r
-\r
-       }\r
+package com.ozacc.mail;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.activation.FileTypeMap;
+import javax.activation.URLDataSource;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+
+import com.ozacc.mail.impl.ByteArrayDataSource;
+
+/**
+ * メール。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $
+ */
+public class Mail {
+
+       /** <code>ISO-2022-JP</code> */
+       public static final String JIS_CHARSET = "ISO-2022-JP";
+
+       public static final String DOCTYPE_PUBLIC = "-//OZACC//DTD MAIL//EN";
+
+       public static final String DOCTYPE_SYSTEM = "http://www.ozacc.com/library/dtd/ozacc-mail.dtd";
+
+       public static final String DOCTYPE_PUBLIC_MULTIPLE = "-//OZACC//DTD MULTIPLE MAILS//EN";
+
+       public static final String DOCTYPE_SYSTEM_MULTIPLE = "http://www.ozacc.com/library/dtd/ozacc-multiple-mails.dtd";
+
+       private String charset = JIS_CHARSET;
+
+       protected String text;
+
+       protected InternetAddress from;
+
+       protected String subject;
+
+       protected List to;
+
+       protected List cc;
+
+       protected List bcc;
+
+       protected List envelopeTo;
+
+       protected InternetAddress returnPath;
+
+       protected InternetAddress replyTo;
+
+       protected String importance;
+
+       protected Map headers = new HashMap();
+
+       protected String htmlText;
+
+       protected List attachmentFiles;
+
+       /**
+        * コンストラクタ。
+        */
+       public Mail() {}
+
+       /**
+        * コンストラクタ。
+        * 宛先や差出人の名前をエンコードする時に使用する文字コードを指定します。
+        * <p>
+        * 日本語環境で利用する場合は通常設定する必要はありません。
+        * 
+        * @param charset エンコードに使用する文字コード
+        */
+       public Mail(String charset) {
+               this();
+               this.charset = charset;
+       }
+
+       /**
+        * コピーコンストラクタ。
+        * シャローコピー(shallow copy)です。
+        * 
+        * @since 1.0.2
+        * 
+        * @param original コピー元のMailインスタンス
+        */
+       public Mail(Mail original) {
+               this.bcc = original.bcc;
+               this.cc = original.cc;
+               this.charset = original.charset;
+               this.from = original.from;
+               this.importance = original.importance;
+               this.replyTo = original.replyTo;
+               this.returnPath = original.returnPath;
+               this.subject = original.subject;
+               this.text = original.text;
+               this.to = original.to;
+               this.headers = original.headers;
+               this.htmlText = original.htmlText;
+               this.attachmentFiles = original.attachmentFiles;
+               this.envelopeTo = original.envelopeTo;
+       }
+
+       /**
+        * エンコードに使用する文字コードを返します。コンストラクタで設定されなかった場合はnullを返します。
+        * 
+        * @return エンコードに使用する文字コード、またはnull
+        */
+       public String getCharset() {
+               return charset;
+       }
+
+       /**
+        * メールの重要度をセットします。
+        * 引数で指定可能な値は「high」、「normal」、「low」のいずれかです。
+        * 
+        * @param importance メールの重要度。「high」、「normal」、「low」のいずれか。
+        * @throws IllegalArgumentException 指定可能な値以外が指定された場合
+        * 
+        * @see Mail.Importance
+        */
+       public void setImportance(String importance) throws IllegalArgumentException {
+               if ("high".equals(importance) || "normal".equals(importance) || "low".equals(importance)) {
+                       this.importance = importance;
+               } else {
+                       throw new IllegalArgumentException("'" + importance + "'は、メール重要度には指定できない値です。");
+               }
+       }
+
+       /**
+        * メールの重要度を返します。
+        * 値は「high」、「normal」、「low」のいずれかです。
+        * 
+        * @return メールの重要度。「high」、「normal」、「low」のいずれか。
+        */
+       public String getImportance() {
+               return importance;
+       }
+
+       /**
+        * メールの送信先アドレスを追加します。
+        * 
+        * @param address 送信先アドレス
+        */
+       public void addTo(InternetAddress address) {
+               if (to == null) {
+                       to = new ArrayList();
+               }
+               to.add(address);
+       }
+
+       /**
+        * メールの送信先アドレスを追加します。
+        * 
+        * @param email 送信先アドレス
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void addTo(String email) throws IllegalArgumentException {
+               try {
+                       addTo(new InternetAddress(email));
+               } catch (AddressException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * メールの送信先名とアドレスを追加します。
+        * 
+        * @param email 送信先アドレス
+        * @param name 送信先名
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void addTo(String email, String name) throws IllegalArgumentException {
+               try {
+                       addTo(new InternetAddress(email, name, charset));
+               } catch (UnsupportedEncodingException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * メールの送信先アドレスの配列を返します。
+        * 送信先アドレスが一件もセットされていないときは空の配列を返します。
+        * 
+        * @return 送信先アドレスの配列
+        */
+       public InternetAddress[] getTo() {
+               if (to == null) {
+                       return new InternetAddress[0];
+               }
+               return (InternetAddress[])to.toArray(new InternetAddress[to.size()]);
+       }
+
+       /**
+        * CCアドレスを追加します。
+        * 
+        * @param address CCのアドレス
+        */
+       public void addCc(InternetAddress address) {
+               if (cc == null) {
+                       cc = new ArrayList();
+               }
+               cc.add(address);
+       }
+
+       /**
+        * CCアドレスを追加します。
+        * 
+        * @param email CCのアドレス
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void addCc(String email) throws IllegalArgumentException {
+               try {
+                       addCc(new InternetAddress(email));
+               } catch (AddressException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * CCの宛名とアドレスを追加します。
+        * 
+        * @param email CCのアドレス
+        * @param name CCの宛名
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void addCc(String email, String name) throws IllegalArgumentException {
+               try {
+                       addCc(new InternetAddress(email, name, charset));
+               } catch (UnsupportedEncodingException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * メールのCCアドレス配列を返します。
+        * CCアドレスが一件もセットされていないときは空の配列を返します。
+        * 
+        * @return CCアドレスの配列
+        */
+       public InternetAddress[] getCc() {
+               if (cc == null) {
+                       return new InternetAddress[0];
+               }
+               return (InternetAddress[])cc.toArray(new InternetAddress[cc.size()]);
+       }
+
+       /**
+        * BCCアドレスを追加します。
+        * 
+        * @param address BCCのアドレス
+        */
+       public void addBcc(InternetAddress address) {
+               if (bcc == null) {
+                       bcc = new ArrayList();
+               }
+               bcc.add(address);
+       }
+
+       /**
+        * BCCアドレスを追加します。
+        * 
+        * @param email BCCのアドレス
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void addBcc(String email) throws IllegalArgumentException {
+               try {
+                       addBcc(new InternetAddress(email));
+               } catch (AddressException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * メールのBCCアドレスの配列を返します。
+        * BCCアドレスが一件もセットされていないときは空の配列を返します。
+        * 
+        * @return BCCアドレスの配列
+        */
+       public InternetAddress[] getBcc() {
+               if (bcc == null) {
+                       return new InternetAddress[0];
+               }
+               return (InternetAddress[])bcc.toArray(new InternetAddress[bcc.size()]);
+       }
+
+       /**
+        * メールの差出人アドレスをセットします。
+        * 
+        * @param address 差出人アドレス
+        */
+       public void setFrom(InternetAddress address) {
+               from = address;
+       }
+
+       /**
+        * メールの差出人アドレスをセットします。
+        * 
+        * @param email 差出人アドレス
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void setFrom(String email) throws IllegalArgumentException {
+               try {
+                       setFrom(new InternetAddress(email));
+               } catch (AddressException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * メールの差出人名とアドレスをセットします。
+        * 
+        * @param email 差出人アドレス
+        * @param name 差出人名
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void setFrom(String email, String name) throws IllegalArgumentException {
+               try {
+                       setFrom(new InternetAddress(email, name, charset));
+               } catch (UnsupportedEncodingException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * メールの差出人アドレスを返します。セットされていない場合はnullを返します。
+        * 
+        * @return メールの差出人アドレス
+        */
+       public InternetAddress getFrom() {
+               return from;
+       }
+
+       /**
+        * Return-Pathアドレスをセットします。
+        * 
+        * @param address Return-Pathアドレス
+        */
+       public void setReturnPath(InternetAddress address) {
+               returnPath = address;
+       }
+
+       /**
+        * Return-Pathアドレスをセットします。
+        * 
+        * @param email Return-Pathアドレス
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void setReturnPath(String email) throws IllegalArgumentException {
+               try {
+                       setReturnPath(new InternetAddress(email));
+               } catch (AddressException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * Return-Pathアドレスを返します。
+        * 
+        * @return Return-Pathアドレス
+        */
+       public InternetAddress getReturnPath() {
+               return returnPath;
+       }
+
+       /**
+        * 返信先アドレスをセットします。
+        * 
+        * @param address 返信先アドレス
+        */
+       public void setReplyTo(InternetAddress address) {
+               replyTo = address;
+       }
+
+       /**
+        * 返信先アドレスをセットします。
+        * 
+        * @param email 返信先アドレス
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void setReplyTo(String email) throws IllegalArgumentException {
+               try {
+                       setReplyTo(new InternetAddress(email));
+               } catch (AddressException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * メールの返信先アドレスを返します。セットされていない場合はnullを返します。
+        * 
+        * @return 返信先アドレス
+        */
+       public InternetAddress getReplyTo() {
+               return replyTo;
+       }
+
+       /**
+        * メールの件名を返します。セットされていない場合は空文字列を返します。
+        * 
+        * @return メールの件名
+        */
+       public String getSubject() {
+               if (subject == null) {
+                       return "";
+               }
+               return subject;
+       }
+
+       /**
+        * メールの件名をセットします。
+        * 
+        * @param subject メールの件名
+        */
+       public void setSubject(String subject) {
+               this.subject = subject;
+       }
+
+       /**
+        * メール本文を返します。
+        * 本文セットされていない場合は空文字列を返します。
+        * 
+        * @return メール本文
+        */
+       public String getText() {
+               if (text == null) {
+                       return "";
+               }
+               return text;
+       }
+
+       /**
+        * メール本文をセットします。
+        * 
+        * @param text メール本文
+        */
+       public void setText(String text) {
+               this.text = text;
+       }
+
+       /**
+        * メールヘッダに任意のヘッダフィールドを追加します。
+        * 任意ヘッダは「X-key: value」のフォーマットでメールヘッダに組み込まれます。<br>
+        * 同じヘッダ名の値は上書きされます。
+        *  
+        * @param name 任意ヘッダ名。頭が"X-"で始まっていなければ、自動的に付与されます。
+        * @param value 任意ヘッダの値
+        */
+       public void addXHeader(String name, String value) {
+               if (headers == null) {
+                       headers = new HashMap();
+               }
+               if (name.startsWith("X-")) {
+                       headers.put(name, value);
+               } else {
+                       headers.put("X-" + name, value);
+               }
+       }
+
+       /**
+        * メールヘッダに任意のヘッダフィールドを追加します。<br>
+        * <b>このメソッドはユーザが使用することを想定していません。</b>
+        * 使用する際は、To や From などのフィールドをセットしないように注意してください。
+        * <p>
+        * このメソッドで設定した同じヘッダ名の値は上書きされます。
+        * 
+        * @since 1.2
+        * @param name 任意ヘッダ名
+        * @param value 任意ヘッダの値
+        */
+       public void addHeader(String name, String value) {
+               if (headers == null) {
+                       headers = new HashMap();
+               }
+               headers.put(name, value);
+       }
+
+       /**
+        * メールの任意ヘッダ名と値のMapインスタンスを返します。
+        * 任意ヘッダが一件もセットされていないときはnullを返します。
+        * <p>
+        * このMapインスタンスへの修正はできません。(unmodifiableMapになっています。)
+        * 
+        * @return メールの任意ヘッダ名と値のMapインスタンス。またはnull。
+        */
+       public Map getHeaders() {
+               if (headers == null) {
+                       return null;
+               }
+               return Collections.unmodifiableMap(headers);
+       }
+
+       /**
+        * メール内容を出力します。<br>
+        * メールのソースに似たフォーマットで出力されます。
+        * 
+        * @see java.lang.Object#toString()
+        */
+       public String toString() {
+               StringBuffer buf = new StringBuffer(1000);
+               buf.append("Mail\n");
+               buf.append("Return-Path: ").append(returnPath).append("\n");
+               buf.append("From: ").append(from != null ? from.toUnicodeString() : null).append("\n");
+               buf.append("To: ").append(arrayToCommaDelimitedString(to)).append("\n");
+               buf.append("Cc: ").append(arrayToCommaDelimitedString(cc)).append("\n");
+               buf.append("Bcc: ").append(arrayToCommaDelimitedString(bcc)).append("\n");
+               buf.append("Subject: ").append(subject).append("\n");
+
+               if (headers != null) {
+                       for (Iterator itr = headers.keySet().iterator(); itr.hasNext();) {
+                               String header = (String)itr.next();
+                               String value = (String)headers.get(header);
+                               buf.append(header).append(": ").append(value).append("\n");
+                       }
+               }
+
+               buf.append("\n");
+               buf.append(text);
+
+               if (htmlText != null) {
+                       buf.append("\n\n-----\n\n");
+                       buf.append(htmlText);
+               }
+
+               return buf.toString();
+       }
+
+       /**
+        * 指定されたリストの要素をコンマ区切りの文字列に変換します。
+        * nullが指定された場合は「null」文字列を返します。
+        * 
+        * @param list
+        * @return リスト要素のコンマ区切り文字列
+        */
+       protected String arrayToCommaDelimitedString(List list) {
+               if (list == null) {
+                       return "null";
+               } else {
+                       StringBuffer sb = new StringBuffer();
+                       for (int i = 0, num = list.size(); i < num; i++) {
+                               if (i > 0) {
+                                       sb.append(", ");
+                               }
+                               sb.append(((InternetAddress)list.get(i)).toUnicodeString());
+                       }
+                       return sb.toString();
+               }
+       }
+
+       /**
+        * セットされている送信先アドレス(Toアドレス)を全てクリアします。
+        *
+        * @since 1.0.2
+        */
+       public void clearTo() {
+               to = null;
+       }
+
+       /**
+        * セットされているCCアドレスを全てクリアします。
+        *
+        * @since 1.0.2
+        */
+       public void clearCc() {
+               cc = null;
+       }
+
+       /**
+        * セットされているBCCアドレスを全てクリアします。
+        *
+        * @since 1.0.2
+        */
+       public void clearBcc() {
+               bcc = null;
+       }
+
+       /**
+        * HTMLの本文をセットします。
+        * 
+        * @since 1.1
+        * 
+        * @param htmlText HTMLの本文
+        */
+       public void setHtmlText(String htmlText) {
+               this.htmlText = htmlText;
+       }
+
+       /**
+        * HTMLの本文を返します。
+        * 
+        * @since 1.1
+        * 
+        * @return HTMLの本文。またはnull。
+        */
+       public String getHtmlText() {
+               return htmlText;
+       }
+
+       /**
+        * 指定されたファイルを添付します。
+        * 添付ファイル名には、指定されたファイルの名前が使用されます。
+        * このファイルの名前は適切な拡張子が付けられている必要があります。
+        * 
+        * @since 1.1
+        * 
+        * @param file 添付ファイル
+        */
+       public void addFile(File file) {
+               if (attachmentFiles == null) {
+                       initAttachmentFiles();
+               }
+               addFile(file, file.getName());
+       }
+
+       /**
+        * 指定されたファイルを添付します。
+        * 指定するファイル名には適切な拡張子が付けられている必要があります。
+        * 
+        * @since 1.1
+        * 
+        * @param file 添付ファイル
+        * @param fileName ファイル名
+        */
+       public void addFile(File file, String fileName) {
+               if (attachmentFiles == null) {
+                       initAttachmentFiles();
+               }
+               attachmentFiles.add(new AttachmentFile(fileName, file));
+       }
+
+       /**
+        * 指定されたURLのファイルを添付します。
+        * 指定するファイル名には適切な拡張子が付けられている必要があります。
+        * 
+        * @since 1.1
+        * 
+        * @param url 添付ファイル
+        * @param fileName ファイル名
+        */
+       public void addFile(URL url, String fileName) {
+               if (attachmentFiles == null) {
+                       initAttachmentFiles();
+               }
+               attachmentFiles.add(new AttachmentFile(fileName, url));
+       }
+
+       /**
+        * 指定されたInputStreamをファイルとして添付します。
+        * 指定するファイル名には適切な拡張子が付けられている必要があります。
+        * 
+        * @since 1.1
+        * 
+        * @param is 添付ファイルを生成するInputStream
+        * @param fileName ファイル名
+        */
+       public void addFile(InputStream is, String fileName) {
+               if (attachmentFiles == null) {
+                       initAttachmentFiles();
+               }
+               attachmentFiles.add(new AttachmentFile(fileName, is));
+       }
+
+       /**
+        * 指定されたbyte配列をファイルとして添付します。
+        * 指定するファイル名には適切な拡張子が付けられている必要があります。
+        * 
+        * @since 1.2
+        * 
+        * @param bytes 添付ファイルを生成するbyte配列
+        * @param fileName ファイル名
+        */
+       public void addFile(byte[] bytes, String fileName) {
+               if (attachmentFiles == null) {
+                       initAttachmentFiles();
+               }
+               attachmentFiles.add(new AttachmentFile(fileName, bytes));
+       }
+
+       /**
+        * attachmentFilesプロパティを初期化。
+        */
+       private void initAttachmentFiles() {
+               attachmentFiles = new ArrayList();
+       }
+
+       /**
+        * 添付ファイルの配列を返します。
+        * 添付ファイルがセットされていない場合は、空の配列を返します。
+        * 
+        * @since 1.1
+        * 
+        * @return 添付ファイルの配列。または空の配列。
+        */
+       public AttachmentFile[] getAttachmentFiles() {
+               if (attachmentFiles == null) {
+                       return new AttachmentFile[0];
+               }
+               return (AttachmentFile[])attachmentFiles
+                               .toArray(new AttachmentFile[attachmentFiles.size()]);
+       }
+
+       /**
+        * HTMLの本文がセットされているかどうか判定します。
+        * 
+        * @since 1.1
+        * 
+        * @return HTMLの本文がセットされている場合 true
+        */
+       public boolean isHtmlMail() {
+               return (htmlText != null);
+       }
+
+       /**
+        * ファイルが添付されているかどうか判定します。
+        * 
+        * @since 1.1
+        * 
+        * @return ファイルが添付されている場合 true
+        */
+       public boolean isFileAttached() {
+               return attachmentFiles != null && attachmentFiles.size() > 0;
+       }
+
+       /**
+        * マルチパート・メールかどうか判定します。<br>
+        * HTML本文がセットされているか、ファイルが添付されている場合に true が返されます。
+        * <p>
+        * 注: ここで判定されるマルチパートは、厳密な意味でのマルチパートではありません。
+        * 
+        * @since 1.1
+        * 
+        * @return マルチパート・メールの場合 true
+        */
+       public boolean isMultipartMail() {
+               return isHtmlMail() || isFileAttached();
+       }
+
+       /**
+        * セットされている添付ファイルを全てクリアします。
+        * 
+        * @since 1.1
+        */
+       public void clearFile() {
+               initAttachmentFiles();
+       }
+
+       /**
+        * envelope-toの宛先アドレスを追加します。
+        * <p>
+        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
+        * To、Cc、Bccアドレスには実際には送信されません。
+        * 
+        * @since 1.2
+        * @param address
+        */
+       public void addEnvelopeTo(InternetAddress address) {
+               if (envelopeTo == null) {
+                       envelopeTo = new ArrayList();
+               }
+               envelopeTo.add(address);
+       }
+
+       /**
+        * envelope-toの宛先アドレスを追加します。
+        * <p>
+        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
+        * To、Cc、Bccアドレスには実際には送信されません。
+        * 
+        * @since 1.2
+        * @param email
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void addEnvelopeTo(String email) {
+               try {
+                       addEnvelopeTo(new InternetAddress(email));
+               } catch (AddressException e) {
+                       throw new IllegalArgumentException(e.getMessage());
+               }
+       }
+
+       /**
+        * envelope-toの宛先アドレスを追加します。
+        * <p>
+        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
+        * To、Cc、Bccアドレスには実際には送信されません。
+        * 
+        * @since 1.2
+        * @param addresses
+        */
+       public void addEnvelopeTo(InternetAddress[] addresses) {
+               for (int i = 0; i < addresses.length; i++) {
+                       addEnvelopeTo(addresses[i]);
+               }
+       }
+
+       /**
+        * envelope-toの宛先アドレスを追加します。
+        * <p>
+        * envelope-toアドレスがセットされている場合、envelope-toのアドレスにのみメールを送信し、
+        * To、Cc、Bccアドレスには実際には送信されません。
+        * 
+        * @since 1.2
+        * @param emails
+        * @throws IllegalArgumentException 不正なフォーマットのアドレスが指定された場合
+        */
+       public void addEnvelopeTo(String[] emails) {
+               for (int i = 0; i < emails.length; i++) {
+                       addEnvelopeTo(emails[i]);
+               }
+       }
+
+       /**
+        * セットされているenvelope-toアドレスを全てクリアします。
+        *
+        * @since 1.2
+        */
+       public void clearEnvelopeTo() {
+               envelopeTo = null;
+       }
+
+       /**
+        * envelope-toアドレス配列を返します。
+        * envelope-toアドレスが一件もセットされていないときは空の配列を返します。
+        * 
+        * @since 1.2
+        * @return envelope-toアドレスの配列
+        */
+       public InternetAddress[] getEnvelopeTo() {
+               if (envelopeTo == null) {
+                       return new InternetAddress[0];
+               }
+               return (InternetAddress[])envelopeTo.toArray(new InternetAddress[envelopeTo.size()]);
+       }
+
+       /**
+        * 添付ファイル。
+        * <p>
+        * 受信メール(ReceivedMail)の添付ファイルは、常に<code>getFile()</code>メソッドで取得します。
+        * <code>getInputStream()</code>、<code>getUrl()</code>メソッドはnullを返します。
+        * 受信メールに対しては、<code>ReceivedMail.getFiles()</code>メソッドを使うと添付ファイルの
+        * <code>File</code>インスタンス配列を取得することができます。
+        * 
+        * @since 1.1
+        * @author Tomohiro Otsuka
+        * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $
+        */
+       public class AttachmentFile {
+
+               private String name;
+
+               private File file;
+
+               private InputStream is;
+
+               private URL url;
+
+               private byte[] bytes = null;
+
+               /**
+                * ファイル名とファイルを指定して、このクラスのインタンスを生成します。
+                * ファイル名には適切な拡張子が付けられている必要があります。
+                * 
+                * @param name メールに表示するファイル名
+                * @param file 添付ファイル
+                */
+               public AttachmentFile(String name, File file) {
+                       this.name = name;
+                       this.file = file;
+               }
+
+               /**
+                * ファイル名とInputStreamを指定して、このクラスのインタンスを生成します。
+                * ファイル名には適切な拡張子が付けられている必要があります。
+                * 
+                * @param name メールに表示するファイル名
+                * @param is 添付ファイルを生成するInputStream
+                */
+               public AttachmentFile(String name, InputStream is) {
+                       this.name = name;
+                       this.is = is;
+               }
+
+               /**
+                * ファイル名とファイルロケーションのURLを指定して、このクラスのインタンスを生成します。
+                * ファイル名には適切な拡張子が付けられている必要があります。
+                * 
+                * @param name メールに表示するファイル名
+                * @param url 添付ファイルのロケーションURL
+                */
+               public AttachmentFile(String name, URL url) {
+                       this.name = name;
+                       this.url = url;
+               }
+
+               /**
+                * ファイル名とbyte配列を指定して、このクラスのインタンスを生成します。
+                * ファイル名には適切な拡張子が付けられている必要があります。
+                * 
+                * @param name メールに表示するファイル名
+                * @param bytes 添付ファイルを生成するbyte配列
+                */
+               public AttachmentFile(String name, byte[] bytes) {
+                       this.name = name;
+                       this.bytes = bytes;
+               }
+
+               /**
+                * 添付ファイルのDataSourceインスタンスを生成して返します。
+                * 
+                * @return 添付ファイルのDataSourceインスタンス
+                */
+               public DataSource getDataSource() {
+                       if (file != null) {
+                               return new FileDataSource(file);
+                       }
+
+                       if (url != null) {
+                               return new URLDataSource(url);
+                       }
+
+                       // InputStreamからDataSourceを生成
+                       String contentType = FileTypeMap.getDefaultFileTypeMap().getContentType(name);
+                       if (is != null) {
+                               // InputStreamからDataSourceを生成
+                               return new ByteArrayDataSource(is, contentType);
+                       } else {
+                               // byte配列からDataSourceを生成
+                               return new ByteArrayDataSource(bytes, contentType);
+                       }
+               }
+
+               /**
+                * 添付ファイル名を返します。
+                * 
+                * @return 添付ファイル名
+                */
+               public String getName() {
+                       return name;
+               }
+
+               /**
+                * @return セットされたファイル。またはnull。
+                */
+               public File getFile() {
+                       return file;
+               }
+
+               /**
+                * @return セットされたInputStream。またはnull。
+                */
+               public InputStream getInputStream() {
+                       return is;
+               }
+
+               /**
+                * @return セットされたURL。またはnull。
+                */
+               public URL getUrl() {
+                       return url;
+               }
+
+               /**
+                * @return セットされたbyte配列。またはnull。
+                */
+               public byte[] getBytes() {
+                       return bytes;
+               }
+       }
+
+       /**
+        * メールの重要度。定数のみを定義。
+        * 
+        * @author Tomohiro Otsuka
+        * @version $Id: Mail.java,v 1.10.2.9 2007/03/30 13:03:44 otsuka Exp $
+        */
+       public static class Importance {
+
+               /** 重要度「高」 */
+               public static final String HIGH = "high";
+
+               /** 重要度「中」 */
+               public static final String NORMAL = "normal";
+
+               /** 重要度「低」 */
+               public static final String LOW = "low";
+
+       }
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 27be480..4ed144c
@@ -1,32 +1,32 @@
-package com.ozacc.mail;\r
-\r
-/**\r
- * SMTPサーバ接続の認証に失敗した際にスローされる例外。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: MailAuthenticationException.java,v 1.2 2004/09/13 07:08:22 otsuka Exp $\r
- */\r
-public class MailAuthenticationException extends MailException {\r
-\r
-       /**\r
-        * @param message \r
-        */\r
-       public MailAuthenticationException(String message) {\r
-               super(message);\r
-       }\r
-\r
-       /**\r
-        * @param message\r
-        * @param cause \r
-        */\r
-       public MailAuthenticationException(String message, Throwable cause) {\r
-               super(message, cause);\r
-       }\r
-\r
-       public MailAuthenticationException(Throwable cause) {\r
-               super("Authentication failed: " + cause.getMessage(), cause);\r
-       }\r
-\r
-}\r
-\r
+package com.ozacc.mail;
+
+/**
+ * SMTPサーバ接続の認証に失敗した際にスローされる例外。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: MailAuthenticationException.java,v 1.2 2004/09/13 07:08:22 otsuka Exp $
+ */
+public class MailAuthenticationException extends MailException {
+
+       /**
+        * @param message 
+        */
+       public MailAuthenticationException(String message) {
+               super(message);
+       }
+
+       /**
+        * @param message
+        * @param cause 
+        */
+       public MailAuthenticationException(String message, Throwable cause) {
+               super(message, cause);
+       }
+
+       public MailAuthenticationException(Throwable cause) {
+               super("Authentication failed: " + cause.getMessage(), cause);
+       }
+
+}
+
old mode 100755 (executable)
new mode 100644 (file)
index f82e001..372a754
@@ -1,27 +1,27 @@
-package com.ozacc.mail;\r
-\r
-/**\r
- * MimeMessageオブジェクトの生成に失敗した際にスローされる例外。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: MailBuildException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $\r
- */\r
-public class MailBuildException extends MailException {\r
-\r
-       /**\r
-        * @param message \r
-        */\r
-       public MailBuildException(String message) {\r
-               super(message);\r
-       }\r
-\r
-       /**\r
-        * @param message\r
-        * @param cause \r
-        */\r
-       public MailBuildException(String message, Throwable cause) {\r
-               super(message, cause);\r
-       }\r
-\r
+package com.ozacc.mail;
+
+/**
+ * MimeMessageオブジェクトの生成に失敗した際にスローされる例外。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: MailBuildException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $
+ */
+public class MailBuildException extends MailException {
+
+       /**
+        * @param message 
+        */
+       public MailBuildException(String message) {
+               super(message);
+       }
+
+       /**
+        * @param message
+        * @param cause 
+        */
+       public MailBuildException(String message, Throwable cause) {
+               super(message, cause);
+       }
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index b1d27ae..15fad14
@@ -1,36 +1,36 @@
-package com.ozacc.mail;\r
-\r
-import java.io.File;\r
-\r
-/**\r
- * メールデータが記述されたファイルからMailインスタンスを生成するインスターフェース。\r
- * サポートするファイルの種類やメールデータ書式は実装クラスに依存します。\r
- * \r
- * @see com.ozacc.mail.impl.XMLMailBuilderImpl\r
- * @see com.ozacc.mail.impl.JDomXMLMailBuilder\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: MailBuilder.java,v 1.7 2004/09/17 23:07:01 otsuka Exp $\r
- */\r
-public interface MailBuilder {\r
-\r
-       /**\r
-        * 指定されたクラスパス上のファイルを読み込んでMailインスタンスを生成します。\r
-        * \r
-        * @param classPath メール内容を記述したファイルのパス\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(String classPath) throws MailBuildException;\r
-\r
-       /**\r
-        * 指定されたファイルを読み込んでMailインスタンスを生成します。\r
-        * \r
-        * @param file メール内容を記述したファイル\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(File file) throws MailBuildException;\r
-\r
+package com.ozacc.mail;
+
+import java.io.File;
+
+/**
+ * メールデータが記述されたファイルからMailインスタンスを生成するインスターフェース。
+ * サポートするファイルの種類やメールデータ書式は実装クラスに依存します。
+ * 
+ * @see com.ozacc.mail.impl.XMLMailBuilderImpl
+ * @see com.ozacc.mail.impl.JDomXMLMailBuilder
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: MailBuilder.java,v 1.7 2004/09/17 23:07:01 otsuka Exp $
+ */
+public interface MailBuilder {
+
+       /**
+        * 指定されたクラスパス上のファイルを読み込んでMailインスタンスを生成します。
+        * 
+        * @param classPath メール内容を記述したファイルのパス
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(String classPath) throws MailBuildException;
+
+       /**
+        * 指定されたファイルを読み込んでMailインスタンスを生成します。
+        * 
+        * @param file メール内容を記述したファイル
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(File file) throws MailBuildException;
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index e7e5938..948bd8b
@@ -1,27 +1,27 @@
-package com.ozacc.mail;\r
-\r
-/**\r
- * メール関連例外の規定クラス。RuntimeExceptionを継承しています。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: MailException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $\r
- */\r
-public class MailException extends RuntimeException {\r
-\r
-       /**\r
-        * @param message \r
-        */\r
-       public MailException(String message) {\r
-               super(message);\r
-       }\r
-\r
-       /**\r
-        * @param message\r
-        * @param cause \r
-        */\r
-       public MailException(String message, Throwable cause) {\r
-               super(message, cause);\r
-       }\r
-\r
+package com.ozacc.mail;
+
+/**
+ * メール関連例外の規定クラス。RuntimeExceptionを継承しています。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: MailException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $
+ */
+public class MailException extends RuntimeException {
+
+       /**
+        * @param message 
+        */
+       public MailException(String message) {
+               super(message);
+       }
+
+       /**
+        * @param message
+        * @param cause 
+        */
+       public MailException(String message, Throwable cause) {
+               super(message, cause);
+       }
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index cec0528..f70b71e
@@ -1,29 +1,29 @@
-package com.ozacc.mail;\r
-\r
-/**\r
- * メール送信に失敗した時にスローされる例外。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: MailSendException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $\r
- */\r
-public class MailSendException extends MailException {\r
-\r
-       private static final long serialVersionUID = -8590978542027055148L;\r
-\r
-       /**\r
-        * @param message\r
-        */\r
-       public MailSendException(String message) {\r
-               super(message);\r
-       }\r
-\r
-       /**\r
-        * @param message\r
-        * @param cause\r
-        */\r
-       public MailSendException(String message, Throwable cause) {\r
-               super(message, cause);\r
-       }\r
-\r
+package com.ozacc.mail;
+
+/**
+ * メール送信に失敗した時にスローされる例外。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: MailSendException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $
+ */
+public class MailSendException extends MailException {
+
+       private static final long serialVersionUID = -8590978542027055148L;
+
+       /**
+        * @param message
+        */
+       public MailSendException(String message) {
+               super(message);
+       }
+
+       /**
+        * @param message
+        * @param cause
+        */
+       public MailSendException(String message, Throwable cause) {
+               super(message, cause);
+       }
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index c220783..9af93fa
@@ -1,34 +1,34 @@
-package com.ozacc.mail;\r
-\r
-import java.io.File;\r
-\r
-/**\r
- * 複数のメールデータが記述されたファイルからMailインスタンスを生成するインスターフェース。\r
- * \r
- * @since 1.2\r
- * @author Tomohiro Otsuka\r
- * @version $Id: MultipleMailBuilder.java,v 1.1.2.2 2005/01/23 06:47:08 otsuka Exp $\r
- */\r
-public interface MultipleMailBuilder extends MailBuilder {\r
-\r
-       /**\r
-        * 指定されたクラスパス上のファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。\r
-        * \r
-        * @param classPath メール内容を記述したファイルのパス\r
-        * @param mailId 生成するMailのメールデータを示すID\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(String classPath, String mailId) throws MailBuildException;\r
-\r
-       /**\r
-        * 指定されたファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。\r
-        * \r
-        * @param file メール内容を記述したファイル\r
-        * @param mailId 生成するMailのメールデータを示すID\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(File file, String mailId) throws MailBuildException;\r
-\r
+package com.ozacc.mail;
+
+import java.io.File;
+
+/**
+ * 複数のメールデータが記述されたファイルからMailインスタンスを生成するインスターフェース。
+ * 
+ * @since 1.2
+ * @author Tomohiro Otsuka
+ * @version $Id: MultipleMailBuilder.java,v 1.1.2.2 2005/01/23 06:47:08 otsuka Exp $
+ */
+public interface MultipleMailBuilder extends MailBuilder {
+
+       /**
+        * 指定されたクラスパス上のファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。
+        * 
+        * @param classPath メール内容を記述したファイルのパス
+        * @param mailId 生成するMailのメールデータを示すID
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(String classPath, String mailId) throws MailBuildException;
+
+       /**
+        * 指定されたファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。
+        * 
+        * @param file メール内容を記述したファイル
+        * @param mailId 生成するMailのメールデータを示すID
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(File file, String mailId) throws MailBuildException;
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 63e1af2..4210a5e
@@ -1,27 +1,27 @@
-package com.ozacc.mail;\r
-\r
-/**\r
- * SMTPサーバに接続していない時に、接続状態を要する処理を実行してスローされる例外。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: NotConnectedException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $\r
- */\r
-public class NotConnectedException extends MailException {\r
-\r
-       /**\r
-        * @param message \r
-        */\r
-       public NotConnectedException(String message) {\r
-               super(message);\r
-       }\r
-\r
-       /**\r
-        * @param message\r
-        * @param cause \r
-        */\r
-       public NotConnectedException(String message, Throwable cause) {\r
-               super(message, cause);\r
-       }\r
-\r
+package com.ozacc.mail;
+
+/**
+ * SMTPサーバに接続していない時に、接続状態を要する処理を実行してスローされる例外。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: NotConnectedException.java,v 1.2 2004/09/13 07:08:41 otsuka Exp $
+ */
+public class NotConnectedException extends MailException {
+
+       /**
+        * @param message 
+        */
+       public NotConnectedException(String message) {
+               super(message);
+       }
+
+       /**
+        * @param message
+        * @param cause 
+        */
+       public NotConnectedException(String message, Throwable cause) {
+               super(message, cause);
+       }
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 1db8c45..e5da52e
@@ -1,46 +1,46 @@
-package com.ozacc.mail;\r
-\r
-import javax.mail.internet.MimeMessage;\r
-\r
-/**\r
- * SendMailインターフェース。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: SendMail.java,v 1.3 2004/09/25 02:12:12 otsuka Exp $\r
- */\r
-public interface SendMail {\r
-\r
-       /**\r
-        * 指定されたメールを送信します。\r
-        * \r
-        * @param mail 送信するメールのMailインスタンス\r
-        * @throws MailException メール送信に失敗した場合\r
-        */\r
-       void send(Mail mail) throws MailException;\r
-\r
-       /**\r
-        * 指定されたメールを送信します。\r
-        * \r
-        * @param mails 送信するメールのMailインスタンス配列\r
-        * @throws MailException メール送信に失敗した場合\r
-        */\r
-       void send(Mail[] mails) throws MailException;\r
-\r
-       /**\r
-        * 指定されたMimeMessageを送信します。\r
-        * \r
-        * @param mimeMessage 送信するメールのMimeMessageインスタンス\r
-        * @throws MailException メール送信に失敗した場合\r
-        */\r
-       void send(MimeMessage mimeMessage) throws MailException;\r
-\r
-       /**\r
-        * 指定されたMimeMessageを送信します。\r
-        * \r
-        * @param mimeMessages 送信するメールのMimeMessageインスタンス配列\r
-        * @throws MailException メール送信に失敗した場合\r
-        */\r
-       void send(MimeMessage[] mimeMessages) throws MailException;\r
-\r
+package com.ozacc.mail;
+
+import javax.mail.internet.MimeMessage;
+
+/**
+ * SendMailインターフェース。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: SendMail.java,v 1.3 2004/09/25 02:12:12 otsuka Exp $
+ */
+public interface SendMail {
+
+       /**
+        * 指定されたメールを送信します。
+        * 
+        * @param mail 送信するメールのMailインスタンス
+        * @throws MailException メール送信に失敗した場合
+        */
+       void send(Mail mail) throws MailException;
+
+       /**
+        * 指定されたメールを送信します。
+        * 
+        * @param mails 送信するメールのMailインスタンス配列
+        * @throws MailException メール送信に失敗した場合
+        */
+       void send(Mail[] mails) throws MailException;
+
+       /**
+        * 指定されたMimeMessageを送信します。
+        * 
+        * @param mimeMessage 送信するメールのMimeMessageインスタンス
+        * @throws MailException メール送信に失敗した場合
+        */
+       void send(MimeMessage mimeMessage) throws MailException;
+
+       /**
+        * 指定されたMimeMessageを送信します。
+        * 
+        * @param mimeMessages 送信するメールのMimeMessageインスタンス配列
+        * @throws MailException メール送信に失敗した場合
+        */
+       void send(MimeMessage[] mimeMessages) throws MailException;
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 324a119..94c8685
@@ -1,52 +1,52 @@
-package com.ozacc.mail;\r
-\r
-import javax.mail.internet.MimeMessage;\r
-\r
-/**\r
- * SMTPサーバとの接続、切断を任意のタイミングで行いたい場合に使用するSendMailインターフェース。\r
- * <p>\r
- * 大量メール配信で、MailやMimeMessageの配列を用意するとメモリを圧迫してしまう場合などに使用します。<br>\r
- * 接続のクローズを忘れないように注意してください。\r
- * <p>\r
- * このインターフェース実装クラスのインスタンスは、メールサーバとの接続を保持するため、\r
- * スレッドセーフではありません。<br>\r
- * DIコンテナでの使用の際はシングルトンでインスタンスを取得しないように注意してください。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: SendMailPro.java,v 1.2.2.1 2004/11/25 08:02:27 otsuka Exp $\r
- */\r
-public interface SendMailPro {\r
-\r
-       /**\r
-        * SMTPサーバに接続します。\r
-        * \r
-        * @throws MailException\r
-        */\r
-       void connect() throws MailException;\r
-\r
-       /**\r
-        * SMTPサーバとの接続をクローズします。\r
-        * 接続していない時にこのメソッドを呼んでも何も行いません。\r
-        * \r
-        * @throws MailException\r
-        */\r
-       void disconnect() throws MailException;\r
-\r
-       /**\r
-        * 指定されたMimeMessageを送信します。SMTPサーバに接続していない場合は例外をスローします。\r
-        * \r
-        * @param mimeMessage\r
-        * @throws MailException\r
-        */\r
-       void send(MimeMessage mimeMessage) throws MailException;\r
-\r
-       /**\r
-        * 指定されたMailを送信します。SMTPサーバに接続していない場合は例外をスローします。\r
-        * \r
-        * @param mail\r
-        * @throws MailException\r
-        */\r
-       void send(Mail mail) throws MailException;\r
-\r
+package com.ozacc.mail;
+
+import javax.mail.internet.MimeMessage;
+
+/**
+ * SMTPサーバとの接続、切断を任意のタイミングで行いたい場合に使用するSendMailインターフェース。
+ * <p>
+ * 大量メール配信で、MailやMimeMessageの配列を用意するとメモリを圧迫してしまう場合などに使用します。<br>
+ * 接続のクローズを忘れないように注意してください。
+ * <p>
+ * このインターフェース実装クラスのインスタンスは、メールサーバとの接続を保持するため、
+ * スレッドセーフではありません。<br>
+ * DIコンテナでの使用の際はシングルトンでインスタンスを取得しないように注意してください。
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: SendMailPro.java,v 1.2.2.1 2004/11/25 08:02:27 otsuka Exp $
+ */
+public interface SendMailPro {
+
+       /**
+        * SMTPサーバに接続します。
+        * 
+        * @throws MailException
+        */
+       void connect() throws MailException;
+
+       /**
+        * SMTPサーバとの接続をクローズします。
+        * 接続していない時にこのメソッドを呼んでも何も行いません。
+        * 
+        * @throws MailException
+        */
+       void disconnect() throws MailException;
+
+       /**
+        * 指定されたMimeMessageを送信します。SMTPサーバに接続していない場合は例外をスローします。
+        * 
+        * @param mimeMessage
+        * @throws MailException
+        */
+       void send(MimeMessage mimeMessage) throws MailException;
+
+       /**
+        * 指定されたMailを送信します。SMTPサーバに接続していない場合は例外をスローします。
+        * 
+        * @param mail
+        * @throws MailException
+        */
+       void send(Mail mail) throws MailException;
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 22de620..bbe99c0
@@ -1,71 +1,71 @@
-package com.ozacc.mail;\r
-\r
-import java.io.File;\r
-\r
-import org.apache.velocity.VelocityContext;\r
-\r
-/**\r
- * Velocityと連携して動的にメールデータを生成し、そのデータからMailインスタンスを生成するインターフェース。\r
- * \r
- * @see com.ozacc.mail.impl.XMLVelocityMailBuilderImpl\r
- * @see com.ozacc.mail.impl.JDomXMLMailBuilder\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: VelocityMailBuilder.java,v 1.4.2.3 2005/01/21 16:51:20 otsuka Exp $\r
- */\r
-public interface VelocityMailBuilder extends MailBuilder {\r
-\r
-       /**\r
-        * 指定されたクラスパス上のファイルを読み込んでMailインスタンスを生成します。\r
-        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。\r
-        * \r
-        * @param classPath メール内容を記述したファイルのパス\r
-        * @param context VelocityContext\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(String classPath, VelocityContext context) throws MailBuildException;\r
-\r
-       /**\r
-        * 指定されたファイルを読み込んでMailインスタンスを生成します。\r
-        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。\r
-        * \r
-        * @param file メール内容を記述したファイル\r
-        * @param context VelocityContext\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(File file, VelocityContext context) throws MailBuildException;\r
-\r
-       /**\r
-        * メールデータキャッシュをクリアします。\r
-        * \r
-        * @since 1.1.2\r
-        */\r
-       void clearCache();\r
-\r
-       /**\r
-        * VelocityContextとマージする前のメールデータをキャッシュするかどうかを設定します。\r
-        * デフォルトはキャッシュしない設定です。\r
-        * <p>\r
-        * キャッシュのキーは、<code>buildMail()</code>メソッド引数のメールデータファイルのクラスパス或いはファイルパスです。\r
-        * キャッシュに有効期限はありません。\r
-        * また、メールデータファイルの内容が途中で更新されても、キャッシュされているメールデータは更新されませんので注意してください。\r
-        * <p>\r
-        * <code>false</code>を指定してこのメソッドを呼ぶとメールデータキャッシュはクリアされます。\r
-        * \r
-        * @since 1.1.2\r
-        * @param cacheEnabled メールデータをキャッシュする場合は true\r
-        */\r
-       void setCacheEnabled(boolean cacheEnabled);\r
-\r
-       /**\r
-        * VelocityContextとマージする前のメールデータをキャッシュする設定かどうか判定します。\r
-        * \r
-        * @since 1.1.2\r
-        * @return メールデータをキャッシュする設定の場合は true\r
-        */\r
-       boolean isCacheEnabled();\r
-\r
+package com.ozacc.mail;
+
+import java.io.File;
+
+import org.apache.velocity.VelocityContext;
+
+/**
+ * Velocityと連携して動的にメールデータを生成し、そのデータからMailインスタンスを生成するインターフェース。
+ * 
+ * @see com.ozacc.mail.impl.XMLVelocityMailBuilderImpl
+ * @see com.ozacc.mail.impl.JDomXMLMailBuilder
+ * 
+ * @since 1.0
+ * @author Tomohiro Otsuka
+ * @version $Id: VelocityMailBuilder.java,v 1.4.2.3 2005/01/21 16:51:20 otsuka Exp $
+ */
+public interface VelocityMailBuilder extends MailBuilder {
+
+       /**
+        * 指定されたクラスパス上のファイルを読み込んでMailインスタンスを生成します。
+        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。
+        * 
+        * @param classPath メール内容を記述したファイルのパス
+        * @param context VelocityContext
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(String classPath, VelocityContext context) throws MailBuildException;
+
+       /**
+        * 指定されたファイルを読み込んでMailインスタンスを生成します。
+        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。
+        * 
+        * @param file メール内容を記述したファイル
+        * @param context VelocityContext
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(File file, VelocityContext context) throws MailBuildException;
+
+       /**
+        * メールデータキャッシュをクリアします。
+        * 
+        * @since 1.1.2
+        */
+       void clearCache();
+
+       /**
+        * VelocityContextとマージする前のメールデータをキャッシュするかどうかを設定します。
+        * デフォルトはキャッシュしない設定です。
+        * <p>
+        * キャッシュのキーは、<code>buildMail()</code>メソッド引数のメールデータファイルのクラスパス或いはファイルパスです。
+        * キャッシュに有効期限はありません。
+        * また、メールデータファイルの内容が途中で更新されても、キャッシュされているメールデータは更新されませんので注意してください。
+        * <p>
+        * <code>false</code>を指定してこのメソッドを呼ぶとメールデータキャッシュはクリアされます。
+        * 
+        * @since 1.1.2
+        * @param cacheEnabled メールデータをキャッシュする場合は true
+        */
+       void setCacheEnabled(boolean cacheEnabled);
+
+       /**
+        * VelocityContextとマージする前のメールデータをキャッシュする設定かどうか判定します。
+        * 
+        * @since 1.1.2
+        * @return メールデータをキャッシュする設定の場合は true
+        */
+       boolean isCacheEnabled();
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 0325bcb..6e376d9
@@ -1,41 +1,41 @@
-package com.ozacc.mail;\r
-\r
-import java.io.File;\r
-\r
-import org.apache.velocity.VelocityContext;\r
-\r
-/**\r
- * Velocityと連携して動的にメールデータを生成し、そのデータからMailインスタンスを生成するインターフェース。\r
- * \r
- * @since 1.2\r
- * @author Tomohiro Otsuka\r
- * @version $Id: VelocityMultipleMailBuilder.java,v 1.1.2.2 2005/01/23 06:47:08 otsuka Exp $\r
- */\r
-public interface VelocityMultipleMailBuilder extends VelocityMailBuilder {\r
-\r
-       /**\r
-        * 指定されたクラスパス上のファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。\r
-        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。\r
-        * \r
-        * @param classPath メール内容を記述したファイルのパス\r
-        * @param context VelocityContext\r
-        * @param mailId 生成するMailのメールデータを示すID\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(String classPath, VelocityContext context, String mailId)\r
-                                                                                                                                                       throws MailBuildException;\r
-\r
-       /**\r
-        * 指定されたファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。\r
-        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。\r
-        * \r
-        * @param file メール内容を記述したファイル\r
-        * @param context VelocityContext\r
-        * @param mailId 生成するMailのメールデータを示すID\r
-        * @return 生成されたMailインスタンス\r
-        * @throws MailBuildException Mailインスタンスの生成に失敗した場合\r
-        */\r
-       Mail buildMail(File file, VelocityContext context, String mailId) throws MailBuildException;\r
-\r
+package com.ozacc.mail;
+
+import java.io.File;
+
+import org.apache.velocity.VelocityContext;
+
+/**
+ * Velocityと連携して動的にメールデータを生成し、そのデータからMailインスタンスを生成するインターフェース。
+ * 
+ * @since 1.2
+ * @author Tomohiro Otsuka
+ * @version $Id: VelocityMultipleMailBuilder.java,v 1.1.2.2 2005/01/23 06:47:08 otsuka Exp $
+ */
+public interface VelocityMultipleMailBuilder extends VelocityMailBuilder {
+
+       /**
+        * 指定されたクラスパス上のファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。
+        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。
+        * 
+        * @param classPath メール内容を記述したファイルのパス
+        * @param context VelocityContext
+        * @param mailId 生成するMailのメールデータを示すID
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(String classPath, VelocityContext context, String mailId)
+                                                                                                                                                       throws MailBuildException;
+
+       /**
+        * 指定されたファイルを読み込み、mailIdが示すデータからMailインスタンスを生成します。
+        * 指定されたVelocityContextを使って、XMLファイルの内容を動的に生成できます。
+        * 
+        * @param file メール内容を記述したファイル
+        * @param context VelocityContext
+        * @param mailId 生成するMailのメールデータを示すID
+        * @return 生成されたMailインスタンス
+        * @throws MailBuildException Mailインスタンスの生成に失敗した場合
+        */
+       Mail buildMail(File file, VelocityContext context, String mailId) throws MailBuildException;
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 3b955c7..7e62d3e
@@ -1,45 +1,45 @@
-package com.ozacc.mail.fetch;\r
-\r
-import com.ozacc.mail.MailException;\r
-\r
-/**\r
- * メールサーバからメールを取得するインターフェース。<br>\r
- * このインターフェースの実装クラスでメールサーバの情報を設定します。\r
- * <p>\r
- * getMails()メソッドはスレッドセーフです。メソッドを呼び出すとメールサーバに接続し、\r
- * メソッド終了時にサーバとの接続を切断します。\r
- * \r
- * @since 1.2\r
- * @author Tomohiro Otsuka\r
- * @version $Id: FetchMail.java,v 1.1.2.5 2004/10/27 19:41:35 otsuka Exp $\r
- */\r
-public interface FetchMail {\r
-\r
-       /**\r
-        * メールサーバからメールを受信し、ReceivedMailインスタンスに変換して返します。<br>\r
-        * 受信したメールは、メールサーバに残されます。\r
-        * <p>\r
-        * このメソッドを呼び出すとメールサーバに接続します。メールを受信した後、メールサーバとの接続を切断します。\r
-        * <p>\r
-        * メールサーバがimapサーバの場合、一度受信したメールには既読フラグ(SEENフラグ)が付けられます。\r
-        * \r
-        * @return 受信したメールのReceivedMailインスタンス配列\r
-        * @throws MailException\r
-        */\r
-       ReceivedMail[] getMails() throws MailException;\r
-\r
-       /**\r
-        * メールサーバからメールを受信し、ReceivedMailインスタンスに変換して返します。<br>\r
-        * deleteパラメータで、受信時にメールサーバからメールを削除するか残すかを指定します。\r
-        * <p>\r
-        * このメソッドを呼び出すとメールサーバに接続します。メールを受信した後、メールサーバとの接続を切断します。\r
-        * <p>\r
-        * メールサーバがimapサーバの場合、一度受信したメールには既読フラグ(SEENフラグ)が付けられます。\r
-        * \r
-        * @param delete 受信時にメールサーバからメールを削除する場合 true\r
-        * @return 受信したメールのReceivedMailインスタンス配列\r
-        * @throws MailException\r
-        */\r
-       ReceivedMail[] getMails(boolean delete) throws MailException;\r
-\r
+package com.ozacc.mail.fetch;
+
+import com.ozacc.mail.MailException;
+
+/**
+ * メールサーバからメールを取得するインターフェース。<br>
+ * このインターフェースの実装クラスでメールサーバの情報を設定します。
+ * <p>
+ * getMails()メソッドはスレッドセーフです。メソッドを呼び出すとメールサーバに接続し、
+ * メソッド終了時にサーバとの接続を切断します。
+ * 
+ * @since 1.2
+ * @author Tomohiro Otsuka
+ * @version $Id: FetchMail.java,v 1.1.2.5 2004/10/27 19:41:35 otsuka Exp $
+ */
+public interface FetchMail {
+
+       /**
+        * メールサーバからメールを受信し、ReceivedMailインスタンスに変換して返します。<br>
+        * 受信したメールは、メールサーバに残されます。
+        * <p>
+        * このメソッドを呼び出すとメールサーバに接続します。メールを受信した後、メールサーバとの接続を切断します。
+        * <p>
+        * メールサーバがimapサーバの場合、一度受信したメールには既読フラグ(SEENフラグ)が付けられます。
+        * 
+        * @return 受信したメールのReceivedMailインスタンス配列
+        * @throws MailException
+        */
+       ReceivedMail[] getMails() throws MailException;
+
+       /**
+        * メールサーバからメールを受信し、ReceivedMailインスタンスに変換して返します。<br>
+        * deleteパラメータで、受信時にメールサーバからメールを削除するか残すかを指定します。
+        * <p>
+        * このメソッドを呼び出すとメールサーバに接続します。メールを受信した後、メールサーバとの接続を切断します。
+        * <p>
+        * メールサーバがimapサーバの場合、一度受信したメールには既読フラグ(SEENフラグ)が付けられます。
+        * 
+        * @param delete 受信時にメールサーバからメールを削除する場合 true
+        * @return 受信したメールのReceivedMailインスタンス配列
+        * @throws MailException
+        */
+       ReceivedMail[] getMails(boolean delete) throws MailException;
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 54b91d0..532fef2
-package com.ozacc.mail.fetch;\r
-\r
-import javax.mail.internet.MimeMessage;\r
-\r
-import com.ozacc.mail.MailException;\r
-\r
-/**\r
- * メールサーバからメールを取得する上級インターフェース。<br>\r
- * このインターフェースの実装クラスでメールサーバの情報を設定します。\r
- * <p>\r
- * <code>FetchMail</code>インターフェースと異なり、メール取得時に例外が発生しても、\r
- * メールサーバとの接続は切断されません。<code>finally</code>ブロックを使用するなりして\r
- * メールサーバとの接続を確実に切断できるようにすることを推奨します。\r
- * <p>\r
- * このインターフェース実装クラスのインスタンスは、メールサーバとの接続を保持するため、\r
- * スレッドセーフではありません。<br>\r
- * DIコンテナでの使用の際はシングルトンでインスタンスを取得しないように注意してください。\r
- * \r
- * @see FetchMail\r
- * @since 1.2\r
- * @author Tomohiro Otsuka\r
- * @version $Id: FetchMailPro.java,v 1.1.2.7 2005/04/10 05:22:24 otsuka Exp $\r
- */\r
-public interface FetchMailPro {\r
-\r
-       /**\r
-        * メールサーバに接続し、「INBOX」フォルダをオープンします。\r
-        * \r
-        * @throws MailException メールサーバとの接続に失敗した場合\r
-        */\r
-       void connect() throws MailException;\r
-\r
-       /**\r
-        * メールサーバとの接続を切断します。接続されていなければ何も行いません。\r
-        * \r
-        * @throws MailException メールサーバとの接続切断に失敗した場合\r
-        */\r
-       void disconnect() throws MailException;\r
-\r
-       /**\r
-        * 現在のフォルダに届いているメール数を返します。\r
-        * \r
-        * @return 現在のフォルダにあるメール数\r
-        * @throws MailException\r
-        */\r
-       int getMailCount() throws MailException;\r
-\r
-       /**\r
-        * 現在のフォルダにある指定されたメッセージ番号のメールをReceivedMailに変換して返します。\r
-        * メッセージ番号は1始まりです。\r
-        * <p>\r
-        * メッセージはサーバから削除されません。\r
-        * \r
-        * @param num メッセージ番号。1始まり。\r
-        * @return 指定されたメッセージ番号のReceivedMailインスタンス\r
-        * @throws MailException メール取得に失敗した場合\r
-        */\r
-       ReceivedMail getMail(int num) throws MailException;\r
-\r
-       /**\r
-        * 現在のフォルダにある指定されたメッセージ番号のメールをReceivedMailに変換して返します。\r
-        * メッセージ番号は1始まりです。\r
-        * 指定した番号のメッセージをサーバから削除するかどうかを指定できます。\r
-        * \r
-        * @param num メッセージ番号。1始まり。\r
-        * @param delete 指定された番号のメッセージをサーバから削除する場合 true を指定\r
-        * @return 指定されたメッセージ番号のReceivedMailインスタンス\r
-        * @throws MailException メール取得に失敗した場合\r
-        */\r
-       ReceivedMail getMail(int num, boolean delete) throws MailException;\r
-\r
-       /**\r
-        * 現在のフォルダにある全メールをReceivedMailに変換して返します。\r
-        * \r
-        * @param delete メール取得後にサーバからメールを削除する場合 true\r
-        * @return 現在のフォルダにある全メールのReceivedMailインスタンス\r
-        * @throws MailException メール取得に失敗した場合\r
-        */\r
-       ReceivedMail[] getMails(boolean delete) throws MailException;\r
-\r
-       /**\r
-        * 現在のフォルダにある指定されたメッセージ番号のメールを返します。\r
-        * メッセージ番号は1始まりです。\r
-        * \r
-        * @see javax.mail.Folder#getMessage(int)\r
-        * @param num メッセージ番号。1始まり。\r
-        * @return 指定された番号のMimeMessageインスタンス\r
-        * @throws MailException メール取得に失敗した場合\r
-        */\r
-       MimeMessage getMessage(int num) throws MailException;\r
-\r
-       /**\r
-        * 現在のフォルダにある全メールを返します。\r
-        * \r
-        * @param delete メール取得後にサーバからメールを削除する場合 true\r
-        * @return 現在のフォルダにある全メールのMimeMessageインスタンス\r
-        * @throws MailException メール取得に失敗した場合\r
-        */\r
-       MimeMessage[] getMessages(boolean delete) throws MailException;\r
-\r
-       /**\r
-        * 指定された名前のフォルダに移動します。\r
-        * フォルダ名は"INBOX/XXXX"のように、INBOXからのパス指定します。\r
-        * <p>\r
-        * <strong>注:</strong> このメソッドは、メールサーバがimapサーバの時にのみ使用可能です。\r
-        * \r
-        * @param folderName 移動先のフォルダ名\r
-        * @throws MailException\r
-        */\r
-       void changeFolder(String folderName) throws MailException;\r
-\r
-       /**\r
-        * メールサーバと接続しているかどうか判定します。\r
-        * \r
-        * @return 接続している場合 true\r
-        */\r
-       boolean isConnected();\r
+package com.ozacc.mail.fetch;
+
+import javax.mail.internet.MimeMessage;
+
+import com.ozacc.mail.MailException;
+
+/**
+ * メールサーバからメールを取得する上級インターフェース。<br>
+ * このインターフェースの実装クラスでメールサーバの情報を設定します。
+ * <p>
+ * <code>FetchMail</code>インターフェースと異なり、メール取得時に例外が発生しても、
+ * メールサーバとの接続は切断されません。<code>finally</code>ブロックを使用するなりして
+ * メールサーバとの接続を確実に切断できるようにすることを推奨します。
+ * <p>
+ * このインターフェース実装クラスのインスタンスは、メールサーバとの接続を保持するため、
+ * スレッドセーフではありません。<br>
+ * DIコンテナでの使用の際はシングルトンでインスタンスを取得しないように注意してください。
+ * 
+ * @see FetchMail
+ * @since 1.2
+ * @author Tomohiro Otsuka
+ * @version $Id: FetchMailPro.java,v 1.1.2.7 2005/04/10 05:22:24 otsuka Exp $
+ */
+public interface FetchMailPro {
+
+       /**
+        * メールサーバに接続し、「INBOX」フォルダをオープンします。
+        * 
+        * @throws MailException メールサーバとの接続に失敗した場合
+        */
+       void connect() throws MailException;
+
+       /**
+        * メールサーバとの接続を切断します。接続されていなければ何も行いません。
+        * 
+        * @throws MailException メールサーバとの接続切断に失敗した場合
+        */
+       void disconnect() throws MailException;
+
+       /**
+        * 現在のフォルダに届いているメール数を返します。
+        * 
+        * @return 現在のフォルダにあるメール数
+        * @throws MailException
+        */
+       int getMailCount() throws MailException;
+
+       /**
+        * 現在のフォルダにある指定されたメッセージ番号のメールをReceivedMailに変換して返します。
+        * メッセージ番号は1始まりです。
+        * <p>
+        * メッセージはサーバから削除されません。
+        * 
+        * @param num メッセージ番号。1始まり。
+        * @return 指定されたメッセージ番号のReceivedMailインスタンス
+        * @throws MailException メール取得に失敗した場合
+        */
+       ReceivedMail getMail(int num) throws MailException;
+
+       /**
+        * 現在のフォルダにある指定されたメッセージ番号のメールをReceivedMailに変換して返します。
+        * メッセージ番号は1始まりです。
+        * 指定した番号のメッセージをサーバから削除するかどうかを指定できます。
+        * 
+        * @param num メッセージ番号。1始まり。
+        * @param delete 指定された番号のメッセージをサーバから削除する場合 true を指定
+        * @return 指定されたメッセージ番号のReceivedMailインスタンス
+        * @throws MailException メール取得に失敗した場合
+        */
+       ReceivedMail getMail(int num, boolean delete) throws MailException;
+
+       /**
+        * 現在のフォルダにある全メールをReceivedMailに変換して返します。
+        * 
+        * @param delete メール取得後にサーバからメールを削除する場合 true
+        * @return 現在のフォルダにある全メールのReceivedMailインスタンス
+        * @throws MailException メール取得に失敗した場合
+        */
+       ReceivedMail[] getMails(boolean delete) throws MailException;
+
+       /**
+        * 現在のフォルダにある指定されたメッセージ番号のメールを返します。
+        * メッセージ番号は1始まりです。
+        * 
+        * @see javax.mail.Folder#getMessage(int)
+        * @param num メッセージ番号。1始まり。
+        * @return 指定された番号のMimeMessageインスタンス
+        * @throws MailException メール取得に失敗した場合
+        */
+       MimeMessage getMessage(int num) throws MailException;
+
+       /**
+        * 現在のフォルダにある全メールを返します。
+        * 
+        * @param delete メール取得後にサーバからメールを削除する場合 true
+        * @return 現在のフォルダにある全メールのMimeMessageインスタンス
+        * @throws MailException メール取得に失敗した場合
+        */
+       MimeMessage[] getMessages(boolean delete) throws MailException;
+
+       /**
+        * 指定された名前のフォルダに移動します。
+        * フォルダ名は"INBOX/XXXX"のように、INBOXからのパス指定します。
+        * <p>
+        * <strong>注:</strong> このメソッドは、メールサーバがimapサーバの時にのみ使用可能です。
+        * 
+        * @param folderName 移動先のフォルダ名
+        * @throws MailException
+        */
+       void changeFolder(String folderName) throws MailException;
+
+       /**
+        * メールサーバと接続しているかどうか判定します。
+        * 
+        * @return 接続している場合 true
+        */
+       boolean isConnected();
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index d43cb22..83ac972
@@ -1,30 +1,30 @@
-package com.ozacc.mail.fetch;\r
-\r
-import javax.mail.internet.MimeMessage;\r
-\r
-/**\r
- * <code>MimeMessage</code>から<code>ReceivedMail</code>を生成するインターフェース。\r
- * \r
- * @since 1.2\r
- * @author gaku\r
- * @version $Id: MailConverter.java,v 1.1.2.2 2005/04/10 05:25:21 otsuka Exp $\r
- */\r
-public interface MailConverter {\r
-\r
-       /**\r
-        * 指定された<code>MimeMessage</code>を<code>ReceivedMail</code>に変換して返します。\r
-        * \r
-        * @param message <code>ReceivedMail</code>に変換する<code>MimeMessage</code>\r
-        * @return <code>MimeMessage</code>から生成された<code>ReceivedMail</code>\r
-        */\r
-       ReceivedMail convertIntoMail(MimeMessage message);\r
-\r
-       /**\r
-        * 指定された<code>MimeMessage</code>を<code>ReceivedMail</code>に変換して返します。\r
-        * \r
-        * @param message <code>ReceivedMail</code>に変換する<code>MimeMessage</code>の配列\r
-        * @return <code>MimeMessage</code>から生成された<code>ReceivedMail</code>の配列\r
-        */\r
-       ReceivedMail[] convertIntoMails(MimeMessage[] messages);\r
-\r
+package com.ozacc.mail.fetch;
+
+import javax.mail.internet.MimeMessage;
+
+/**
+ * <code>MimeMessage</code>から<code>ReceivedMail</code>を生成するインターフェース。
+ * 
+ * @since 1.2
+ * @author gaku
+ * @version $Id: MailConverter.java,v 1.1.2.2 2005/04/10 05:25:21 otsuka Exp $
+ */
+public interface MailConverter {
+
+       /**
+        * 指定された<code>MimeMessage</code>を<code>ReceivedMail</code>に変換して返します。
+        * 
+        * @param message <code>ReceivedMail</code>に変換する<code>MimeMessage</code>
+        * @return <code>MimeMessage</code>から生成された<code>ReceivedMail</code>
+        */
+       ReceivedMail convertIntoMail(MimeMessage message);
+
+       /**
+        * 指定された<code>MimeMessage</code>を<code>ReceivedMail</code>に変換して返します。
+        * 
+        * @param message <code>ReceivedMail</code>に変換する<code>MimeMessage</code>の配列
+        * @return <code>MimeMessage</code>から生成された<code>ReceivedMail</code>の配列
+        */
+       ReceivedMail[] convertIntoMails(MimeMessage[] messages);
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 737e3c8..f1e0133
@@ -1,28 +1,28 @@
-package com.ozacc.mail.fetch;\r
-\r
-import com.ozacc.mail.MailException;\r
-\r
-/**\r
- * メールの受信に失敗した時にスローされる例外。\r
- * \r
- * @author Tomohiro Otsuka\r
- * @version $Id: MailFetchException.java,v 1.1.2.1 2004/10/24 10:14:31 otsuka Exp $\r
- */\r
-public class MailFetchException extends MailException {\r
-\r
-       /**\r
-        * @param message \r
-        */\r
-       public MailFetchException(String message) {\r
-               super(message);\r
-       }\r
-\r
-       /**\r
-        * @param message\r
-        * @param cause \r
-        */\r
-       public MailFetchException(String message, Throwable cause) {\r
-               super(message, cause);\r
-       }\r
-\r
+package com.ozacc.mail.fetch;
+
+import com.ozacc.mail.MailException;
+
+/**
+ * メールの受信に失敗した時にスローされる例外。
+ * 
+ * @author Tomohiro Otsuka
+ * @version $Id: MailFetchException.java,v 1.1.2.1 2004/10/24 10:14:31 otsuka Exp $
+ */
+public class MailFetchException extends MailException {
+
+       /**
+        * @param message 
+        */
+       public MailFetchException(String message) {
+               super(message);
+       }
+
+       /**
+        * @param message
+        * @param cause 
+        */
+       public MailFetchException(String message, Throwable cause) {
+               super(message, cause);
+       }
+
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 055744a..1a6d4be
-package com.ozacc.mail.fetch;\r
-\r
-import java.io.File;\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import javax.mail.Flags;\r
-import javax.mail.MessagingException;\r
-import javax.mail.internet.MimeMessage;\r
-\r
-import com.ozacc.mail.Mail;\r
-\r
-/**\r
- * 受信メール。\r
- * <p>\r
- * <code>FetchMail</code>、<code>FetchMailPro</code>の実装クラスで受信したメールが、\r
- * インターネットメールとしての仕様を満たしていないヘッダ(FromやToなど)の値がセットされていた場合、\r
- * そのヘッダに該当する<code>ReceivedMail</code>インスタンスのプロパティには何もセットされません。\r
- * \r
- * @since 1.2\r
- * @author Tomohiro Otsuka\r
- * @version $Id: ReceivedMail.java,v 1.1.2.9 2005/01/23 07:13:13 otsuka Exp $\r
- */\r
-public class ReceivedMail extends Mail {\r
-\r
-       private String replySubjectPrefix = "Re: ";\r
-\r
-       private Date date;\r
-\r
-       private String messageId;\r
-\r
-       private int size;\r
-\r
-       private List receivedHeaders;\r
-\r
-       private MimeMessage message;\r
-\r
-       /**\r
-        * コンストラクタ。\r
-        */\r
-       public ReceivedMail() {\r
-               super();\r
-       }\r
-\r
-       /**\r
-        * コンストラクタ。\r
-        * \r
-        * @param charset \r
-        */\r
-       public ReceivedMail(String charset) {\r
-               super(charset);\r
-       }\r
-\r
-       /**\r
-        * コピーコンストラクタ。\r
-        * \r
-        * @param original \r
-        */\r
-       public ReceivedMail(Mail original) {\r
-               super(original);\r
-       }\r
-\r
-       /**\r
-        * 送信日時を返します。\r
-        * <p>\r
-        * 注: メールの受信日時ではありません。\r
-        * \r
-        * @return 送信日時\r
-        */\r
-       public Date getDate() {\r
-               return date;\r
-       }\r
-\r
-       /**\r
-        * 送信日時をセットします。\r
-        * \r
-        * @param date 送信日時\r
-        */\r
-       public void setDate(Date date) {\r
-               this.date = date;\r
-       }\r
-\r
-       /**\r
-        * 前後に&lt;&gt;が付いたメッセージIDを返します。\r
-        * 受信メールにメッセージIDが存在しない場合はnullを返します。\r
-        * \r
-        * @return 前後に&lt;&gt;が付いたメッセージID、またはnull\r
-        */\r
-       public String getMessageId() {\r
-               if (messageId == null || messageId.length() == 0) {\r
-                       return null;\r
-               }\r
-               if (messageId.startsWith("<") && messageId.endsWith(">")) {\r
-                       return messageId;\r
-               }\r
-               return "<" + messageId + ">";\r
-       }\r
-\r
-       /**\r
-        * メッセージIDを返します。前後に&lt;&gt;は付きません。\r
-        * 受信メールにメッセージIDが存在しない場合はnullを返します。\r
-        * \r
-        * @return メッセージID、またはnull\r
-        */\r
-       public String getMessageIdWithoutBracket() {\r
-               if (messageId == null || messageId.length() == 0) {\r
-                       return null;\r
-               }\r
-               if (messageId.startsWith("<") && messageId.endsWith(">")) {\r
-                       return messageId.substring(1, messageId.length() - 1);\r
-               }\r
-               return messageId;\r
-       }\r
-\r
-       /**\r
-        * メッセージIDをセットします。\r
-        * \r
-        * @param messageId メッセージID\r
-        */\r
-       public void setMessageId(String messageId) {\r
-               this.messageId = messageId;\r
-       }\r
-\r
-       /**\r
-        * In-Reply-Toヘッダの値を返します。\r
-        * In-Reply-Toヘッダがない場合はnullを返します。\r
-        * \r
-        * @return In-Reply-Toヘッダの値\r
-        */\r
-       public String getInReplyTo() {\r
-               return (String)headers.get("In-Reply-To");\r
-       }\r
-\r
-       /**\r
-        * Referencesヘッダの値を返します。\r
-        * Referencesヘッダがない場合はnullを返します。\r
-        * \r
-        * @return Referencesヘッダの値\r
-        */\r
-       public String getRefereces() {\r
-               return (String)headers.get("References");\r
-       }\r
-\r
-       /**\r
-        * @return 返信時の件名に付ける接頭辞\r
-        */\r
-       public String getReplySubjectPrefix() {\r
-               return replySubjectPrefix;\r
-       }\r
-\r
-       /**\r
-        * 返信時の件名に付ける接頭辞をセットします。\r
-        * デフォルトは「Re: 」。\r
-        * \r
-        * @param replySubjectPrefix 返信時の件名に付ける接頭辞\r
-        */\r
-       public void setReplySubjectPrefix(String replySubjectPrefix) {\r
-               this.replySubjectPrefix = replySubjectPrefix;\r
-       }\r
-\r
-       /**\r
-        * メール内容を出力します。<br>\r
-        * メールのソースに似たフォーマットで出力されます。\r
-        * \r
-        * @see java.lang.Object#toString()\r
-        */\r
-       public String toString() {\r
-               StringBuffer buf = new StringBuffer(1000);\r
-               buf.append("Mail\n");\r
-               buf.append("Return-Path: ").append(returnPath).append("\n");\r
-               buf.append("Message-ID: ").append(messageId).append("\n");\r
-               buf.append("Date: ").append(date).append("\n");\r
-               buf.append("From: ").append(from != null ? from.toUnicodeString() : null).append("\n");\r
-               buf.append("To: ").append(arrayToCommaDelimitedString(to)).append("\n");\r
-               buf.append("Cc: ").append(arrayToCommaDelimitedString(cc)).append("\n");\r
-               buf.append("Bcc: ").append(arrayToCommaDelimitedString(bcc)).append("\n");\r
-               buf.append("Reply-To: ").append(replyTo != null ? replyTo.toUnicodeString() : null).append(\r
-                               "\n");\r
-               buf.append("Subject: ").append(subject).append("\n");\r
-\r
-               if (headers != null) {\r
-                       for (Iterator itr = headers.keySet().iterator(); itr.hasNext();) {\r
-                               String header = (String)itr.next();\r
-                               String value = (String)headers.get(header);\r
-                               buf.append(header).append(": ").append(value).append("\n");\r
-                       }\r
-               }\r
-\r
-               buf.append("\n");\r
-               buf.append(text);\r
-\r
-               if (htmlText != null) {\r
-                       buf.append("\n\n-----\n\n");\r
-                       buf.append(htmlText);\r
-               }\r
-\r
-               if (isFileAttached()) {\r
-                       buf.append("\n\nAttachments\n");\r
-                       for (int i = 0, num = attachmentFiles.size(); i < num; i++) {\r
-                               AttachmentFile f = (AttachmentFile)attachmentFiles.get(i);\r
-                               buf.append("[").append(i + 1).append("] ").append(f.getName()).append("\n");\r
-                       }\r
-               }\r
-\r
-               return buf.toString();\r
-       }\r
-\r
-       /**\r
-        * @return Returns the message.\r
-        */\r
-       public MimeMessage getMessage() {\r
-               return message;\r
-       }\r
-\r
-       /**\r
-        * @param message The message to set.\r
-        */\r
-       public void setMessage(MimeMessage message) {\r
-               this.message = message;\r
-       }\r
-\r
-       /**\r
-        * メールサーバとの接続切断時に、このメールをメールサーバから削除します。\r
-        * 削除できるように設定ができた場合に true を返します。\r
-        * <p>\r
-        * このメソッドは、<code>FetchMailPro</code>のメソッドによって取得された\r
-        * <code>ReceivedMail</code>インスタンスでのみ有効です。\r
-        * また、<code>FetchMailPro</code>インスタンスがメールサーバに\r
-        * 接続されている状態での呼び出しのみ有効です。<br>\r
-        * これらの条件が満たされない時にこのメソッドが呼び出された場合\r
-        * false を返します。\r
-        * \r
-        * TODO: うまく動いてない。\r
-        * \r
-        * @see FetchMailPro\r
-        * @param delete 削除するように設定する場合 true\r
-        * @return 削除設定が正常に行われた場合 true\r
-        */\r
-       public boolean setDelete(boolean delete) {\r
-               if (message != null) {\r
-                       try {\r
-                               message.setFlag(Flags.Flag.DELETED, delete);\r
-                       } catch (MessagingException e) {\r
-                               return false;\r
-                       }\r
-                       return true;\r
-               }\r
-               return false;\r
-       }\r
-\r
-       /**\r
-        * メールのサイズ(容量)を返します。単位はbyte。\r
-        * この値は厳密なものではないので注意してください。\r
-        * \r
-        * @see MimeMessage#getSize()\r
-        * @return メールのサイズ(単位はbyte)\r
-        */\r
-       public int getSize() {\r
-               return size;\r
-       }\r
-\r
-       /**\r
-        * メールのサイズ(容量)をセットします。単位はbyte。\r
-        * \r
-        * @param size メールのサイズ(単位はbyte)\r
-        */\r
-       public void setSize(int size) {\r
-               this.size = size;\r
-       }\r
-\r
-       /**\r
-        * 添付ファイルのFileインスタンス配列を返します。\r
-        * 添付ファイルがない場合は空の配列を返します。\r
-        * \r
-        * @return 添付ファイルのFileインスタンス配列\r
-        */\r
-       public File[] getFiles() {\r
-               AttachmentFile[] aFiles = getAttachmentFiles();\r
-               File[] files = new File[aFiles.length];\r
-               for (int i = 0; i < aFiles.length; i++) {\r
-                       AttachmentFile aFile = aFiles[i];\r
-                       files[i] = aFile.getFile();\r
-               }\r
-               return files;\r
-       }\r
-\r
-       /**\r
-        * このメールの返信メール用Mailインスタンスを生成して返します。\r
-        * <ul>\r
-        * <li>宛先(Toアドレス)には、このメールのReply-To、またはFromがセットされます。</li>\r
-        * <li>件名には、このメールの件名が大文字小文字問わず「Re:」で始まっていなければ、「Re: 」を頭に付けた件名がセットされます。「Re:」で始まっている場合には、その件名をそのままセットします。</li>\r
-        * <li>本文には、何もセットされません。</li>\r
-        * <li>このメールにMessage-IDがセットされていれば、In-Reply-Toヘッダにその値がセットされます。</li>\r
-        * <li>このメールにMessage-IDがセットされていれば、Referencesヘッダにその値が加えられます。</li>\r
-        * </ul>\r
-        * \r
-        * @return 返信用のMailインスタンス\r
-        */\r
-       public Mail reply() {\r
-               Mail mail = new Mail();\r
-\r
-               // 宛先\r
-               if (getReplyTo() != null) {\r
-                       mail.addTo(getReplyTo());\r
-               } else {\r
-                       mail.addTo(getFrom());\r
-               }\r
-\r
-               // 件名\r
-               String subject = getSubject();\r
-               if ((subject.length() >= 3 && !"Re:".equalsIgnoreCase(subject.substring(0, 3)))\r
-                               || subject.length() < 3) {\r
-                       subject = replySubjectPrefix + subject;\r
-               }\r
-               mail.setSubject(subject);\r
-\r
-               // In-Reply-To, References\r
-               String messageId = getMessageId();\r
-               if (messageId != null && !"<>".equals(messageId)) {\r
-                       String references = getRefereces();\r
-                       if (references != null) {\r
-                               references = messageId + " " + references;\r
-                       } else if (getInReplyTo() != null) {\r
-                               references = messageId + " " + getInReplyTo();\r
-                       } else {\r
-                               references = messageId;\r
-                       }\r
-                       mail.addHeader("References", references);\r
-                       mail.addHeader("In-Reply-To", messageId);\r
-               }\r
-\r
-               return mail;\r
-       }\r
-\r
-       /**\r
-        * Receivedヘッダフィールドを追加します。\r
-        * \r
-        * @param rh Receivedヘッダフィールド\r
-        */\r
-       public void addReceviedHeader(ReceivedHeader rh) {\r
-               if (receivedHeaders == null) {\r
-                       receivedHeaders = new ArrayList();\r
-               }\r
-               receivedHeaders.add(rh);\r
-       }\r
-\r
-       /**\r
-        * Receivedヘッダフィールドの配列を返します。<br>\r
-        * 自分のサーバ(このメールが届いたサーバ)から送信元のメールサーバを辿る順で並んでいます。<br>\r
-        * 受信メールがReceivedヘッダフィールドを持たない、または解析できなかった場合は空の配列を返します。\r
-        * \r
-        * @return Receivedヘッダフィールドの配列\r
-        */\r
-       public ReceivedHeader[] getReceivedHeaders() {\r
-               if (receivedHeaders == null) {\r
-                       return new ReceivedHeader[0];\r
-               }\r
-               return (ReceivedHeader[])receivedHeaders\r
-                               .toArray(new ReceivedHeader[receivedHeaders.size()]);\r
-       }\r
-\r
-       /**\r
-        * Receviedヘッダフィールドを表すクラス。\r
-        */\r
-       public static class ReceivedHeader {\r
-\r
-               private String from;\r
-\r
-               private String by;\r
-\r
-               /**\r
-                * @param from メールを送信したサーバのホスト名\r
-                * @param by メールを受信したサーバのホスト名\r
-                */\r
-               public ReceivedHeader(String from, String by) {\r
-                       this.from = from;\r
-                       this.by = by;\r
-               }\r
-\r
-               /**\r
-                * @see java.lang.Object#toString()\r
-                */\r
-               public String toString() {\r
-                       return "Sent from " + from + " and received by " + by;\r
-               }\r
-\r
-               /**\r
-                * メールを受信したサーバのホスト名を返します。\r
-                * \r
-                * @return メールを受信したサーバのホスト名\r
-                */\r
-               public String getBy() {\r
-                       return by;\r
-               }\r
-\r
-               /**\r
-                * メールを送信したサーバのホスト名を返します。\r
-                * \r
-                * @return メールを送信したサーバのホスト名\r
-                */\r
-               public String getFrom() {\r
-                       return from;\r
-               }\r
-       }\r
+package com.ozacc.mail.fetch;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.mail.Flags;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
+import com.ozacc.mail.Mail;
+
+/**
+ * 受信メール。
+ * <p>
+ * <code>FetchMail</code>、<code>FetchMailPro</code>の実装クラスで受信したメールが、
+ * インターネットメールとしての仕様を満たしていないヘッダ(FromやToなど)の値がセットされていた場合、
+ * そのヘッダに該当する<code>ReceivedMail</code>インスタンスのプロパティには何もセットされません。
+ * 
+ * @since 1.2
+ * @author Tomohiro Otsuka
+ * @version $Id: ReceivedMail.java,v 1.1.2.9 2005/01/23 07:13:13 otsuka Exp $
+ */
+public class ReceivedMail extends Mail {
+
+       private String replySubjectPrefix = "Re: ";
+
+       private Date date;
+
+       private String messageId;
+
+       private int size;
+
+       private List receivedHeaders;
+
+       private MimeMessage message;
+
+       /**
+        * コンストラクタ。
+        */
+       public ReceivedMail() {
+               super();
+       }
+
+       /**
+        * コンストラクタ。
+        * 
+        * @param charset 
+        */
+       public ReceivedMail(String charset) {
+               super(charset);
+       }
+
+       /**
+        * コピーコンストラクタ。
+        * 
+        * @param original 
+        */
+       public ReceivedMail(Mail original) {
+               super(original);
+       }
+
+       /**
+        * 送信日時を返します。
+        * <p>
+        * 注: メールの受信日時ではありません。
+        * 
+        * @return 送信日時
+        */
+       public Date getDate() {
+               return date;
+       }
+
+       /**
+        * 送信日時をセットします。
+        * 
+        * @param date 送信日時
+        */
+       public void setDate(Date date) {
+               this.date = date;
+       }
+
+       /**
+        * 前後に&lt;&gt;が付いたメッセージIDを返します。
+        * 受信メールにメッセージIDが存在しない場合はnullを返します。
+        * 
+        * @return 前後に&lt;&gt;が付いたメッセージID、またはnull
+        */
+       public String getMessageId() {
+               if (messageId == null || messageId.length() == 0) {
+                       return null;
+               }
+               if (messageId.startsWith("<") && messageId.endsWith(">")) {
+                       return messageId;
+               }
+               return "<" + messageId + ">";
+       }
+
+       /**
+        * メッセージIDを返します。前後に&lt;&gt;は付きません。
+        * 受信メールにメッセージIDが存在しない場合はnullを返します。
+        * 
+        * @return メッセージID、またはnull
+        */
+       public String getMessageIdWithoutBracket() {
+               if (messageId == null || messageId.length() == 0) {
+                       return null;
+               }
+               if (messageId.startsWith("<") && messageId.endsWith(">")) {
+                       return messageId.substring(1, messageId.length() - 1);
+               }
+               return messageId;
+       }
+
+       /**
+        * メッセージIDをセットします。
+        * 
+        * @param messageId メッセージID
+        */
+       public void setMessageId(String messageId) {
+               this.messageId = messageId;
+       }
+
+       /**
+        * In-Reply-Toヘッダの値を返します。
+        * In-Reply-Toヘッダがない場合はnullを返します。
+        * 
+        * @return In-Reply-Toヘッダの値
+        */
+       public String getInReplyTo() {
+               return (String)headers.get("In-Reply-To");
+       }
+
+       /**
+        * Referencesヘッダの値を返します。
+        * Referencesヘッダがない場合はnullを返します。
+        * 
+        * @return Referencesヘッダの値
+        */
+       public String getRefereces() {
+               return (String)headers.get("References");
+       }
+
+       /**
+        * @return 返信時の件名に付ける接頭辞
+        */
+       public String getReplySubjectPrefix() {
+               return replySubjectPrefix;
+       }
+
+       /**
+        * 返信時の件名に付ける接頭辞をセットします。
+        * デフォルトは「Re: 」。
+        * 
+        * @param replySubjectPrefix 返信時の件名に付ける接頭辞
+        */
+       public void setReplySubjectPrefix(String replySubjectPrefix) {
+               this.replySubjectPrefix = replySubjectPrefix;
+       }
+
+       /**
+        * メール内容を出力します。<br>
+        * メールのソースに似たフォーマットで出力されます。
+        * 
+        * @see java.lang.Object#toString()
+        */
+       public String toString() {
+               StringBuffer buf = new StringBuffer(1000);
+               buf.append("Mail\n");
+               buf.append("Return-Path: ").append(returnPath).append("\n");
+               buf.append("Message-ID: ").append(messageId).append("\n");
+               buf.append("Date: ").append(date).append("\n");
+               buf.append("From: ").append(from != null ? from.toUnicodeString() : null).append("\n");
+               buf.append("To: ").append(arrayToCommaDelimitedString(to)).append("\n");
+               buf.append("Cc: ").append(arrayToCommaDelimitedString(cc)).append("\n");
+               buf.append("Bcc: ").append(arrayToCommaDelimitedString(bcc)).append("\n");
+               buf.append("Reply-To: ").append(replyTo != null ? replyTo.toUnicodeString() : null).append(
+                               "\n");
+               buf.append("Subject: ").append(subject).append("\n");
+
+               if (headers != null) {
+                       for (Iterator itr = headers.keySet().iterator(); itr.hasNext();) {
+                               String header = (String)itr.next();
+                               String value = (String)headers.get(header);
+                               buf.append(header).append(": ").append(value).append("\n");
+                       }
+               }
+
+               buf.append("\n");
+               buf.append(text);
+
+               if (htmlText != null) {
+                       buf.append("\n\n-----\n\n");
+                       buf.append(htmlText);
+               }
+
+               if (isFileAttached()) {
+                       buf.append("\n\nAttachments\n");
+                       for (int i = 0, num = attachmentFiles.size(); i < num; i++) {
+                               AttachmentFile f = (AttachmentFile)attachmentFiles.get(i);
+                               buf.append("[").append(i + 1).append("] ").append(f.getName()).append("\n");
+                       }
+               }
+
+               return buf.toString();
+       }
+
+       /**
+        * @return Returns the message.
+        */
+       public MimeMessage getMessage() {
+               return message;
+       }
+
+       /**
+        * @param message The message to set.
+        */
+       public void setMessage(MimeMessage message) {
+               this.message = message;
+       }
+
+       /**
+        * メールサーバとの接続切断時に、このメールをメールサーバから削除します。
+        * 削除できるように設定ができた場合に true を返します。
+        * <p>
+        * このメソッドは、<code>FetchMailPro</code>のメソッドによって取得された
+        * <code>ReceivedMail</code>インスタンスでのみ有効です。
+        * また、<code>FetchMailPro</code>インスタンスがメールサーバに
+        * 接続されている状態での呼び出しのみ有効です。<br>
+        * これらの条件が満たされない時にこのメソッドが呼び出された場合
+        * false を返します。
+        * 
+        * TODO: うまく動いてない。
+        * 
+        * @see FetchMailPro
+        * @param delete 削除するように設定する場合 true
+        * @return 削除設定が正常に行われた場合 true
+        */
+       public boolean setDelete(boolean delete) {
+               if (message != null) {
+                       try {
+                               message.setFlag(Flags.Flag.DELETED, delete);
+                       } catch (MessagingException e) {
+                               return false;
+                       }
+                       return true;
+               }
+               return false;
+       }
+
+       /**
+        * メールのサイズ(容量)を返します。単位はbyte。
+        * この値は厳密なものではないので注意してください。
+        * 
+        * @see MimeMessage#getSize()
+        * @return メールのサイズ(単位はbyte)
+        */
+       public int getSize() {
+               return size;
+       }
+
+       /**
+        * メールのサイズ(容量)をセットします。単位はbyte。
+        * 
+        * @param size メールのサイズ(単位はbyte)
+        */
+       public void setSize(int size) {
+               this.size = size;
+       }
+
+       /**
+        * 添付ファイルのFileインスタンス配列を返します。
+        * 添付ファイルがない場合は空の配列を返します。
+        * 
+        * @return 添付ファイルのFileインスタンス配列
+        */
+       public File[] getFiles() {
+               AttachmentFile[] aFiles = getAttachmentFiles();
+               File[] files = new File[aFiles.length];
+               for (int i = 0; i < aFiles.length; i++) {
+                       AttachmentFile aFile = aFiles[i];
+                       files[i] = aFile.getFile();
+               }
+               return files;
+       }
+
+       /**
+        * このメールの返信メール用Mailインスタンスを生成して返します。
+        * <ul>
+        * <li>宛先(Toアドレス)には、このメールのReply-To、またはFromがセットされます。</li>
+        * <li>件名には、このメールの件名が大文字小文字問わず「Re:」で始まっていなければ、「Re: 」を頭に付けた件名がセットされます。「Re:」で始まっている場合には、その件名をそのままセットします。</li>
+        * <li>本文には、何もセットされません。</li>
+        * <li>このメールにMessage-IDがセットされていれば、In-Reply-Toヘッダにその値がセットされます。</li>
+        * <li>このメールにMessage-IDがセットされていれば、Referencesヘッダにその値が加えられます。</li>
+        * </ul>
+        * 
+        * @return 返信用のMailインスタンス
+        */
+       public Mail reply() {
+               Mail mail = new Mail();
+
+               // 宛先
+               if (getReplyTo() != null) {
+                       mail.addTo(getReplyTo());
+               } else {
+                       mail.addTo(getFrom());
+               }
+
+               // 件名
+               String subject = getSubject();
+               if ((subject.length() >= 3 && !"Re:".equalsIgnoreCase(subject.substring(0, 3)))
+                               || subject.length() < 3) {
+                       subject = replySubjectPrefix + subject;
+               }
+               mail.setSubject(subject);
+
+               // In-Reply-To, References
+               String messageId = getMessageId();
+               if (messageId != null && !"<>".equals(messageId)) {
+                       String references = getRefereces();
+                       if (references != null) {
+                               references = messageId + " " + references;
+                       } else if (getInReplyTo() != null) {
+                               references = messageId + " " + getInReplyTo();
+                       } else {
+                               references = messageId;
+                       }
+                       mail.addHeader("References", references);
+                       mail.addHeader("In-Reply-To", messageId);
+               }
+
+               return mail;
+       }
+
+       /**
+        * Receivedヘッダフィールドを追加します。
+        * 
+        * @param rh Receivedヘッダフィールド
+        */
+       public void addReceviedHeader(ReceivedHeader rh) {
+               if (receivedHeaders == null) {
+                       receivedHeaders = new ArrayList();
+               }
+               receivedHeaders.add(rh);
+       }
+
+       /**
+        * Receivedヘッダフィールドの配列を返します。<br>
+        * 自分のサーバ(このメールが届いたサーバ)から送信元のメールサーバを辿る順で並んでいます。<br>
+        * 受信メールがReceivedヘッダフィールドを持たない、または解析できなかった場合は空の配列を返します。
+        * 
+        * @return Receivedヘッダフィールドの配列
+        */
+       public ReceivedHeader[] getReceivedHeaders() {
+               if (receivedHeaders == null) {
+                       return new ReceivedHeader[0];
+               }
+               return (ReceivedHeader[])receivedHeaders
+                               .toArray(new ReceivedHeader[receivedHeaders.size()]);
+       }
+
+       /**
+        * Receviedヘッダフィールドを表すクラス。
+        */
+       public static class ReceivedHeader {
+
+               private String from;
+
+               private String by;
+
+               /**
+                * @param from メールを送信したサーバのホスト名
+                * @param by メールを受信したサーバのホスト名
+                */
+               public ReceivedHeader(String from, String by) {
+                       this.from = from;
+                       this.by = by;
+               }
+
+               /**
+                * @see java.lang.Object#toString()
+                */
+               public String toString() {
+                       return "Sent from " + from + " and received by " + by;
+               }
+
+               /**
+                * メールを受信したサーバのホスト名を返します。
+                * 
+                * @return メールを受信したサーバのホスト名
+                */
+               public String getBy() {
+                       return by;
+               }
+
+               /**
+                * メールを送信したサーバのホスト名を返します。
+                * 
+                * @return メールを送信したサーバのホスト名
+                */
+               public String getFrom() {
+                       return from;
+               }
+       }
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index a4efe50..19b2fb2
-package com.ozacc.mail.fetch.impl;\r
-\r
-import com.ozacc.mail.MailException;\r
-import com.ozacc.mail.fetch.FetchMail;\r
-import com.ozacc.mail.fetch.ReceivedMail;\r
-\r
-/**\r
- * <code>FetchMail</code>インターフェースの実装クラス。\r
- * <p>\r
- * <code>FetchMailProImpl</code>クラスに処理を委譲しています。\r
- * \r
- * @since 1.2\r
- * @see FetchMailProImpl\r
- * \r
- * @author Tomohiro Otsuka\r
- * @version $Id: FetchMailImpl.java,v 1.1.2.6 2005/01/29 22:33:40 otsuka Exp $\r
- */\r
-public class FetchMailImpl implements FetchMail {\r
-\r
-       /** デフォルトのSMTPサーバ。「localhost」 */\r
-       public static final String DEFAULT_HOST = "localhost";\r
-\r
-       /** デフォルトのプロトコル。「pop3」 */\r
-       public static final String DEFAULT_PROTOCOL = "pop3";\r
-\r
-       /**\r
-        * デフォルトのポート。「-1」<br>\r
-        * -1はプロトコルに応じた適切なポートを設定する特別な値。\r
-        */\r
-       public static final int DEFAULT_PORT = -1;\r
-\r
-       private static final String INBOX_NAME = "INBOX";\r
-\r
-       private String host = DEFAULT_HOST;\r
-\r
-       private String protocol = DEFAULT_PROTOCOL;\r
-\r
-       private int port = DEFAULT_PORT;\r
-\r
-       private String username;\r
-\r
-       private String password;\r
-\r
-       /**\r
-        * コンストラクタ。\r
-        */\r
-       public FetchMailImpl() {}\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMail#getMails()\r
-        */\r
-       public ReceivedMail[] getMails() throws MailException {\r
-               return getMails(false);\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMail#getMails(boolean)\r
-        */\r
-       public ReceivedMail[] getMails(boolean delete) throws MailException {\r
-               FetchMailProImpl fetchMailProImpl = createFetchMailProImpl();\r
-               fetchMailProImpl.connect();\r
-               try {\r
-                       return fetchMailProImpl.getMails(delete);\r
-               } finally {\r
-                       fetchMailProImpl.disconnect();\r
-               }\r
-       }\r
-\r
-       /**\r
-        * サーバ情報をセットしたFetchMailProImplインスタンスを生成します。\r
-        * \r
-        * @return サーバ情報をセットしたFetchMailProImplインスタンス\r
-        */\r
-       private FetchMailProImpl createFetchMailProImpl() {\r
-               FetchMailProImpl fmp = new FetchMailProImpl();\r
-               fmp.setHost(host);\r
-               fmp.setPort(port);\r
-               fmp.setProtocol(protocol);\r
-               fmp.setUsername(username);\r
-               fmp.setPassword(password);\r
-               return fmp;\r
-       }\r
-\r
-       /**\r
-        * メールサーバのホスト名、またはIPアドレスをセットします。\r
-        * デフォルトは localhost です。\r
-        * \r
-        * @param host メールサーバのホスト名、またはIPアドレス\r
-        */\r
-       public void setHost(String host) {\r
-               this.host = host;\r
-       }\r
-\r
-       /**\r
-        * メールサーバの認証パスワード名をセットします。\r
-        * \r
-        * @param password メールサーバの認証パスワード\r
-        */\r
-       public void setPassword(String password) {\r
-               this.password = password;\r
-       }\r
-\r
-       /**\r
-        * メール受信に使用するポート番号をセットします。\r
-        * プロトコルに応じたポート番号が自動的に使用されますので、通常ここでポート番号をセットする必要はありません。\r
-        * \r
-        * @param port ポート番号\r
-        */\r
-       public void setPort(int port) {\r
-               this.port = port;\r
-       }\r
-\r
-       /**\r
-        * メール受信に使用するプロトコロルをセットします。\r
-        * 現在サポートされているプロトコルは、「pop3」と「imap」の二つです。\r
-        * デフォルトは「pop3」です。\r
-        * <p>\r
-        * POP3サーバへの認証をAPOPで行いたい場合は、プロトコル名ではありませんが、\r
-        * 「apop」を指定してください。APOP認証を使用するには、JavaMail 1.3.2以降が必要です。\r
-        * \r
-        * @param protocol プロトコル\r
-        */\r
-       public void setProtocol(String protocol) {\r
-               this.protocol = protocol;\r
-       }\r
-\r
-       /**\r
-        * メールサーバの認証ユーザ名をセットします。\r
-        * \r
-        * @param username メールサーバの認証ユーザ名\r
-        */\r
-       public void setUsername(String username) {\r
-               this.username = username;\r
-       }\r
-\r
-       /**\r
-        * メールサーバのホスト名、またはIPアドレスを返します。\r
-        * \r
-        * @return メールサーバのホスト名、またはIPアドレス\r
-        */\r
-       public String getHost() {\r
-               return host;\r
-       }\r
-\r
-       /**\r
-        * メールサーバの認証パスワードを返します。\r
-        * \r
-        * @return メールサーバの認証パスワード\r
-        */\r
-       public String getPassword() {\r
-               return password;\r
-       }\r
-\r
-       /**\r
-        * @return ポート番号\r
-        */\r
-       public int getPort() {\r
-               return port;\r
-       }\r
-\r
-       /**\r
-        * メール受信に使用するプロトコロルをセットします。\r
-        * \r
-        * @return プロトコル\r
-        */\r
-       public String getProtocol() {\r
-               return protocol;\r
-       }\r
-\r
-       /**\r
-        * メールサーバの認証ユーザ名を返します。\r
-        * \r
-        * @return メールサーバの認証ユーザ名\r
-        */\r
-       public String getUsername() {\r
-               return username;\r
-       }\r
+package com.ozacc.mail.fetch.impl;
+
+import com.ozacc.mail.MailException;
+import com.ozacc.mail.fetch.FetchMail;
+import com.ozacc.mail.fetch.ReceivedMail;
+
+/**
+ * <code>FetchMail</code>インターフェースの実装クラス。
+ * <p>
+ * <code>FetchMailProImpl</code>クラスに処理を委譲しています。
+ * 
+ * @since 1.2
+ * @see FetchMailProImpl
+ * 
+ * @author Tomohiro Otsuka
+ * @version $Id: FetchMailImpl.java,v 1.1.2.6 2005/01/29 22:33:40 otsuka Exp $
+ */
+public class FetchMailImpl implements FetchMail {
+
+       /** デフォルトのSMTPサーバ。「localhost」 */
+       public static final String DEFAULT_HOST = "localhost";
+
+       /** デフォルトのプロトコル。「pop3」 */
+       public static final String DEFAULT_PROTOCOL = "pop3";
+
+       /**
+        * デフォルトのポート。「-1」<br>
+        * -1はプロトコルに応じた適切なポートを設定する特別な値。
+        */
+       public static final int DEFAULT_PORT = -1;
+
+       private static final String INBOX_NAME = "INBOX";
+
+       private String host = DEFAULT_HOST;
+
+       private String protocol = DEFAULT_PROTOCOL;
+
+       private int port = DEFAULT_PORT;
+
+       private String username;
+
+       private String password;
+
+       /**
+        * コンストラクタ。
+        */
+       public FetchMailImpl() {}
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMail#getMails()
+        */
+       public ReceivedMail[] getMails() throws MailException {
+               return getMails(false);
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMail#getMails(boolean)
+        */
+       public ReceivedMail[] getMails(boolean delete) throws MailException {
+               FetchMailProImpl fetchMailProImpl = createFetchMailProImpl();
+               fetchMailProImpl.connect();
+               try {
+                       return fetchMailProImpl.getMails(delete);
+               } finally {
+                       fetchMailProImpl.disconnect();
+               }
+       }
+
+       /**
+        * サーバ情報をセットしたFetchMailProImplインスタンスを生成します。
+        * 
+        * @return サーバ情報をセットしたFetchMailProImplインスタンス
+        */
+       private FetchMailProImpl createFetchMailProImpl() {
+               FetchMailProImpl fmp = new FetchMailProImpl();
+               fmp.setHost(host);
+               fmp.setPort(port);
+               fmp.setProtocol(protocol);
+               fmp.setUsername(username);
+               fmp.setPassword(password);
+               return fmp;
+       }
+
+       /**
+        * メールサーバのホスト名、またはIPアドレスをセットします。
+        * デフォルトは localhost です。
+        * 
+        * @param host メールサーバのホスト名、またはIPアドレス
+        */
+       public void setHost(String host) {
+               this.host = host;
+       }
+
+       /**
+        * メールサーバの認証パスワード名をセットします。
+        * 
+        * @param password メールサーバの認証パスワード
+        */
+       public void setPassword(String password) {
+               this.password = password;
+       }
+
+       /**
+        * メール受信に使用するポート番号をセットします。
+        * プロトコルに応じたポート番号が自動的に使用されますので、通常ここでポート番号をセットする必要はありません。
+        * 
+        * @param port ポート番号
+        */
+       public void setPort(int port) {
+               this.port = port;
+       }
+
+       /**
+        * メール受信に使用するプロトコロルをセットします。
+        * 現在サポートされているプロトコルは、「pop3」と「imap」の二つです。
+        * デフォルトは「pop3」です。
+        * <p>
+        * POP3サーバへの認証をAPOPで行いたい場合は、プロトコル名ではありませんが、
+        * 「apop」を指定してください。APOP認証を使用するには、JavaMail 1.3.2以降が必要です。
+        * 
+        * @param protocol プロトコル
+        */
+       public void setProtocol(String protocol) {
+               this.protocol = protocol;
+       }
+
+       /**
+        * メールサーバの認証ユーザ名をセットします。
+        * 
+        * @param username メールサーバの認証ユーザ名
+        */
+       public void setUsername(String username) {
+               this.username = username;
+       }
+
+       /**
+        * メールサーバのホスト名、またはIPアドレスを返します。
+        * 
+        * @return メールサーバのホスト名、またはIPアドレス
+        */
+       public String getHost() {
+               return host;
+       }
+
+       /**
+        * メールサーバの認証パスワードを返します。
+        * 
+        * @return メールサーバの認証パスワード
+        */
+       public String getPassword() {
+               return password;
+       }
+
+       /**
+        * @return ポート番号
+        */
+       public int getPort() {
+               return port;
+       }
+
+       /**
+        * メール受信に使用するプロトコロルをセットします。
+        * 
+        * @return プロトコル
+        */
+       public String getProtocol() {
+               return protocol;
+       }
+
+       /**
+        * メールサーバの認証ユーザ名を返します。
+        * 
+        * @return メールサーバの認証ユーザ名
+        */
+       public String getUsername() {
+               return username;
+       }
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index bb862ec..fe025d0
-package com.ozacc.mail.fetch.impl;\r
-\r
-import java.util.Properties;\r
-\r
-import javax.mail.AuthenticationFailedException;\r
-import javax.mail.Flags;\r
-import javax.mail.Folder;\r
-import javax.mail.Message;\r
-import javax.mail.MessagingException;\r
-import javax.mail.NoSuchProviderException;\r
-import javax.mail.Session;\r
-import javax.mail.Store;\r
-import javax.mail.internet.MimeMessage;\r
-\r
-import org.apache.commons.logging.Log;\r
-import org.apache.commons.logging.LogFactory;\r
-\r
-import com.ozacc.mail.MailAuthenticationException;\r
-import com.ozacc.mail.MailException;\r
-import com.ozacc.mail.NotConnectedException;\r
-import com.ozacc.mail.fetch.FetchMailPro;\r
-import com.ozacc.mail.fetch.MailConverter;\r
-import com.ozacc.mail.fetch.MailFetchException;\r
-import com.ozacc.mail.fetch.ReceivedMail;\r
-\r
-/**\r
- * <code>FetchMail</code>インターフェースの実装クラス。\r
- * <p>\r
- * このクラスのインスタンスは、インスタンス変数を用いて状態を保持するため、\r
- * ステートレスではありません。ステートフルです。\r
- * \r
- * @since 1.2\r
- * @author Tomohiro Otsuka\r
- * @author gaku\r
- * @version $Id: FetchMailProImpl.java,v 1.1.2.13 2005/04/10 05:22:24 otsuka Exp $\r
- */\r
-public class FetchMailProImpl implements FetchMailPro {\r
-\r
-       private static Log log = LogFactory.getLog(FetchMailProImpl.class);\r
-\r
-       /** デフォルトのSMTPサーバ。「localhost」 */\r
-       public static final String DEFAULT_HOST = "localhost";\r
-\r
-       /** デフォルトのプロトコル。「pop3」 */\r
-       public static final String DEFAULT_PROTOCOL = "pop3";\r
-\r
-       /**\r
-        * デフォルトのポート。「-1」<br>\r
-        * -1はプロトコルに応じた適切なポートを設定する特別な値。\r
-        */\r
-       public static final int DEFAULT_PORT = -1;\r
-\r
-       private static final String INBOX_NAME = "INBOX";\r
-\r
-       private String host = DEFAULT_HOST;\r
-\r
-       private String protocol = DEFAULT_PROTOCOL;\r
-\r
-       private int port = DEFAULT_PORT;\r
-\r
-       private String username;\r
-\r
-       private String password;\r
-\r
-       private boolean javaMailLogEnabled;\r
-\r
-       private Store store;\r
-\r
-       private Folder currentFolder;\r
-\r
-       /** MailConver の実装インスタンス。 */\r
-       private MailConverter mailConverter = new MailConverterImpl();\r
-\r
-       /**\r
-        * コンストラクタ。\r
-        */\r
-       public FetchMailProImpl() {\r
-               System.setProperty("mail.mime.multipart.ignoremissingendboundary", "true");\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#connect()\r
-        */\r
-       public synchronized void connect() throws MailException {\r
-               if (isConnected()) {\r
-                       log.warn("既にサーバ[" + host + "]に接続されています。再接続するには先に接続を切断する必要があります。");\r
-                       return;\r
-               }\r
-\r
-               log.debug(protocol.toUpperCase() + "サーバ[" + host + "]に接続します。");\r
-               Session session = Session.getInstance(createProperties(), null);\r
-               if (javaMailLogEnabled) {\r
-                       session.setDebug(true);\r
-               }\r
-               try {\r
-                       store = session.getStore(protocol);\r
-                       store.connect(host, port, username, password);\r
-               } catch (NoSuchProviderException e) {\r
-                       log.error("指定されたプロトコル[" + protocol + "]はサポートされていません。", e);\r
-                       throw new MailException("指定されたプロトコル[" + protocol + "]はサポートされていません。", e);\r
-               } catch (AuthenticationFailedException e) {\r
-                       log.error(protocol.toUpperCase() + "サーバ[" + host + "]への接続認証に失敗しました。", e);\r
-                       throw new MailAuthenticationException(protocol.toUpperCase() + "サーバ[" + host\r
-                                       + "]への接続認証に失敗しました。", e);\r
-               } catch (MessagingException e) {\r
-                       log.error(protocol.toUpperCase() + "サーバ[" + host + "]への接続に失敗しました。", e);\r
-                       throw new MailException(protocol.toUpperCase() + "サーバ[" + host + "]への接続に失敗しました。", e);\r
-               }\r
-               log.info(protocol.toUpperCase() + "サーバ[" + host + "]に接続しました。");\r
-\r
-               changeFolder(INBOX_NAME);\r
-       }\r
-\r
-       /**\r
-        * Sessionに渡すPropertiesインスタンスを返します。\r
-        * APOP認証を行う場合に、"mail.pop3.apop.enable"をセットします。\r
-        * \r
-        * @return Sessionに渡すPropertiesインスタンス\r
-        */\r
-       private Properties createProperties() {\r
-               Properties prop = new Properties();\r
-               if ("apop".equalsIgnoreCase(protocol)) {\r
-                       prop.put("mail.pop3.apop.enable", "true");\r
-               }\r
-               return prop;\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#disconnect()\r
-        */\r
-       public synchronized void disconnect() throws MailException {\r
-               try {\r
-                       closeCurrentFolderIfOpen();\r
-               } finally {\r
-                       if (isConnected()) {\r
-                               log.debug(protocol.toUpperCase() + "サーバ[" + host + "]との接続を切断します。");\r
-                               try {\r
-                                       store.close();\r
-                                       store = null;\r
-                               } catch (MessagingException e) {\r
-                                       throw new MailException("サーバ[" + host + "]との接続切断に失敗しました。", e);\r
-                               }\r
-                       }\r
-               }\r
-               log.info(protocol.toUpperCase() + "サーバ[" + host + "]との接続を切断しました。");\r
-       }\r
-\r
-       /**\r
-        * 現在のメッセージフォルダをクローズします。\r
-        * \r
-        * @throws MailException メッセージフォルダのクローズに失敗した場合\r
-        */\r
-       private void closeCurrentFolderIfOpen() throws MailException {\r
-               if (currentFolder != null && currentFolder.isOpen()) {\r
-                       log.debug("メッセージフォルダ[" + currentFolder.getName() + "]をクローズします。");\r
-                       try {\r
-                               currentFolder.close(true);\r
-                       } catch (MessagingException e) {\r
-                               log.error("メッセージフォルダ[" + currentFolder.getName() + "]のクローズに失敗しました。", e);\r
-                               throw new MailException("メッセージフォルダ[" + currentFolder.getName() + "]のクローズに失敗しました。",\r
-                                               e);\r
-                       }\r
-                       log.debug("メッセージフォルダ[" + currentFolder.getName() + "]をクローズしました。");\r
-                       currentFolder = null;\r
-               }\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#changeFolder(java.lang.String)\r
-        */\r
-       public synchronized void changeFolder(String folderName) throws MailException {\r
-               if (!isConnected()) {\r
-                       log.warn("メールサーバに接続されていません。");\r
-                       return;\r
-               }\r
-\r
-               closeCurrentFolderIfOpen();\r
-               log.debug("メッセージフォルダ[" + folderName + "]をオープンします。");\r
-               try {\r
-                       currentFolder = store.getFolder(folderName);\r
-                       currentFolder.open(Folder.READ_WRITE);\r
-               } catch (MessagingException e) {\r
-                       log.error("メッセージフォルダ[" + folderName + "]のオープンに失敗しました。", e);\r
-                       throw new MailException("メッセージフォルダ[" + folderName + "]のオープンに失敗しました。", e);\r
-               }\r
-               log.debug("メッセージフォルダ[" + folderName + "]をオープンしました。");\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#getMailCount()\r
-        */\r
-       public int getMailCount() throws MailException {\r
-               checkIfCurrentFolderIsOpen();\r
-               try {\r
-                       return currentFolder.getMessageCount();\r
-               } catch (MessagingException e) {\r
-                       throw new MailFetchException("メール数の取得に失敗しました。", e);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールサーバに接続されていて、フォルダが操作できる状態かどうか調べます。\r
-        * フォルダが操作できる状態にない場合、NotConnectedExceptionをスローします。\r
-        * \r
-        * @throws NotConnectedException\r
-        */\r
-       private void checkIfCurrentFolderIsOpen() throws NotConnectedException {\r
-               if (currentFolder == null || !currentFolder.isOpen()) {\r
-                       throw new NotConnectedException(protocol.toUpperCase() + "サーバ[" + host + "]に接続されていません。");\r
-               }\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#getMail(int)\r
-        */\r
-       public ReceivedMail getMail(int num) throws MailException {\r
-               return getMail(num, false);\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#getMail(int, boolean)\r
-        */\r
-       public ReceivedMail getMail(int num, boolean delete) throws MailException {\r
-               MimeMessage mimeMessage = getMessage(num);\r
-               try {\r
-                       mimeMessage.setFlag(Flags.Flag.DELETED, delete);\r
-                       log.debug(num + "番目のメッセージにDELETEDフラグをセットしました。");\r
-               } catch (MessagingException e) {\r
-                       throw new MailException("DELETEDフラグのセットに失敗しました。", e);\r
-               }\r
-               return mailConverter.convertIntoMail(mimeMessage);\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#getMails(boolean)\r
-        */\r
-       public ReceivedMail[] getMails(boolean delete) throws MailException {\r
-               MimeMessage[] mimeMessages = getMessages(delete);\r
-               return mailConverter.convertIntoMails(mimeMessages);\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#getMessage(int)\r
-        */\r
-       public synchronized MimeMessage getMessage(int num) throws MailException {\r
-               checkIfCurrentFolderIsOpen();\r
-               try {\r
-                       return (MimeMessage)currentFolder.getMessage(num);\r
-               } catch (MessagingException e) {\r
-                       log.error("メッセージの取得に失敗しました。", e);\r
-                       throw new MailFetchException("メッセージの取得に失敗しました。", e);\r
-               }\r
-       }\r
-\r
-       public synchronized MimeMessage[] getMessages(boolean delete) throws MailException {\r
-               checkIfCurrentFolderIsOpen();\r
-               try {\r
-                       Message[] messages = currentFolder.getMessages();\r
-                       if (log.isInfoEnabled()) {\r
-                               if (messages.length > 0) {\r
-                                       log.info(messages.length + "通のメールを受信します。");\r
-                               } else {\r
-                                       log.info("受信するメールはありません。");\r
-                               }\r
-                       }\r
-                       // SEENフラグを立てる\r
-                       currentFolder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);\r
-                       // DELETEDフラグを立てる\r
-                       if (delete) {\r
-                               currentFolder.setFlags(messages, new Flags(Flags.Flag.DELETED), true);\r
-                       }\r
-                       MimeMessage[] mimeMessages = new MimeMessage[messages.length];\r
-                       for (int i = 0; i < messages.length; i++) {\r
-                               mimeMessages[i] = (MimeMessage)messages[i];\r
-                       }\r
-                       return mimeMessages;\r
-               } catch (MessagingException e) {\r
-                       log.error("メッセージの取得に失敗しました。", e);\r
-                       throw new MailFetchException("メッセージの取得に失敗しました。", e);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.FetchMailPro#isConnected()\r
-        */\r
-       public boolean isConnected() {\r
-               return store != null && store.isConnected();\r
-       }\r
-\r
-       /**\r
-        *  メールサーバのホスト名、またはIPアドレスを返します。\r
-        * \r
-        * @return  メールサーバのホスト名、またはIPアドレス\r
-        */\r
-       public String getHost() {\r
-               return host;\r
-       }\r
-\r
-       /**\r
-        * メールサーバのホスト名、またはIPアドレスをセットします。\r
-        * デフォルトは localhost です。\r
-        * \r
-        * @param host メールサーバのホスト名、またはIPアドレス\r
-        */\r
-       public void setHost(String host) {\r
-               this.host = host;\r
-       }\r
-\r
-       /**\r
-        * メールサーバの認証パスワードを返します。\r
-        * \r
-        * @return メールサーバの認証パスワード\r
-        */\r
-       public String getPassword() {\r
-               return password;\r
-       }\r
-\r
-       /**\r
-        * メールサーバの認証パスワード名をセットします。\r
-        * \r
-        * @param password メールサーバの認証パスワード\r
-        */\r
-       public void setPassword(String password) {\r
-               this.password = password;\r
-       }\r
-\r
-       /**\r
-        * メール受信に使用するプロトコロルをセットします。\r
-        * \r
-        * @return プロトコル\r
-        */\r
-       public String getProtocol() {\r
-               return protocol;\r
-       }\r
-\r
-       /**\r
-        * メール受信に使用するプロトコロルをセットします。\r
-        * 現在サポートされているプロトコルは、「pop3」と「imap」の二つです。\r
-        * デフォルトは「pop3」です。\r
-        * <p>\r
-        * POP3サーバへの認証をAPOPで行いたい場合は、プロトコル名ではありませんが、\r
-        * 「apop」を指定してください。APOP認証を使用するには、JavaMail 1.3.2以降が必要です。\r
-        * \r
-        * @param protocol プロトコル\r
-        */\r
-       public void setProtocol(String protocol) {\r
-               this.protocol = protocol;\r
-       }\r
-\r
-       /**\r
-        * @return 認証ユーザ名\r
-        */\r
-       public String getUsername() {\r
-               return username;\r
-       }\r
-\r
-       /**\r
-        * メールサーバの認証ユーザ名をセットします。\r
-        * \r
-        * @param username 認証ユーザ名\r
-        */\r
-       public void setUsername(String username) {\r
-               this.username = username;\r
-       }\r
-\r
-       /**\r
-        * @return ポート番号\r
-        */\r
-       public int getPort() {\r
-               return port;\r
-       }\r
-\r
-       /**\r
-        * メール受信に使用するポート番号をセットします。\r
-        * プロトコルに応じたポート番号が自動的に使用されますので、通常ここでポート番号をセットする必要はありません。\r
-        * \r
-        * @param port ポート番号\r
-        */\r
-       public void setPort(int port) {\r
-               this.port = port;\r
-       }\r
-\r
-       /**\r
-        * JavaMailのデバッグが有効かどうか判定します。\r
-        * \r
-        * @return JavaMailのデバッグが有効な場合 ture\r
-        */\r
-       public boolean isJavaMailLogEnabled() {\r
-               return javaMailLogEnabled;\r
-       }\r
-\r
-       /**\r
-        * JavaMailのデバッグを有効にするかどうか指定します。\r
-        * 有効にすると、<code>System.out</code>のデバッグメッセージが出力されます。<br>\r
-        * デフォルトは無効になっています。\r
-        * \r
-        * @see javax.mail.session#setDebug(boolean)\r
-        * @param javaMailLogEnabled The javaMailLogEnabled to set.\r
-        */\r
-       public void setJavaMailLogEnabled(boolean javaMailLogEnabled) {\r
-               this.javaMailLogEnabled = javaMailLogEnabled;\r
-       }\r
-\r
-       /**\r
-        * MailConveterインターフェースの実装インスタンスをセットします。\r
-        * デフォルトでは、MailConverterImplが使用されます。\r
-        * \r
-        * @see com.ozacc.mail.fetch.MailConveter\r
-        * @see com.ozacc.mail.fetch.impl.MailConveterImpl\r
-        * @param mailConverter MailConveterインターフェースの実装インスタンス\r
-        */\r
-       public void setMailConverter(MailConverter mailConverter) {\r
-               this.mailConverter = mailConverter;\r
-       }\r
+package com.ozacc.mail.fetch.impl;
+
+import java.util.Properties;
+
+import javax.mail.AuthenticationFailedException;
+import javax.mail.Flags;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.NoSuchProviderException;
+import javax.mail.Session;
+import javax.mail.Store;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.ozacc.mail.MailAuthenticationException;
+import com.ozacc.mail.MailException;
+import com.ozacc.mail.NotConnectedException;
+import com.ozacc.mail.fetch.FetchMailPro;
+import com.ozacc.mail.fetch.MailConverter;
+import com.ozacc.mail.fetch.MailFetchException;
+import com.ozacc.mail.fetch.ReceivedMail;
+
+/**
+ * <code>FetchMail</code>インターフェースの実装クラス。
+ * <p>
+ * このクラスのインスタンスは、インスタンス変数を用いて状態を保持するため、
+ * ステートレスではありません。ステートフルです。
+ * 
+ * @since 1.2
+ * @author Tomohiro Otsuka
+ * @author gaku
+ * @version $Id: FetchMailProImpl.java,v 1.1.2.13 2005/04/10 05:22:24 otsuka Exp $
+ */
+public class FetchMailProImpl implements FetchMailPro {
+
+       private static Log log = LogFactory.getLog(FetchMailProImpl.class);
+
+       /** デフォルトのSMTPサーバ。「localhost」 */
+       public static final String DEFAULT_HOST = "localhost";
+
+       /** デフォルトのプロトコル。「pop3」 */
+       public static final String DEFAULT_PROTOCOL = "pop3";
+
+       /**
+        * デフォルトのポート。「-1」<br>
+        * -1はプロトコルに応じた適切なポートを設定する特別な値。
+        */
+       public static final int DEFAULT_PORT = -1;
+
+       private static final String INBOX_NAME = "INBOX";
+
+       private String host = DEFAULT_HOST;
+
+       private String protocol = DEFAULT_PROTOCOL;
+
+       private int port = DEFAULT_PORT;
+
+       private String username;
+
+       private String password;
+
+       private boolean javaMailLogEnabled;
+
+       private Store store;
+
+       private Folder currentFolder;
+
+       /** MailConver の実装インスタンス。 */
+       private MailConverter mailConverter = new MailConverterImpl();
+
+       /**
+        * コンストラクタ。
+        */
+       public FetchMailProImpl() {
+               System.setProperty("mail.mime.multipart.ignoremissingendboundary", "true");
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#connect()
+        */
+       public synchronized void connect() throws MailException {
+               if (isConnected()) {
+                       log.warn("既にサーバ[" + host + "]に接続されています。再接続するには先に接続を切断する必要があります。");
+                       return;
+               }
+
+               log.debug(protocol.toUpperCase() + "サーバ[" + host + "]に接続します。");
+               Session session = Session.getInstance(createProperties(), null);
+               if (javaMailLogEnabled) {
+                       session.setDebug(true);
+               }
+               try {
+                       store = session.getStore(protocol);
+                       store.connect(host, port, username, password);
+               } catch (NoSuchProviderException e) {
+                       log.error("指定されたプロトコル[" + protocol + "]はサポートされていません。", e);
+                       throw new MailException("指定されたプロトコル[" + protocol + "]はサポートされていません。", e);
+               } catch (AuthenticationFailedException e) {
+                       log.error(protocol.toUpperCase() + "サーバ[" + host + "]への接続認証に失敗しました。", e);
+                       throw new MailAuthenticationException(protocol.toUpperCase() + "サーバ[" + host
+                                       + "]への接続認証に失敗しました。", e);
+               } catch (MessagingException e) {
+                       log.error(protocol.toUpperCase() + "サーバ[" + host + "]への接続に失敗しました。", e);
+                       throw new MailException(protocol.toUpperCase() + "サーバ[" + host + "]への接続に失敗しました。", e);
+               }
+               log.info(protocol.toUpperCase() + "サーバ[" + host + "]に接続しました。");
+
+               changeFolder(INBOX_NAME);
+       }
+
+       /**
+        * Sessionに渡すPropertiesインスタンスを返します。
+        * APOP認証を行う場合に、"mail.pop3.apop.enable"をセットします。
+        * 
+        * @return Sessionに渡すPropertiesインスタンス
+        */
+       private Properties createProperties() {
+               Properties prop = new Properties();
+               if ("apop".equalsIgnoreCase(protocol)) {
+                       prop.put("mail.pop3.apop.enable", "true");
+               }
+               return prop;
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#disconnect()
+        */
+       public synchronized void disconnect() throws MailException {
+               try {
+                       closeCurrentFolderIfOpen();
+               } finally {
+                       if (isConnected()) {
+                               log.debug(protocol.toUpperCase() + "サーバ[" + host + "]との接続を切断します。");
+                               try {
+                                       store.close();
+                                       store = null;
+                               } catch (MessagingException e) {
+                                       throw new MailException("サーバ[" + host + "]との接続切断に失敗しました。", e);
+                               }
+                       }
+               }
+               log.info(protocol.toUpperCase() + "サーバ[" + host + "]との接続を切断しました。");
+       }
+
+       /**
+        * 現在のメッセージフォルダをクローズします。
+        * 
+        * @throws MailException メッセージフォルダのクローズに失敗した場合
+        */
+       private void closeCurrentFolderIfOpen() throws MailException {
+               if (currentFolder != null && currentFolder.isOpen()) {
+                       log.debug("メッセージフォルダ[" + currentFolder.getName() + "]をクローズします。");
+                       try {
+                               currentFolder.close(true);
+                       } catch (MessagingException e) {
+                               log.error("メッセージフォルダ[" + currentFolder.getName() + "]のクローズに失敗しました。", e);
+                               throw new MailException("メッセージフォルダ[" + currentFolder.getName() + "]のクローズに失敗しました。",
+                                               e);
+                       }
+                       log.debug("メッセージフォルダ[" + currentFolder.getName() + "]をクローズしました。");
+                       currentFolder = null;
+               }
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#changeFolder(java.lang.String)
+        */
+       public synchronized void changeFolder(String folderName) throws MailException {
+               if (!isConnected()) {
+                       log.warn("メールサーバに接続されていません。");
+                       return;
+               }
+
+               closeCurrentFolderIfOpen();
+               log.debug("メッセージフォルダ[" + folderName + "]をオープンします。");
+               try {
+                       currentFolder = store.getFolder(folderName);
+                       currentFolder.open(Folder.READ_WRITE);
+               } catch (MessagingException e) {
+                       log.error("メッセージフォルダ[" + folderName + "]のオープンに失敗しました。", e);
+                       throw new MailException("メッセージフォルダ[" + folderName + "]のオープンに失敗しました。", e);
+               }
+               log.debug("メッセージフォルダ[" + folderName + "]をオープンしました。");
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#getMailCount()
+        */
+       public int getMailCount() throws MailException {
+               checkIfCurrentFolderIsOpen();
+               try {
+                       return currentFolder.getMessageCount();
+               } catch (MessagingException e) {
+                       throw new MailFetchException("メール数の取得に失敗しました。", e);
+               }
+       }
+
+       /**
+        * メールサーバに接続されていて、フォルダが操作できる状態かどうか調べます。
+        * フォルダが操作できる状態にない場合、NotConnectedExceptionをスローします。
+        * 
+        * @throws NotConnectedException
+        */
+       private void checkIfCurrentFolderIsOpen() throws NotConnectedException {
+               if (currentFolder == null || !currentFolder.isOpen()) {
+                       throw new NotConnectedException(protocol.toUpperCase() + "サーバ[" + host + "]に接続されていません。");
+               }
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#getMail(int)
+        */
+       public ReceivedMail getMail(int num) throws MailException {
+               return getMail(num, false);
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#getMail(int, boolean)
+        */
+       public ReceivedMail getMail(int num, boolean delete) throws MailException {
+               MimeMessage mimeMessage = getMessage(num);
+               try {
+                       mimeMessage.setFlag(Flags.Flag.DELETED, delete);
+                       log.debug(num + "番目のメッセージにDELETEDフラグをセットしました。");
+               } catch (MessagingException e) {
+                       throw new MailException("DELETEDフラグのセットに失敗しました。", e);
+               }
+               return mailConverter.convertIntoMail(mimeMessage);
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#getMails(boolean)
+        */
+       public ReceivedMail[] getMails(boolean delete) throws MailException {
+               MimeMessage[] mimeMessages = getMessages(delete);
+               return mailConverter.convertIntoMails(mimeMessages);
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#getMessage(int)
+        */
+       public synchronized MimeMessage getMessage(int num) throws MailException {
+               checkIfCurrentFolderIsOpen();
+               try {
+                       return (MimeMessage)currentFolder.getMessage(num);
+               } catch (MessagingException e) {
+                       log.error("メッセージの取得に失敗しました。", e);
+                       throw new MailFetchException("メッセージの取得に失敗しました。", e);
+               }
+       }
+
+       public synchronized MimeMessage[] getMessages(boolean delete) throws MailException {
+               checkIfCurrentFolderIsOpen();
+               try {
+                       Message[] messages = currentFolder.getMessages();
+                       if (log.isInfoEnabled()) {
+                               if (messages.length > 0) {
+                                       log.info(messages.length + "通のメールを受信します。");
+                               } else {
+                                       log.info("受信するメールはありません。");
+                               }
+                       }
+                       // SEENフラグを立てる
+                       currentFolder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
+                       // DELETEDフラグを立てる
+                       if (delete) {
+                               currentFolder.setFlags(messages, new Flags(Flags.Flag.DELETED), true);
+                       }
+                       MimeMessage[] mimeMessages = new MimeMessage[messages.length];
+                       for (int i = 0; i < messages.length; i++) {
+                               mimeMessages[i] = (MimeMessage)messages[i];
+                       }
+                       return mimeMessages;
+               } catch (MessagingException e) {
+                       log.error("メッセージの取得に失敗しました。", e);
+                       throw new MailFetchException("メッセージの取得に失敗しました。", e);
+               }
+       }
+
+       /**
+        * @see com.ozacc.mail.fetch.FetchMailPro#isConnected()
+        */
+       public boolean isConnected() {
+               return store != null && store.isConnected();
+       }
+
+       /**
+        *  メールサーバのホスト名、またはIPアドレスを返します。
+        * 
+        * @return  メールサーバのホスト名、またはIPアドレス
+        */
+       public String getHost() {
+               return host;
+       }
+
+       /**
+        * メールサーバのホスト名、またはIPアドレスをセットします。
+        * デフォルトは localhost です。
+        * 
+        * @param host メールサーバのホスト名、またはIPアドレス
+        */
+       public void setHost(String host) {
+               this.host = host;
+       }
+
+       /**
+        * メールサーバの認証パスワードを返します。
+        * 
+        * @return メールサーバの認証パスワード
+        */
+       public String getPassword() {
+               return password;
+       }
+
+       /**
+        * メールサーバの認証パスワード名をセットします。
+        * 
+        * @param password メールサーバの認証パスワード
+        */
+       public void setPassword(String password) {
+               this.password = password;
+       }
+
+       /**
+        * メール受信に使用するプロトコロルをセットします。
+        * 
+        * @return プロトコル
+        */
+       public String getProtocol() {
+               return protocol;
+       }
+
+       /**
+        * メール受信に使用するプロトコロルをセットします。
+        * 現在サポートされているプロトコルは、「pop3」と「imap」の二つです。
+        * デフォルトは「pop3」です。
+        * <p>
+        * POP3サーバへの認証をAPOPで行いたい場合は、プロトコル名ではありませんが、
+        * 「apop」を指定してください。APOP認証を使用するには、JavaMail 1.3.2以降が必要です。
+        * 
+        * @param protocol プロトコル
+        */
+       public void setProtocol(String protocol) {
+               this.protocol = protocol;
+       }
+
+       /**
+        * @return 認証ユーザ名
+        */
+       public String getUsername() {
+               return username;
+       }
+
+       /**
+        * メールサーバの認証ユーザ名をセットします。
+        * 
+        * @param username 認証ユーザ名
+        */
+       public void setUsername(String username) {
+               this.username = username;
+       }
+
+       /**
+        * @return ポート番号
+        */
+       public int getPort() {
+               return port;
+       }
+
+       /**
+        * メール受信に使用するポート番号をセットします。
+        * プロトコルに応じたポート番号が自動的に使用されますので、通常ここでポート番号をセットする必要はありません。
+        * 
+        * @param port ポート番号
+        */
+       public void setPort(int port) {
+               this.port = port;
+       }
+
+       /**
+        * JavaMailのデバッグが有効かどうか判定します。
+        * 
+        * @return JavaMailのデバッグが有効な場合 ture
+        */
+       public boolean isJavaMailLogEnabled() {
+               return javaMailLogEnabled;
+       }
+
+       /**
+        * JavaMailのデバッグを有効にするかどうか指定します。
+        * 有効にすると、<code>System.out</code>のデバッグメッセージが出力されます。<br>
+        * デフォルトは無効になっています。
+        * 
+        * @see javax.mail.session#setDebug(boolean)
+        * @param javaMailLogEnabled The javaMailLogEnabled to set.
+        */
+       public void setJavaMailLogEnabled(boolean javaMailLogEnabled) {
+               this.javaMailLogEnabled = javaMailLogEnabled;
+       }
+
+       /**
+        * MailConveterインターフェースの実装インスタンスをセットします。
+        * デフォルトでは、MailConverterImplが使用されます。
+        * 
+        * @see com.ozacc.mail.fetch.MailConveter
+        * @see com.ozacc.mail.fetch.impl.MailConveterImpl
+        * @param mailConverter MailConveterインターフェースの実装インスタンス
+        */
+       public void setMailConverter(MailConverter mailConverter) {
+               this.mailConverter = mailConverter;
+       }
 }
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index cb7e571..0ac7385
-package com.ozacc.mail.fetch.impl;\r
-\r
-import java.io.BufferedOutputStream;\r
-import java.io.File;\r
-import java.io.FileNotFoundException;\r
-import java.io.FileOutputStream;\r
-import java.io.FilenameFilter;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.io.OutputStream;\r
-import java.util.Date;\r
-import java.util.Enumeration;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
-\r
-import javax.mail.Address;\r
-import javax.mail.Header;\r
-import javax.mail.Message;\r
-import javax.mail.MessagingException;\r
-import javax.mail.internet.AddressException;\r
-import javax.mail.internet.InternetAddress;\r
-import javax.mail.internet.MimeMessage;\r
-\r
-import org.apache.commons.logging.Log;\r
-import org.apache.commons.logging.LogFactory;\r
-\r
-import com.ozacc.mail.fetch.MailConverter;\r
-import com.ozacc.mail.fetch.ReceivedMail;\r
-import com.ozacc.mail.fetch.ReceivedMail.ReceivedHeader;\r
-import com.ozacc.mail.fetch.impl.sk_jp.AttachmentsExtractor;\r
-import com.ozacc.mail.fetch.impl.sk_jp.HtmlPartExtractor;\r
-import com.ozacc.mail.fetch.impl.sk_jp.MailUtility;\r
-import com.ozacc.mail.fetch.impl.sk_jp.MultipartUtility;\r
-\r
-/**\r
- * MimeMessageからMailを生成するクラス。\r
- * <p>\r
- * 変換時に生じたチェック例外は、このクラス内でキャッチされ無視されます。\r
- * 例外が生じた項目(差出人や宛先など)に該当するMailインスタンスのプロパティには何もセットされません。\r
- * \r
- * @since 1.2\r
- * @author Tomohiro Otsuka\r
- * @author gaku\r
- * @version $Id: MailConverterImpl.java,v 1.1.2.3 2006/03/03 06:01:18 otsuka Exp $\r
- */\r
-public class MailConverterImpl implements MailConverter {\r
-\r
-       private static final String ATTACHMENT_DIR_PREFIX = "OML_";\r
-\r
-       private static final String JAVA_IO_TMPDIR = "java.io.tmpdir";\r
-\r
-       private static Log log = LogFactory.getLog(MailConverterImpl.class);\r
-\r
-       private static Pattern receivedHeaderPattern = Pattern.compile("^from (.+?) .*by (.+?) .*$");\r
-\r
-       /**\r
-        * 保存された添付ファイルの生存時間。デフォルトは12時間。\r
-        */\r
-       private long attachmentLifetime = 3600 * 1000 * 12;\r
-\r
-       /**\r
-        * コンストラクタ。\r
-        */\r
-       public MailConverterImpl() {}\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.MailConverter#convertIntoMails(javax.mail.internet.MimeMessage[])\r
-        */\r
-       public ReceivedMail[] convertIntoMails(MimeMessage[] messages) {\r
-               log.debug("計" + messages.length + "通のMimeMessageをMailに変換します。");\r
-               ReceivedMail[] results = new ReceivedMail[messages.length];\r
-               for (int i = 0; i < messages.length; i++) {\r
-                       log.debug((i + 1) + "通目のMimeMessageをMailに変換します。");\r
-                       results[i] = convertIntoMail(messages[i]);\r
-                       log.debug((i + 1) + "通目のMimeMessageをMailに変換しました。");\r
-                       log.debug(results[i].toString());\r
-               }\r
-               log.debug("計" + messages.length + "通のMimeMessageをMailに変換しました。");\r
-               return results;\r
-       }\r
-\r
-       /**\r
-        * @param mm\r
-        * @param mail \r
-        */\r
-       private void setReceivedHeaders(MimeMessage mm, ReceivedMail mail) {\r
-               String[] headerValues = null;\r
-               try {\r
-                       headerValues = mm.getHeader("Received");\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-               if (headerValues != null) {\r
-                       for (int i = 0; i < headerValues.length; i++) {\r
-                               String received = headerValues[i];\r
-                               // from で始まるものだけを抽出し、改行を削除\r
-                               if (received.startsWith("from")) {\r
-                                       received = received.replaceAll("\n", "").replaceAll("\\s+", " ");\r
-                                       log.debug("Received='" + received + "'");\r
-\r
-                                       Matcher m = receivedHeaderPattern.matcher(received);\r
-                                       if (m.matches()) {\r
-                                               String from = m.group(1);\r
-                                               String by = m.group(2);\r
-                                               log.debug("Sent from '" + from + "', Received by '" + by + "'");\r
-                                               ReceivedHeader rh = new ReceivedHeader(from, by);\r
-                                               mail.addReceviedHeader(rh);\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-               }\r
-       }\r
-\r
-       /**\r
-        * 指定されたMimeMessageに添付されているファイルを全て抽出し、\r
-        * システムプロパティにセットされた一時ファイルディレクトリ内に保存した後、\r
-        * そのファイルを指定されたReceivedMailにセットします。\r
-        * <p>\r
-        * 保存された添付ファイルはJVM終了時に削除されます。\r
-        * \r
-        * @param mm\r
-        * @param mail \r
-        */\r
-       private void setAttachmentFiles(MimeMessage mm, ReceivedMail mail) {\r
-               try {\r
-                       cleanTempDir();\r
-\r
-                       AttachmentsExtractor ae = new AttachmentsExtractor(\r
-                                       AttachmentsExtractor.MODE_IGNORE_MESSAGE);\r
-                       MultipartUtility.process(mm, ae);\r
-                       for (int i = 0, num = ae.getCount(); i < num; i++) {\r
-                               String fileName = ae.getFileName(i);\r
-                               if (fileName == null || "".equals(fileName)) {\r
-                                       fileName = "attachment" + (i + 1) + ".tmp";\r
-                               }\r
-                               String path = getTempDirPath() + File.separator + ATTACHMENT_DIR_PREFIX\r
-                                               + System.currentTimeMillis() + File.separator + fileName;\r
-                               log.debug((i + 1) + "個目の添付ファイルを保存します。[" + path + "]");\r
-                               File f = new File(path);\r
-                               f.getParentFile().mkdirs();\r
-                               InputStream is = ae.getInputStream(i);\r
-                               try {\r
-                                       writeTo(f, is);\r
-                               } finally {\r
-                                       if (is != null) {\r
-                                               is.close();\r
-                                       }\r
-                               }\r
-\r
-                               f.getParentFile().deleteOnExit();\r
-                               f.deleteOnExit();\r
-\r
-                               mail.addFile(f, fileName);\r
-                               log.debug((i + 1) + "個目の添付ファイルを保存しました。[" + path + "]");\r
-                       }\r
-               } catch (IOException e) {\r
-                       log.error("添付ファイルの取得に失敗しました。", e);\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * 一時ディレクトリ内に保存された添付ファイルの内、生存時間を越えているものを削除します。\r
-        */\r
-       private void cleanTempDir() {\r
-               File tempDir = new File(getTempDirPath());\r
-               File[] omlDirs = tempDir.listFiles(new FilenameFilter() {\r
-\r
-                       public boolean accept(File dir, String name) {\r
-                               return name.startsWith(ATTACHMENT_DIR_PREFIX);\r
-                       }\r
-               });\r
-               log.debug("現在" + omlDirs.length + "個の添付ファイル用ディレクトリ[" + tempDir.getAbsolutePath()\r
-                               + "]が一時ディレクトリに存在します。");\r
-               long now = System.currentTimeMillis();\r
-               for (int i = 0; i < omlDirs.length; i++) {\r
-                       File dir = omlDirs[i];\r
-                       log.debug(dir.lastModified() + "");\r
-                       if (now - dir.lastModified() >= attachmentLifetime) {\r
-                               deleteDir(dir);\r
-                       }\r
-               }\r
-       }\r
-\r
-       /**\r
-        * 一時ディレクトリのパスを返します。\r
-        * \r
-        * @return 一時ディレクトリのパス\r
-        */\r
-       private String getTempDirPath() {\r
-               return System.getProperty(JAVA_IO_TMPDIR);\r
-       }\r
-\r
-       /**\r
-        * 指定されたディレクトリを中身のファイルを含めて削除します。\r
-        * \r
-        * @param dir 削除するディレクトリ\r
-        */\r
-       private void deleteDir(File dir) {\r
-               File[] files = dir.listFiles();\r
-               for (int i = 0; i < files.length; i++) {\r
-                       File f = files[i];\r
-                       f.delete();\r
-               }\r
-               dir.delete();\r
-       }\r
-\r
-       /**\r
-        * 指定されたInputStreamデータを指定されたファイルに保存します。\r
-        * \r
-        * @param destFile 保存するファイル\r
-        * @param is ソースとなるInputStream\r
-        * @throws FileNotFoundException\r
-        * @throws IOException \r
-        */\r
-       private void writeTo(File destFile, InputStream is) throws FileNotFoundException, IOException {\r
-               BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile),\r
-                               1024 * 50);\r
-               try {\r
-                       copy(is, bos);\r
-               } finally {\r
-                       if (bos != null) {\r
-                               bos.close();\r
-                       }\r
-               }\r
-       }\r
-\r
-       private static void copy(InputStream in, OutputStream out) throws IOException {\r
-               byte[] buffer = new byte[1024 * 4];\r
-               int n = 0;\r
-               while (-1 != (n = in.read(buffer))) {\r
-                       out.write(buffer, 0, n);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * 指定されたMimeMessageからX-Header、References、In-Reply-Toヘッダを解析し、\r
-        * 指定されたReceivedMailにセットします。\r
-        * \r
-        * @param mm\r
-        * @param mail\r
-        */\r
-       private void setXHeaders(MimeMessage mm, ReceivedMail mail) {\r
-               log.debug("X-HeaderをMailにセットします。");\r
-               Enumeration headerEnum = null;\r
-               try {\r
-                       headerEnum = mm.getAllHeaders();\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-               while (headerEnum != null && headerEnum.hasMoreElements()) {\r
-                       Header header = (Header)headerEnum.nextElement();\r
-                       if (header.getName().startsWith("X-")\r
-                                       || "References".equalsIgnoreCase(header.getName())\r
-                                       || "In-Reply-To".equalsIgnoreCase(header.getName())) {\r
-                               mail.addHeader(header.getName(), header.getValue());\r
-                               log.debug(header.getName() + "をMailにセットしました。[" + header.getName() + "='"\r
-                                               + header.getValue() + "']");\r
-                       }\r
-               }\r
-       }\r
-\r
-       private void setReplyToAddress(MimeMessage mm, ReceivedMail mail) {\r
-               log.debug("Reply-ToアドレスをMailにセットします。");\r
-               Address[] addresses = null;\r
-               try {\r
-                       addresses = mm.getReplyTo();\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-               if (addresses != null) {\r
-                       log.debug(addresses.length + "つのReply-Toアドレスが見つかりました。最初のアドレスのみ取得されます。");\r
-                       for (int j = 0; j < addresses.length; j++) {\r
-                               Address address = addresses[j];\r
-                               mail.setReplyTo((InternetAddress)address);\r
-                               break;\r
-                       }\r
-               } else {\r
-                       log.debug("Reply-Toアドレスは見つかりませんでした。");\r
-               }\r
-       }\r
-\r
-       /**\r
-        * メールの容量(byte)をMimeMessageから取得してReceivedMailにセットします。\r
-        * 取得に失敗した場合は -1 をセットします。\r
-        * \r
-        * @param mm\r
-        * @param mail \r
-        */\r
-       private void setSize(MimeMessage mm, ReceivedMail mail) {\r
-               try {\r
-                       mail.setSize(mm.getSize());\r
-               } catch (MessagingException e) {\r
-                       mail.setSize(-1);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * @param mm\r
-        * @param mail\r
-        * @throws MessagingException \r
-        */\r
-       private void setHtmlText(MimeMessage mm, ReceivedMail mail) {\r
-               try {\r
-                       HtmlPartExtractor hpe = new HtmlPartExtractor();\r
-                       MultipartUtility.process(mm, hpe);\r
-                       String htmlText = hpe.getHtml();\r
-                       mail.setHtmlText(htmlText);\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-       }\r
-\r
-       private void setText(MimeMessage mm, ReceivedMail mail) {\r
-               try {\r
-                       String text = MultipartUtility.getPlainText(mm);\r
-                       mail.setText(text);\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-       }\r
-\r
-       private void setMessageId(MimeMessage mm, ReceivedMail mail) {\r
-               try {\r
-                       String messageId = mm.getMessageID();\r
-                       mail.setMessageId(messageId);\r
-                       log.debug("Message-IDをMailにセットしました。[Message-ID='" + messageId + "']");\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * 指定されたMimeMessageから件名を取得し、ReceivedMailにセットします。\r
-        * sk_jpのMailUtility.decodeText()メソッドを用いて、件名の文字化けを回避します。\r
-        * \r
-        * @param mm\r
-        * @param mail\r
-        */\r
-       private void setSubject(MimeMessage mm, ReceivedMail mail) {\r
-               try {\r
-                       String subject = MailUtility.decodeText(mm.getSubject());\r
-                       mail.setSubject(subject);\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-       }\r
-\r
-       private void setDate(MimeMessage mm, ReceivedMail mail) {\r
-               try {\r
-                       Date d = mm.getSentDate();\r
-                       mail.setDate(d);\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Return-Pathアドレスは必ずしもセットされてはいません。\r
-        * 特にspam系のメールでは不正なフォーマットのメールアドレスが\r
-        * セットされている場合もあるので要注意。\r
-        * \r
-        * @param mm\r
-        * @param mail\r
-        */\r
-       private void setReturnPath(MimeMessage mm, ReceivedMail mail) {\r
-               log.debug("Return-Pathアドレスを検出します。");\r
-               String[] returnPath = null;\r
-               try {\r
-                       returnPath = mm.getHeader("Return-Path");\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-               if (returnPath != null && returnPath.length > 0) {\r
-                       String email = returnPath[0].substring(1, returnPath[0].length() - 1);\r
-                       if (email.length() > 0) {\r
-                               try {\r
-                                       mail.setReturnPath(email);\r
-                                       log.debug("Return-PathアドレスをMailにセットしました。[Return-Path='" + email + "']");\r
-                               } catch (IllegalArgumentException e) {\r
-                                       log.warn("Return-Pathアドレスが不正なメールアドレスフォーマットです。[Return-Path='" + email + "']");\r
-                               }\r
-                       } else {\r
-                               log.debug("Return-Pathアドレスは見つかりませんでした。");\r
-                       }\r
-               } else {\r
-                       log.debug("Return-Pathアドレスは見つかりませんでした。");\r
-               }\r
-       }\r
-\r
-       private void setFromAddress(MimeMessage mm, ReceivedMail mail) {\r
-               log.debug("Fromアドレスを検出します。");\r
-               Address[] addresses = null;\r
-               try {\r
-                       addresses = mm.getFrom();\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-               if (addresses != null) {\r
-                       log.debug(addresses.length + "つのFromアドレスが見つかりました。");\r
-                       for (int j = 0; j < addresses.length; j++) {\r
-                               InternetAddress address = (InternetAddress)addresses[j];\r
-                               mail.setFrom(address);\r
-                               log.debug("FromアドレスをMailにセットしました。[From='" + address.toUnicodeString() + "']");\r
-                       }\r
-               } else {\r
-                       log.debug("Fromアドレスは見つかりませんでした。");\r
-               }\r
-       }\r
-\r
-       private void setRecipientAddresses(MimeMessage mm, ReceivedMail mail) {\r
-               /*\r
-                * TOアドレスのパース\r
-                */\r
-               log.debug("Toアドレスを検出します。");\r
-               Address[] toAddresses = null;\r
-               try {\r
-                       toAddresses = mm.getRecipients(Message.RecipientType.TO);\r
-               } catch (AddressException e) {\r
-                       log.warn("不正なメールアドレスが検出されました。[" + e.getRef() + "]");\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-               if (toAddresses != null) {\r
-                       log.debug(toAddresses.length + "つのToアドレスが見つかりました。");\r
-                       for (int j = 0; j < toAddresses.length; j++) {\r
-                               InternetAddress address = (InternetAddress)toAddresses[j];\r
-                               mail.addTo(address);\r
-                               log.debug("ToアドレスをMailにセットしました。[To='" + address.toUnicodeString() + "']");\r
-                       }\r
-               } else {\r
-                       log.debug("Toアドレスは見つかりませんでした。");\r
-               }\r
-\r
-               /*\r
-                * CCアドレスのパース\r
-                */\r
-               log.debug("Ccアドレスを検出します。");\r
-               Address[] ccAddresses = null;\r
-               try {\r
-                       ccAddresses = mm.getRecipients(Message.RecipientType.CC);\r
-               } catch (AddressException e) {\r
-                       log.warn("不正なメールアドレスが検出されました。[" + e.getRef() + "]");\r
-               } catch (MessagingException e) {\r
-                       // ignore\r
-                       log.warn(e.getMessage());\r
-               }\r
-               if (ccAddresses != null) {\r
-                       log.debug(ccAddresses.length + "つのCcアドレスが見つかりました。");\r
-                       for (int j = 0; j < ccAddresses.length; j++) {\r
-                               InternetAddress address = (InternetAddress)ccAddresses[j];\r
-                               mail.addCc(address);\r
-                               log.debug("CcアドレスをMailにセットしました。[Cc='" + address.toUnicodeString() + "']");\r
-                       }\r
-               } else {\r
-                       log.debug("Ccアドレスは見つかりませんでした。");\r
-               }\r
-       }\r
-\r
-       /**\r
-        * @see com.ozacc.mail.fetch.MailConverter#convertIntoMail(javax.mail.internet.MimeMessage)\r
-        */\r
-       public ReceivedMail convertIntoMail(MimeMessage mm) {\r
-               ReceivedMail mail = createReceivedMail();\r
-               setReturnPath(mm, mail);\r
-               setReceivedHeaders(mm, mail);\r
-               setDate(mm, mail);\r
-               setFromAddress(mm, mail);\r
-               setRecipientAddresses(mm, mail);\r
-               setMessageId(mm, mail);\r
-               setReplyToAddress(mm, mail);\r
-               setSubject(mm, mail);\r
-               setXHeaders(mm, mail);\r
-               setText(mm, mail);\r
-               setHtmlText(mm, mail);\r
-               setAttachmentFiles(mm, mail);\r
-               setSize(mm, mail);\r
-               mail.setMessage(mm);\r
-               return mail;\r
-       }\r
-\r
-       protected ReceivedMail createReceivedMail() {\r
-               return new ReceivedMail();\r
-       }\r
-\r
+package com.ozacc.mail.fetch.impl;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.mail.Address;
+import javax.mail.Header;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.ozacc.mail.fetch.MailConverter;
+import com.ozacc.mail.fetch.ReceivedMail;
+import com.ozacc.mail.fetch.ReceivedMail.ReceivedHeader;
+import com.ozacc.mail.fetch.impl.sk_jp.AttachmentsExtractor;
+import com.ozacc.mail.fetch.impl.sk_jp.HtmlPartExtractor;
+import com.ozacc.mail.fetch.impl.sk_jp.MailUtility;
+import com.ozacc.mail.fetch.impl.sk_jp.MultipartUtility;
+
+/**
+ * MimeMessageからMailを生成するクラス。
+ * <p>
+ * 変換時に生じたチェック例外は、このクラス内でキャッチされ無視されます。
+ * 例外が生じた項目(差出人や宛先など)に該当するMailインスタンスのプロパティには何もセットされません。
+ * 
+ * @since 1.2
+ * @author Tomohiro Otsuka
+ * @author gaku
+ * @version $Id: MailConverterImpl.java,v 1.1.2.3 2006/03/03 06:01:18 otsuka Exp $
+ */
+public class MailConverterImpl implements MailConverter {
+
+       private static final String ATTACHMENT_DIR_PREFIX = "OML_";
+
+       private static final String JAVA_IO_TMPDIR = "java.io.tmpdir";
+
+       private static Log log = LogFactory.getLog(MailConverterImpl.class);
+
+       private static Pattern receivedHeaderPattern = Pattern.compile("^from (.+?) .*by (.+?) .*$");
+
+       /**
+        * 保存された添付ファイルの生存時間。デフォルトは12時間。
+        */
+       private long attachmentLifetime = 3600 * 1000 * 12;
+
+       /**
+        * コンストラクタ。
+        */
+       public MailConverterImpl() {}
+
+       /**
+        * @see com.ozacc.mail.fetch.MailConverter#convertIntoMails(javax.mail.internet.MimeMessage[])
+        */
+       public ReceivedMail[] convertIntoMails(MimeMessage[] messages) {
+               log.debug("計" + messages.length + "通のMimeMessageをMailに変換します。");
+               ReceivedMail[] results = new ReceivedMail[messages.length];
+               for (int i = 0; i < messages.length; i++) {
+                       log.debug((i + 1) + "通目のMime