⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pop3client.java

📁 mywork是rcp开发的很好的例子
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/**
 * POP3Client.java
 *
 * Copyright (C) 1998-2000 FreeBeans <freebeans@mub.biglobe.ne.jp>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * Copyright (C) 1998-2000ꆼ FreeBeans <freebeans@mub.biglobe.ne.jp>
 *
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼFree Software Foundation 
 * ꆼꆼꆼꆼꆼGNU ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 * GNU ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 *
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼGNU ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼFree Software Foundation, Inc., 675 Mass Ave,
 * Cambridge, MA 02139, USA ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 */

package jp.gr.java_conf.roadster.net.pop;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.SocketException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.net.ssl.SSLSocketFactory;

/**
 * POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
 * POP3ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 * ꆼꆼꆼꆼꆼꆼꆼjavax.mail.* ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
 * <BR>
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 * <OL>
 * <LI>POP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
 * ꆼꆼꆼꆼꆼ.<BR>
 * <UL><CODE>
 *  POP3Client pc = new POP3Client();<BR>
 *  pc.setHost("pop3.host.ne.jp");<BR>
 *  pc.setUser("user");<BR>
 *  pc.setPassword("password");<BR>
 *  pc.setAuthorizationMode(POP3Client.APOP_AUTHORIZATION);<BR>
 * </CODE></UL>
 * <LI>ꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *   <UL><CODE>
 *    pc.connect();<BR>
 *   </CODE></UL>
 * <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *   <UL><CODE>
 *    int count = pc.getMessageCount();<BR>
 *   </CODE></UL>
 * <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *   <UL><CODE>
 *    InputStream ins = pc.retrieve(i); // i ꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *    while ((c = ins.read()) != -1) {
 *    <UL>
 *       // ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
 *    </UL>
 *    }<BR>
 *    ins.close();<BR>
 *   </CODE></UL>
 * <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
 *   <UL><CODE>
 *    pc.delete(i); // i ꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *   </CODE></UL>
 * <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *   <UL><CODE>
 *    pc.disconnect();<BR>
 *   </CODE></UL>
 * </OL>
 *
 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 * <OL>
 *  <LI>TCP/IPꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ(greeting)ꆼꆼꆼꆼꆼꆼꆼꆼ.
 *  <LI>USERꆼꆼꆼꆼꆼPASSꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *      ꆼꆼꆼꆼAPOPꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
 *  <LI>LIST ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *      +OK ...<BR>
 *      1 203[CRLF]<BR>
 *      2 345[CRLF]<BR>
 *      (ꆼꆼ)<BR>
 *      .[CRLF]<BR>
 *  <LI>ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ512 ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
 *      ꆼꆼꆼꆼRETR ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
 * </OL>
 *
 */
public class POP3Client implements Serializable {
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	static final long serialVersionUID = -3928372169782263062L;
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ( = 512ꆼꆼꆼ).
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private static final int MAX_LINE_LENGTH = 512;

	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private static final String ENCODE = "8859_1";

	/**
	 * ꆼꆼꆼꆼꆼꆼPOPꆼꆼꆼ(=110)
	 */
	protected static final int DEFAULT_POP3_PORT = 110;

	/**
	 * CRꆼꆼꆼ.
	 */
	protected static final byte CR = 0x0d;
	
	/**
	 * LFꆼꆼꆼ.
	 */
	protected static final byte LF = 0x0a;

	/**
	 * USER ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_USER = "USER";
	
	/**
	 * PASS ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_PASS = "PASS";
	
	/**
	 * QUIT ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_QUIT = "QUIT";

	/**
	 * STAT ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_STAT = "STAT";

	/**
	 * LIST ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_LIST = "LIST";
	
	/**
	 * RETR ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_RETR = "RETR";
	
	/**
	 * DELE ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_DELE = "DELE";
	
	/**
	 * NOOP ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_NOOP = "NOOP";
	
	/**
	 * RSET ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_RSET = "RSET";
	
	/**
	 * APOP ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_APOP = "APOP";
	
	/**
	 * TOP ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_TOP = "TOP";
	
	/**
	 * UIDL ꆼꆼꆼꆼ.
	 */
	protected static final String COMMAND_UIDL = "UIDL";

	/**
	 * ꆼꆼꆼꆼ.
	 */
	protected static final String RESPONSE_OK = "+OK";
	
