+++ /dev/null
-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
-}
\ No newline at end of file