POP3Store.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:6k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2.  * POP3Store.java
  3.  * Copyright (C) 1999 dog <dog@dog.net.uk>
  4.  * 
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  * 
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  * 
  19.  * You may retrieve the latest version of this library from
  20.  * http://www.dog.net.uk/knife/
  21.  */
  22. package dog.mail.pop3;
  23. import java.io.*;
  24. import java.net.*;
  25. import javax.mail.*;
  26. import javax.mail.event.*;
  27. import dog.mail.util.*;
  28. /**
  29.  * The storage class implementing the POP3 mail protocol.
  30.  *
  31.  * @author dog@dog.net.uk
  32.  * @version 1.1
  33.  */
  34. public class POP3Store extends Store {
  35. /**
  36.  * The default POP3 port.
  37.  */
  38. public static final int DEFAULT_PORT = 110;
  39. static int fetchsize = 1024;
  40. Socket socket;
  41. CRLFInputStream in;
  42. CRLFOutputStream out;
  43. String hostname; // the server hostname
  44. static int OK = 0, ERR = -1; // response codes
  45. String response; // last response
  46. POP3Folder root; // the root folder
  47. /**
  48.  * Constructor.
  49.  */
  50. public POP3Store(Session session, URLName urlname) {
  51. super(session, urlname);
  52. String ccs = session.getProperty("mail.pop3.fetchsize");
  53. if (ccs!=null) try { fetchsize = Math.max(Integer.parseInt(ccs), 1024); } catch (NumberFormatException e) {}
  54. }
  55. /**
  56.  * Connects to the POP3 server and authenticates with the specified parameters.
  57.  */
  58. protected boolean protocolConnect(String host, int port, String username, String password) throws MessagingException {
  59.         if (port<0) port = DEFAULT_PORT;
  60. if (host==null || username==null || password==null)
  61. return false;
  62. if (socket!=null)
  63. return true;
  64. synchronized (this) {
  65. try {
  66. hostname = host;
  67. socket = new Socket(host, port);
  68. in = new CRLFInputStream(socket.getInputStream());
  69. out = new CRLFOutputStream(socket.getOutputStream());
  70. if (getResponse()!=OK)
  71. throw new MessagingException("Connect failed. Server responded: "+response);
  72. int index = response.indexOf(' ');
  73. if (index>-1) hostname = response.substring(0, index);
  74. send("USER "+username);
  75. if (getResponse()!=OK)
  76. throw new MessagingException("Connect failed. Server responded: "+response);
  77. send("PASS "+password);
  78. if (getResponse()!=OK)
  79. throw new MessagingException("Connect failed. Server responded: "+response);
  80. return true;
  81. } catch(UnknownHostException e) {
  82. throw new MessagingException("Connect failed", e);
  83. } catch(IOException e) {
  84. throw new MessagingException("Connect failed", e);
  85. }
  86. }
  87. }
  88. /**
  89.  * Closes the connection.
  90.  */
  91. public synchronized void close() throws MessagingException {
  92. if (socket!=null) {
  93. synchronized (this) {
  94. try {
  95. send("QUIT");
  96. if (getResponse()!=OK)
  97. throw new MessagingException("Close failed: "+response);
  98. socket.close();
  99. socket = null;
  100. } catch (IOException e) {
  101. // socket.close() always seems to throw an exception!
  102. //throw new MessagingException("Close failed", e);
  103. }
  104. }
  105. }
  106. super.close();
  107. }
  108. private int getResponse() throws IOException {
  109. String okstr = "+OK", errstr = "-ERR";
  110. response = in.readLine();
  111. if (response.indexOf(okstr)==0) {
  112. response = response.substring(okstr.length()).trim();
  113. return OK;
  114. } else if (response.indexOf(errstr)==0)
  115. response = response.substring(errstr.length()).trim();
  116. return ERR;
  117. }
  118. private void send(String command) throws IOException {
  119. out.write(command.getBytes());
  120. out.writeln();
  121. out.flush();
  122. }
  123. String getHostName() { return hostname; }
  124. synchronized int getMessageCount() throws MessagingException {
  125. try {
  126. send("STAT");
  127. if (getResponse()!=OK)
  128. throw new MessagingException("Status failed. Server responded: "+response);
  129. try {
  130. return Integer.parseInt(response.substring(0, response.indexOf(' ')));
  131. } catch(NumberFormatException e) {
  132. throw new MessagingException("Status failed. Server responded: "+response);
  133. }
  134. } catch (IOException e) {
  135. throw new MessagingException("Status failed.", e);
  136. }
  137. }
  138. synchronized Message getMessage(POP3Folder folder, int msgnum) throws MessagingException {
  139. //int length = -1;
  140. try {
  141. send("RETR "+msgnum);
  142. if (getResponse()!=OK)
  143. throw new MessagingException("Retrieve failed. Server responded: "+response);
  144. //length = Integer.parseInt(response.substring(0, response.indexOf(' '))); // sod all use, it's always wrong
  145.             return new POP3Message(folder, new MessageInputStream(in), msgnum);
  146. } catch (IOException e) {
  147. throw new MessagingException("Retrieve failed.", e);
  148. } catch (NumberFormatException e) {
  149. throw new MessagingException("Retrieve failed.", e);
  150. }
  151. }
  152. synchronized void delete(int msgnum) throws MessagingException {
  153. try {
  154. send("DELE "+msgnum);
  155. if (getResponse()!=OK)
  156. throw new MessagingException("Delete failed. Server responded: "+response);
  157. } catch (IOException e) {
  158. throw new MessagingException("Delete failed.", e);
  159. }
  160. }
  161. /**
  162.  * Returns the root folder.
  163.  */
  164. public Folder getDefaultFolder() throws MessagingException {
  165. synchronized (this) {
  166. if (root==null) root = new POP3Folder(this, Folder.HOLDS_FOLDERS);
  167. }
  168. return root;
  169. }
  170. /**
  171.  * Returns the folder with the specified name.
  172.  */
  173. public Folder getFolder(String s) throws MessagingException {
  174.         return getDefaultFolder().getFolder(s);
  175. }
  176. /**
  177.  * Returns the folder whose name is the file part of the specified URLName.
  178.  */
  179. public Folder getFolder(URLName urlname) throws MessagingException {
  180.         return getDefaultFolder().getFolder(urlname.getFile());
  181. }
  182. }