	/**
	 * ꆼꆼꆼꆼꆼ.
	 */
	protected static final String RESPONSE_ERR = "-ERR";
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼ(USER/PASS ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
	 *
	 * @see #setAuthorizationMode(int)
	 */
	public static final int NORMAL_AUTHORIZATION = 1;
	
	/**
	 * APOPꆼꆼꆼꆼꆼ.
	 *
	 * @see #setAuthorizationMode(int)
	 */
	public static final int APOP_AUTHORIZATION = 2;
	
	/**
	 * @serial	POPꆼꆼꆼꆼ. ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private String user;
	
	/**
	 * ꆼꆼꆼꆼꆼ.
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ transient ꆼꆼꆼ.
	 */
	private transient String password;
	
	/**
	 * @serial	POPꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private String host;
	
	/**
	 * @serial	POPꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private int port = -1;
	
	/**
	 * @serial	ꆼꆼꆼꆼꆼ. ꆼꆼꆼꆼꆼꆼ NORMAL_AUTHORIZATION
	 */
	private int authorizationMode = NORMAL_AUTHORIZATION;
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected transient Socket socket;

	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ Stream.
	 */
	protected transient InputStream in;

	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ Stream.
	 */
	protected transient OutputStream out;

	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected transient boolean connected = false;
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private transient byte responseBytes[];
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private transient String status;
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ(greeting).
	 */
	private transient String greeting;
	
	/**
	 * LIST ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected transient String messageList[] = null;
	
	/**
	 * UIDL ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected transient String uidList[] = null;
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected transient POP3MessageInputStream messageInput = null;
	
	/**
	 * @serial ꆼꆼꆼꆼꆼꆼꆼ.
	 */
	private boolean debug;
	
	/**
	 * @serial	ꆼꆼꆼꆼꆼꆼꆼꆼꆼ
	 */
	protected int timeout;
	
	/**
	 * @serial	ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ
	 */
	private String preConnectCommand;
	
	/**
	 * 是否使用ssl
	 */
	private boolean ssl;
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼPOP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	public POP3Client() {
		// ꆼꆼꆼꆼꆼ.
	}

	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ POP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 *
	 * @param	host	ꆼꆼꆼꆼ.
	 * @exception	java.lang.IllegalArgumentException	host ꆼ null ꆼꆼꆼ.
	 */
	public POP3Client(String host) {
		this(host, DEFAULT_POP3_PORT);
	}

	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ POP3Clientꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 *
	 * @param	host	ꆼꆼꆼꆼ.
	 * @param	port	ꆼꆼꆼꆼꆼ.
	 * @exception	java.lang.IllegalArgumentException	host ꆼ null ꆼꆼꆼ.
	 */
	public POP3Client(String host, int port) {
		setHost(host);
		setPort(port);
	}
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼSystem.err ꆼꆼꆼ.
	 *
	 * @param	msg	ꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected void debugOut(String msg) {
		if (debug) {
			StringBuffer buff = new StringBuffer("DEBUG:");
			buff.append(msg);
			System.err.println(buff.toString());
		}
	}
	
	public void setDebug(boolean mode) {
		this.debug = mode;
	}
	
	public boolean getDebug() {
		return debug;
	}
	
	/**
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 * CRLF ꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 *
	 * @return	ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
	 *          ꆼꆼꆼꆼꆼꆼꆼCRLFꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 * @exception java.io.IOException	IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected synchronized String readResponseLine() throws IOException {
		boolean cr = false;
		int i;
		for (i = 0; i < responseBytes.length; ++i) {
			int c = in.read();
			if (c == -1) {
				break;
			}
			responseBytes[i] = (byte) c;
			if (responseBytes[i] == CR) {
				cr = true;
			} else if (responseBytes[i] == LF && cr == true) {
				break;
			} else {
				cr = false;
			}
		}
		if( i== 0)
			return "+OK";
		return new String(responseBytes, 0, i - 1, ENCODE);
	}
	
	/**
	 * ꆼꆼꆼꆼꆼTCP/IPꆼꆼꆼꆼꆼꆼꆼ.
	 * ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.<BR>
	 *
	 * @exception	java.io.IOException	IOꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 * @exception	java.lang.IllegalStateException	ꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼꆼ.
	 */
	protected synchronized void openConnection() throws IOException {
		if (isConnected()) {
			throw new IllegalStateException("Already connected.");
		}
		String cmd = getPreConnectCommand();
		if (cmd != null) {
			debugOut("Execute preconnect command:" + cmd);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -